Original posting

https://gist.github.com/bramtechs/50d724a33d37278d7ca003c6119c8fea

 

Upgrade Debian 9, (current WSL) to Debian 12 (bookworm testing)

Upgrade Debian 9, (current WSL) to Debian 12 (bookworm testing) - upgrade-debian-wsl.md

gist.github.com

 

Just copying contenst for backup. 

  1. Install and open Debian on WSL (if not already)
wsl --install -d debian
wsl -d debian
  1. Go into root
sudo -s
  1. Upgrade Debian 9 to 10
apt update -y && \
apt upgrade -y && \
echo "deb http://deb.debian.org/debian/ buster main
deb http://deb.debian.org/debian/ buster-updates main
deb http://security.debian.org/debian-security buster/updates main" > /etc/apt/sources.list && \
apt update -y && \
apt upgrade -y && \
apt dist-upgrade -y
  1. Upgrade Debian 10 to 11
echo "deb http://deb.debian.org/debian/ bullseye main
deb http://deb.debian.org/debian/ bullseye-updates main" > /etc/apt/sources.list && \
apt update -y && \
apt upgrade -y && \
apt dist-upgrade -y
  1. Debian 11 to 12
echo "deb http://deb.debian.org/debian/ bookworm main
deb http://deb.debian.org/debian/ bookworm-updates main" > /etc/apt/sources.list && \
apt update -y && \
apt upgrade -y && \
apt dist-upgrade -y && \
apt autoremove -y && \
exit

helm 을 설치하기 위해서는 일반적으로 msi 라던지 설치 패키지를 다운받아서 설치할 수 없습니다. 

helm 의 공식 안내페이지(https://helm.sh/docs/intro/install/) 에서는 choco 패키지 관리자나 scoop 패키지 관리자를 이용하여 설치하라고 설명합니다. 

 

choco 는 Chocolatey 라는 패키지 관리 소프트웨어입니다. 이것 또한 설치 방법(https://docs.chocolatey.org/en-us/choco/setup)이 일반적이지 않는데, 파워쉘 스크립트를 이용해야합니다. 하지만 파워쉘 스크립트가 중간에 오류가 나서 제대로 설치가 되지 않고, 익숙하지 않아 msi 버전(https://github.com/chocolatey/choco/releases)으로 설치하였습니다. 

 

choco 를 설치한뒤에는 간단하게 아래 명령어로 설치가 가능합니다. 

choco install kubernetes-helm

 

 

 

 

 

C:\Users\test>choco install kubernetes-helm
Chocolatey v2.2.2
Chocolatey detected you are not running from an elevated command shell
 (cmd/powershell).
 ....
 ....
 Extracting C:\Users\hgchoi\AppData\Local\Temp\chocolatey\kubernetes-helm\3.13.1\helm-v3.13.1-windows-amd64.zip to C:\ProgramData\chocolatey\lib\kubernetes-helm\tools...
C:\ProgramData\chocolatey\lib\kubernetes-helm\tools
 ShimGen has successfully created a shim for helm.exe
 The install of kubernetes-helm was successful.
  Software installed to 'C:\ProgramData\chocolatey\lib\kubernetes-helm\tools'

Chocolatey installed 1/1 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

C:\Users\test>helm
The Kubernetes package manager

Common actions for Helm:

- helm search:    search for charts
- helm pull:      download a chart to your local directory to view
- helm install:   upload the chart to Kubernetes
- helm list:      list releases of charts
....
....
Use "helm [command] --help" for more information about a command.

C:\Users\test>

...

update-alternatives --install /usr/bin/python python /usr/local/bin/python3.9 10

Ref : https://www.vultr.com/docs/update-python3-on-debian/

 

Update Python 3 on Debian

We are simplifying the cloud. One Login, 16 Countries, 25 Cities, Infinite Possibilities.

www.vultr.com

Ref : https://exitcode0.net/debian-9-how-to-upgrade-python-3-5-to-python-3-7/

 

Debian 9 - How to upgrade python 3.5 to python 3.7

I recently spent 30 minutes figuring out how to upgrade to python 3.7 and subsequently pip version on a fresh install of Debian 9. I ran into a number of issues doing this so I though that I would put this quick post together to make this a little

exitcode0.net

 

기존에 설치된 파이썬의 버전을 리눅스에서 업그레이드 하려면 소스를 받은뒤에 빌드를 해야합니다. 빌드를 하고 설치를 한뒤에 기존 파이썬 명령어를 새 버전으로 바꾸는 작업을 하게 됩니다. 아래 순서대로 진행하면 문제 없이 

 

1. 버전 체크

python3 -V

 

2. 필수 라이브러리 설치

apt-get install wget build-essential libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev liblzma-dev -y

 

3. 소스 다운로드

wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz

 

4. 적당한위치에 소스 압축파일 풀기

tar xzf Python-3.9.12.tgz

 

5. 압축 해제한 곳에 들어가서 빌드하고 설치하기(빌드 후 설치할때 root 권한 필요)

cd ./Python-3.9.12 
./configure
make
sudo make install

 

6. 기존 명령어를 설치한 버전으로 교체하기(root 권한 필요)

 

sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.9 10

1. nslookup 으로 조회

nslookup

set q=MX

mxdomainname.name

 

2. 웹사이트에서 조회

http://check.mx/mx/

 

뭔가 신박하고 복잡한 과정이 있는줄 알았다.


하지만 그냥 ISO 를 설치하면 된다. 


6.5 에서 6.7 방법

https://www.youtube.com/watch?v=lZGGTVy9BW8


이걸 참고삼아 설치를 하는데 N54L 은 HPE Custom Image 를 받아서 진행한다. 

6.5까지만 AMD Turion II CPU 를 지원하고 6.7 부터는 각자 알아서 잘 업글 한다는데 거기까진 시간과 노력이 부족하다.



https://www.hpe.com/us/en/servers/hpe-esxi.html


에서 클릭해서 보이지 않으면 제품 검색에 "OEM-ESXI65U2-HPE" 를 입력한다.

https://my.vmware.com/group/vmware/details?downloadGroup=OEM-ESXI65U2-HPE&productId=614


HPE Custom Image for VMware ESXi 6.5 U2 Install CD
실제 파일이름 : VMware-ESXi-6.5.0-Update2-9298722-HPE-Gen9plus-650.U2.10.3.5.5-Sep2018.iso

1. ESXi-6.0.0-20151104001-standard-customized.iso  를 구한다.


2. rufus-3.3p.exe 으로 이미지를 usb 에 복사한다.

2.1 PowerISO 이런걸로 복사했다가 개피봄. 부팅안됨


3. n54l 의 앞 패널쪽 usb 에 꼽는다.

3.1 부팅이 안되면 usb 를 8기가 이하 추천. 16기가에서 성공함. 

3.2 그래도 안되면 usb 를 FAT32 으로 포맷함. 1 단계를 통해서 iso 를 바로 usb 로 구우면 문제 없음.

3.3 그래도 안되면 usb 를 n54l 앞쪽 패널을 열어서 메인보드에 있는 usb 단자에 꼽는다.

3.4 그래도 안되면 https://ubuntuforums.org/showthread.php?t=2282713  참고한다. (별로 도움 안됨)


4. 부팅을 할때 F10 으로 부팅 순서를 체크한다.

4.1 F12 인 네트워크 머시기로 부팅하면 개피봄. 부팅안됨. 

4.2 USB 가 인식이 잘 되었는지 F10 바이오스 세팅 화면에서 USB 관련 세팅을 찾아가면 USB 이름이 보임.


5. 부팅한다. 자동으로 usb 를 인식하여 esxi 설치 화면이 나온다. 


6. 설치 단계를 거치고 난 뒤에 화면에 시스템의 IP 가 표시된다.

6.1 당연히 LAN Cable 을 연결해야하고, DHCP 에 의해서 아이피를 할당받게 된다.


7. http://할당된IP/ 으로 접속하면 vsphere client 를 다운로드 받을 수 있다.

7.1 vmware 홈페이지에서 직접 다운받아도 된다. 6.0 update 3 을 받아도 접속할 수 있지만 약간의 호환성 문제가 있는것 같다. 




1. 지울 이메일을 잘 선정한다. 검색란에 정확하게 기입해서 검색한다.

2. 50개 혹은 100개의 이메일이 나타나는데 왼쪽 전체 선택 체크박스를 누르면 전체 선택이 된다.

3. 이 상태로 지우면 50개 혹은 100개 단위로 삭제할 수 있지만 "검색어와 일치하는 모든대화 선택" 옵션을 선택하면 모두 삭제가 가능하다.


USB로 윈도우 이외의 OS를 설치하다 보면 USB 인식후 접근이 안될때가 있습니다.

접근이 되더라도 용량이 매우 적은 경우가 있는데요.

그럴땐 USB를 초기화해서 사용합니다.


보통은 시작 -> 컴퓨터 관리 -> 디스크관리 에서 파티션을 삭제하게 되는데요.

그런데 간혹 파티션 삭제가 안될때가 있습니다.

그때는 강제로 파티션을 삭제해야하는데 각종 툴들이 있지만 윈도우 기본 툴인 diskpart 를 이용하면 간단하게 삭제가 됩니다.


1. 명령어창을 열어야 하는데 반드시 관리자 권한으로 실행합니다.

2. diskpart 를 명령줄에 입력하고 실행하면 diskpart 가 실행됩니다.

3. list disk 명령으로 물리 디스크 목록을 살펴봅니다.

4. select disk ? 으로 목표로 하는 물리디스크(USB)를 선택합니다.

5. list partition 명령으로 디스크에 등록된 파티션 목록을 살펴봅니다.

6. select partition ? 으로 삭제할 파티션을 선택합니다.

7. delete partition 으로 파티션을 삭제합니다.

5 ~ 7 을 반복해서 모든 파틴션을 삭제합니다.

8. create partition primary 으로 기본 파티션을 생성합니다.

9. exit 명령어로 diskpart 를 종료합니다.

10. 시작 -> 컴퓨터 관리 -> 디스크관리 에서 파티션을 포맷합니다.














1. uncompyle2-master 를 적절한 곳에 위치시킴

2. pythone.exe setup.py install 명령 실행.

3. python.exe ./Script/uncompyle2 ????.pyc > ????.py

팀 동생이 공유해준 링크인데 개념정리에 도움이 많이 됩니다.


http://www.pgpi.org/doc/pgpintro/

그림만 따왔습니다.



Figure 1-2. Conventional encryption



Figure 1-3. Public key encryption




Figure 1-4. How PGP encryption works




Figure 1-5. How PGP decryption works





Figure 1-6. Simple digital signatures




Figure 1-7. Secure digital signatures




Figure 1-8. Anatomy of a PGP certificate




Figure 1-9. A PGP certificate





Figure 1-10. An X.509 certificate




Figure 1-12. Hierarchical trust







홈서버의 비밀번호를 변경하고 까먹었습니다. 집에가서 아래 방법으로 고쳐보고 안되면 지우겠습니다.  


http://www.kieranlane.com/2013/09/18/resetting-administrator-password-windows-2012/


  • Boot from the Micrsoft Windows Server 2012 DVD
  • From the Windows Setup menu, click “Next”.
  • Select “Repair your computer”
  • Under Choose and option, click on “Troubleshoot”.
  • Under Advanced options, click “Command Prompt”.
  • At the command prompt, run the following commands:
    d:
    cd windows\system32
    ren Utilman.exe Utilman.exe.old
    copy cmd.exe Utilman.exe
  • Close the command prompt and then click “Continue”.
  • The server should now boot and present the logon screen. Here click Windows Key + U.
  • At the prompt you can now change the password, by typing the following command:
    net user administrator Password123
    This will set the password for the Administrator user to be Password123 (case sensitive).

After that repeat above for cleanup. 

for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"



  1. Start the guest PC, and then defragment the guest PC hard disk.
  2. Obtain and then install a third-party data removal utility on the guest PC operating system.
  3. Run the third-party utility in the guest PC, and then configure it to zero out unused disk space. Use sdelete
  4. When this operation is complete, shut down the guest PC. 

    If you use "undoable" virtual hard disk images, commit the changes to the virtual hard disks.
  5. In Virtual PC, click Virtual Disk Wizard on the File menu.
  6. Click Next, click Examine or modify existing disk image, and then click Next.
  7. Click Browse, locate and then click the virtual hard disk image that you want to compact, click Open, and then click Next.
  8. Click Compact the disk image, and then click Next.
  9. Use one of the following methods to create a compacted disk image:
    • Click Use original file

      When you use this method, the virtual hard disk image is compacted to the same file as the original virtual hard disk image. This method uses less disk space on the host computer. However, if the virtual hard disk file becomes corrupted during the compaction process, you may lose guest PC data.
    • Click Select new file, click Browse, type a new file name for this virtual hard disk image, and then click Save.

      When you use this method, a new image file is created for the compacted virtual hard disk image. Because the original file is not overwritten during the compaction process, Microsoft recommends that you use this method. When you use this method, you can verify the integrity of the guest PC virtual hard disk before you have to remove the original virtual hard disk image.
  10. Click Next, and then click Finish.

    The virtual hard disk is compacted.
  11. On the message that states that the hard disk was compacted successfully, click Close.

The third-party products that this article discusses are manufactured by companies that are independent of Microsoft. Microsoft makes no warranty, implied or otherwise, regarding the performance or reliability of these products.



VitualBox 에서 용량줄이기.


1~4번까지 그대로 수행

오라클설치폴더\VBoxManage modyfyhd Win.vdi --compact


끝!


site:combatarms.nexon.net inurl:test

services.msc -> Shell Hardware Detection -> 사용안함

gpedit.msc -> Computer Configuration -> Administrative Template -> Windows Components -> AutoPlay Policies -> Turn Off Autoplay 실행 -> Enable 설정 -> 모든드라이브


defaults write -globalDomain com.apple.mouse.scaling -float 4.0 콘솔 띄워서 위 명령어를 입력한다. 마지막 수치가 높을 경우 속도가 빨라진다.
출처 : http://www.searchlores.org/protec/inbarraz.txt


                            Anti Debugging Tricks

                                     By:

                                  Inbar Raz

                 Assistance by Eden Shochat and Yossi Gottlieb

                               Release number 5

  Today's anti debugging tricks devide into two categories:

  1. Preventive actions;
  2. Self-modifying code.

  Most debugging tricks, as for today, are used within viruses, in order to
avoid dis-assembly of the virus, as it will be exampled later in this file.
Another large portion of anti debugging tricks is found with software
protection programs, that use them in order to make the cracking of the
protection harder.

1. Preventive actions:
----------------------

  Preventive actions are, basically, actions that the program takes in order
to make the user unable to dis-assemble the code or trace it while running.

1.1. Interrupt disable:

       Interrupt disable is probably the most common form of anti-debugging
     tricks. It can be done in several ways:

   1.1.1. Hardware masking of interrupt:

            In order to avoid tracing of a code, one usually disables the
          interrupt via the 8259 Interrupt Controller, addressed by read/write
          actions to port 21h. The 8259 Interrupt Controller controls the IRQ
          lines. This means that any IRQ between 0 and 7 may be disabled by
          this action. Bit 0 is IRQ0, bit 1 is IRQ1 etc. Since IRQ1 is the
          keyboard interrupt, you may disable the keyboard without the
          debugger being able to bypass it.

          Example:

          CS:0100 E421           IN     AL,21
          CS:0102 0C02           OR     AL,02
          CS:0104 E621           OUT    21,AL

            Just as a side notice, the keyboard may be also disabled by
          commanding the Programmable Peripheral Interface (PPI), port 61h.

          Example:

          CS:0100 E461           IN     AL,61
          CS:0102 0C80           OR     AL,80
          CS:0104 E661           OUT    61,AL

   1.1.2. Software masking of interrupt:

            This is quite an easy form of an anti-debugging trick. All you
          have to do is simply replace the vectors of interrupts debuggers
          use, or any other interrupt you will not be using or expecting to
          occur. Do not forget to restore the original vectors when you are
          finished. It is adviseable to use manual change of vector, as shown
          below, rather than to change it using interrupt 21h service 25h,
          because any debugger that has gained control of interrupt 21h may
          replace your vector with the debugger's. The example shows an
          interception of interrupt 03h - the breakpoint interrupt.

          Example:

          CS:0100 EB04           JMP    0106
          CS:0102 0000           ADD    [BX+SI],AL
          CS:0104 0000           ADD    [BX+SI],AL
          CS:0106 31C0           XOR    AX,AX
          CS:0108 8EC0           MOV    ES,AX
          CS:010A 268B1E0C00     MOV    BX,ES:[000C]
          CS:010F 891E0201       MOV    [0102],BX
          CS:0113 268B1E0E00     MOV    BX,ES:[000E]
          CS:0118 891E0401       MOV    [0104],BX
          CS:011C 26C7064C000000 MOV    Word Ptr ES:[000C],0000
          CS:0123 26C7064E000000 MOV    Word Ptr ES:[000E],0000

   1.1.3. Vector manipulation

             This method involves manipulations of the interrupt vectors,
          mainly for proper activation of the algorithm. Such action, as
          exampled, may be used to decrypt a code (see also 2.1), using data
          stored ON the vectors. Ofcourse, during normal operation of the
          program, vectors 01h and 03h are not used, so unless you are trying
          to debug such a program, it works fine.

          Example:

          CS:0100 31C0           XOR    AX,AX
          CS:0102 8ED0           MOV    SS,AX
          CS:0104 BC0E00         MOV    SP,000E
          CS:0107 2E8B0E3412     MOV    CX,CS:[1234]
          CS:010C 50             PUSH   AX
          CS:010D 31C8           XOR    AX,CX
          CS:010F 21C5           AND    BP,AX
          CS:0111 58             POP    AX
          CS:0112 E2F8           LOOP   010C

   1.1.4. Interrupt replacement

            This is a really nasty trick, and it should be used ONLY if you
          are ABSOLUTELY sure that your programs needs no more debugging. What
          you should do is copy the vectors of some interrupts you will be
          using, say 16h and 21h, onto the vectors of interrupt 01h and 03h,
          that do not occur during normal operation of the program. If the
          user wants to debug the program, he would have to search for every
          occurance of INT 01, and replace it with the appropriate INT
          instruction. This trick is very effective if used together with the
          fact that the INT 3 intruction has a ONE BYTE opcode - 0CCh, which
          can not be changed to any other interrupt.

          Example:

          CS:0100 FA             CLI
          CS:0101 31C0           XOR    AX,AX
          CS:0103 8EC0           MOV    ES,AX
          CS:0105 26A18400       MOV    AX,ES:[0084]
          CS:0109 26A30400       MOV    ES:[0004],AX
          CS:010D 26A18600       MOV    AX,ES:[0086]
          CS:0111 26A30600       MOV    ES:[0006],AX
          CS:0115 B44C           MOV    AH,4C
          CS:0117 CD01           INT    01               

1.2. Time watch:

       This may be a less common method, but it is usefull against debuggers
     that disable all interrupts except for the time that the program is
     executed, such as Borland's Turbo Debugger. This method simply retains
     the value of the clock counter, updated by interrupt 08h, and waits in an
     infinite loop until the value changes. Another example is when you mask
     the timer interrupt by ORing the value INed from port 21h with 01h and
     then OUTing it back, thus disabling the IRQ0 - Timer interrupt. Note that
     this method is usefull only against RUN actions, not TRACE/PROCEED ones.

     Example:

     CS:0100 2BC0           SUB    AX,AX
     CS:0102 FB             STI
     CS:0103 8ED8           MOV    DS,AX
     CS:0105 8A266C04       MOV    AH,[046C]
     CS:0109 A06C04         MOV    AL,[046C]
     CS:010C 3AC4           CMP    AL,AH
     CS:010E 74F9           JZ     0109

1.3. Fool the debugger:

       This is a very nice technique, that works especially and only on those
     who use Turbo Debugger or its kind. What you should do is init a jump to
     a middle of an instruction, whereas the real address actually contains
     another opcode. If you work with a normal step debugger such as Debug or
     SymDeb, it won't work since the debugger jumps to the exact address of
     the jump, and not to the beginning of an instruction at the closest
     address, like Turbo Debugger.

     Example:

     CS:0100 E421           IN     AL,21
     CS:0102 B0FF           MOV    AL,FF
     CS:0104 EB02           JMP    0108
     CS:0106 C606E62100     MOV    Byte Ptr [21E6],00
     CS:010B CD20           INT    20

     Watch this:

     CS:0108 E621           OUT    21,AL

     Notice:

       This trick does NOT effect the run of the program in ANY debugger. Its
     only use is to try to deceive the user into thinking another opcode is
     used, while another is actually run.

1.4. Check CPU Flags:

       This is a nice trick, effective against almost any real mode debugger.
     What you should do is simply set the trace flag off somewhere in your
     program, and check for it later. If it was turned on, a debugger runs in
     the background...

     Example:

     CS:0100 9C             PUSHF
     CS:0101 58             POP    AX
     CS:0102 25FFFE         AND    AX,FEFF
     CS:0105 50             PUSH   AX
     CS:0106 9D             POPF

     In the middle of the program:

     CS:1523 9C             PUSHF
     CS:1524 58             POP    AX
     CS:1525 250001         AND    AX,0100
     CS:1528 7402           JZ     152C
     CS:152A CD20           INT    20

1.5. Cause debugger to stop execution:

       This is a technique that causes a debugger to stop the execution of a
     certain program. What you need to do is to put some INT 3 instructions
     over the code, at random places, and any debugger trying to run will stop
     there. It is best if used within a loop, as it is run several times.

     Example:

     CS:0100 B96402         MOV    CX,0264
     CS:0103 BE1001         MOV    SI,0110
     CS:0106 AC             LODSB
     CS:0107 CC             INT    3
     CS:0108 98             CBW
     CS:0109 01C3           ADD    BX,AX
     CS:010B E2F9           LOOP   0106

1.6. Halt computer using stack:

       This trick is based on the fact that debuggers don't usually use a
     stack space of their own, but rather the user program's stack space. By
     setting the stack to a location in the middle of a code that does NOT use
     the stack itself, any debugger that will try to trace the code will
     overwrite some of the code by its own stack (mainly interrupt return
     addresses). Again, CLI and STI are in order, and are not shown for the
     purpose of the example only. They must be included, or you risk hanging
     your computer wether a debugger is installed or not.

     Example:

     CS:0100 8CD0           MOV    AX,SS
     CS:0102 89E3           MOV    BX,SP
     CS:0104 0E             PUSH   CS
     CS:0105 17             POP    SS
     CS:0106 BC0B01         MOV    SP,010B
     CS:0109 90             NOP
     CS:010A 90             NOP
     CS:010B EB02           JMP    010F
     CS:010D 90             NOP
     CS:010E 90             NOP
     CS:010F 89DC           MOV    SP,BX
     CS:0111 8ED0           MOV    SS,AX

1.7. Halt TD386 V8086 mode:

       This is a nice way to fool Turbo Debugger's V8086 module (TD386). It is
     based on the fact that TD386 does not use INT 00h to detect division by
     zero (or register overrun after division, which is treated by the
     processor in the same way as in the case of division by zero). When TD386
     detects a division fault, it aborts, reporting about the faulty division.
     In real mode (even under a regular debugger), a faulty DIV instruction
     will cause INT 00h to be called. Therefore, pointing INT 00h to the next
     instruction, will recover from the faulty DIV.

     Note: It is very important to restore INT 00h's vector. Otherwise, the
     next call to INT 00h will cause the machine to hang.

     Example:

     CS:0100 31C0          XOR     AX,AX
     CS:0102 8ED8          MOV     DS,AX
     CS:0104 C70600001201  MOV     WORD PTR [0000],0112
     CS:010A 8C0E0200      MOV     [0002],CS
     CS:010E B400          MOV     AH,00
     CS:0110 F6F4          DIV     AH
     CS:0112 B8004C        MOV     AX,4C00
     CS:0115 CD21          INT     21

1.8. Halt any V8086 process:

       Another way of messing TD386 is fooling it into an exception.
     Unfortunately, this exception will also be generated under any other
     program, running at V8086 mode. The exception is exception #13, and its
     issued interrupt is INT 0Dh - 13d. The idea is very similar to the
     divide by zero trick: Causing an exception, when the exception interrupt
     points to somewhere in the program's code. It will always work when the
     machine is running in real mode, but never under the V8086 mode.

     Note: It is very important to restore the original interrupt vectors.
     Otherwise, the next exception will hang the machine.

     Example:

     CS:0100 31C0          XOR     AX,AX
     CS:0102 8ED8          MOV     DS,AX
     CS:0104 C70634001301  MOV     WORD PTR [0034],0113
     CS:010A 8C0E3600      MOV     [0036],CS
     CS:010E 833EFFFF00    CMP     WORD PTR [FFFF],+00
     CS:0113 B8004C        MOV     AX,4C00
     CS:0116 CD21          INT     21

2. Self-modifying code:
-----------------------

2.1. Encryptive/decryptive algorithm:

       The first category is simply a code, that has been encrypted, and has
     been added a decryption routine. The trick here is that when a debugger
     sets up a breakpoint, it simply places the opcode CCh (INT 03h) in the
     desired address, and once that interrupt is executed, the debugger
     regains control of things. If you try to set a breakpoint AFTER the
     decryption algorithm, what is usually needed, you will end up putting an
     opcode CCh in a place where decryptive actions are taken, therefore losing
     your original CCh in favour of whatever the decryption algorithm produces.
     The following example was extracted from the Haifa virus. If you try to
     set a breakpoint at address CS:0110, you will never reach that address,
     since there is no way to know what will result from the change. Note that
     if you want to make the tracing even harder, you should start the
     decryption of the code from its END, so it takes the whole operation
     until the opcode following the decryption routine is decrypted.

     Example:

     CS:0100 BB7109         MOV    BX,0971
     CS:0103 BE1001         MOV    DI,0110
     CS:0106 91             XCHG   AX,CX
     CS:0107 91             XCHG   AX,CX
     CS:0108 2E803597       XOR    Byte Ptr CS:[DI],97
     CS:010C 47             INC    DI
     CS:010D 4B             DEC    BX
     CS:010E 75F6           JNZ    0106
     CS:0110 07             POP    ES
     CS:0111 07             POP    ES

2.2. Self-modifying code:

   2.2.1. Simple self-modification:

            This method implements the same principle as the encryption
          method: Change the opcode before using it. In the following example,
          we change the insruction following the call, and therefore, if you
          try to trace the entire call ('P'/Debug or F8/Turbo Debugger), you
          will not succeed, since the debugger will put its CCh on offset 103h,
          but when the routine runs, it overwrites location 103h.

          Example:

          CS:0100 E80400         CALL   0107
          CS:0103 CD20           INT    20
          CS:0105 CD21           INT    21
          CS:0107 C7060301B44C   MOV    Word Ptr [0103],4CB4
          CS:010D C3             RET

          Watch this:

          CS:0103 B44C           MOV    AH,4C

   2.2.2. The Running Line (self-decrypting):

            This is an example of a self-tracing self-modifying code,
          sometimes called 'The running line'. It was presented by Serge
          Pachkovsky. It is a bit tricky in implementation, but, unlike
          all other techiniques mentioned in this document, it is relatively
          resistive to various protections of the vector table. In short, it
          results in instructions being decoded one at time, thus never
          exposing long code fragments to analisys. I will illustrate it
          with the following (over-simplified) code example:

          XOR     AX, AX
          MOV     ES, AX
          MOV     WORD PTR ES:[4*1+0],OFFSET TRACER
          MOV     WORD PTR ES:[4*1+2],CS
          MOV     BP, SP
          PUSHF
          XOR     BYTE PTR [BP-1], 1
          POPF
          MOV     AX, 4C00H               ; This will not be traced!
          DB      3 DUP ( 98H )
          DB      C5H, 21H

   TRACER:

          PUSH    BP
          MOV     BP, SP
          MOV     BP, WORD PTR [BP+2]
          XOR     BYTE PTR CS:[BP-1], 8
          XOR     BYTE PTR CS:[BP+0], 8
          POP     BP
          IRET

===============================================================================

Comments:

In order to save lines of code, I did not insert the CLI/STI pair before any
vector change. However, it is adviseable to do this pair before ANY manual
vector change, because if any interrupt occurs in the middle of your
operations, the machine could hang.

An apology:

In previous releases of this article, a false example, as noted by Serge
Pachkovksy, was posted. That was 2.2.2 - Manipulating the PIQ. Apperantly
the posted source would not work under any circumstances. In return, Serge has
presented the 'Running Line' technique.
네트워크 IP 를 변경한다던지 연결 상태를 확인한다던지 할때마다 

바탕화면 -> 내 네트워크환경 -> 마우스 우클릭 -> 속성 

혹은

제어판 ->  네트워크 연결

으로 찾아갔는데 종종 일부 몰지각한 PC방에서는 이 모든 시도를 원천봉쇄를 해놓았습니다.

그럼 명령어를 사용하는 수 밖에 없죠.

네트워크 환경 속성창 열기

시작 -> 실행
ncpa.cpl

블로그에 정말 가끔씩 소스코드를 올릴때가 있습니다.

그때마다 빌드툴에서 긁어붙이기를 하면 지저분해서 속이 상하는데요..

바로 이렇게 됩니다. 그냥 긁어붙일경우...  아주 너저분합니다.

 void CXButtonXPTestDlg::OnButton2()
{
 TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));

 UpdateData(TRUE);

 CString str = _T("");
 m_edtCount2.GetWindowText(str);
 int nCount = _ttoi(str);
 if (nCount < 0)
  nCount = 0;
 nCount++;
 str.Format(_T("%d"), nCount);
 m_edtCount2.SetWindowText(str);

 BOOL bToggled = m_XButtonXP.GetToggleState();
 TRACE(_T("toggle state=%d\n"), bToggled);

 if (m_bMessageBox)
  AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
}


이런 너저분함을 없애기 위해서 몇군데 찾아봤습니다.

첫번째로 http://codepad.org/  입니다. 사이트상에는 글자에 색깔도 이쁘게 입혀지는데 긁어붙이니 그렇지 않네요.

 
void CXButtonXPTestDlg::OnButton2() 
{
	TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));

	UpdateData(TRUE);

	CString str = _T("");
	m_edtCount2.GetWindowText(str);
	int nCount = _ttoi(str);
	if (nCount < 0)
		nCount = 0;
	nCount++;
	str.Format(_T("%d"), nCount);
	m_edtCount2.SetWindowText(str);

	BOOL bToggled = m_XButtonXP.GetToggleState();
	TRACE(_T("toggle state=%d\n"), bToggled);

	if (m_bMessageBox)
		AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
}



그리고 두번째로

http://code.google.com/p/syntaxhighlighter/

그런데 쓰기가 좀 불편합니다. 직접 태그를 입력하면 자바스크립트가 알아서 변경시켜주는거죠.

샘플 화면입니다. <== 샘플 화면을 지우고 직접 티스토리 스타일시트를 지정해보았습니다.
http://gyuha.tistory.com/193  <== 세팅법 참고.
 

(티스토리의 스킨을 수정할 경우 소스를 올릴때마다 자동으로 적용되므로 어쩌면 편할 수도 있습니다.



세번째 입니다. 첫번째 처럼 긁어붙이기가 되므로 쓰기 편하네요. 색깔도 예쁘게 잘 나옵니다.
http://quickhighlighter.com/
 
  1. void CXButtonXPTestDlg::OnButton2()
  2. {
  3.     TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));
  4.  
  5.     UpdateData(TRUE);
  6.  
  7.     CString str = _T("");
  8.     m_edtCount2.GetWindowText(str);
  9.     int nCount = _ttoi(str);
  10.     if (nCount < 0)
  11.         nCount = 0;
  12.     nCount++;
  13.     str.Format(_T("%d"), nCount);
  14.     m_edtCount2.SetWindowText(str);
  15.  
  16.     BOOL bToggled = m_XButtonXP.GetToggleState();
  17.     TRACE(_T("toggle state=%d\n"), bToggled);
  18.  
  19.     if (m_bMessageBox)
  20.         AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
  21. }


마지막으로 http://www.chamisplace.com/colorizer/cc.asp 

이 사이트는 괄호가 인상적이네요. 큼지막 합니다.

 1: void CXButtonXPTestDlg::OnButton2()
2: //=============================================================================
3:
{
4: TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));
5:
6: UpdateData(TRUE);
7:
8: CString str = _T("");
9: m_edtCount2.GetWindowText(str);
10: int nCount = _ttoi(str);
11: if (nCount < 0)
12: nCount = 0;
13: nCount++;
14: str.Format(_T("%d"), nCount);
15: m_edtCount2.SetWindowText(str);
16:
17: BOOL bToggled = m_XButtonXP.GetToggleState();
18: TRACE(_T("toggle state=%d\n"), bToggled);
19:
20: if (m_bMessageBox)
21: AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
22: }



각각 장단점이 있습니다. 취향에 맞게 선택하시면 되겠네요.
출처 : http://blog.naver.com/blackpet?Redirect=Log&logNo=100004104020

요기서 확인하면 자세한 설명이 있음.

저 사이트 없어질까봐 간략정리함.

친구와 함께 사용하는 Repository 를 옮길일이 발생했다.

원래는 내 피시에서 세팅해서 사용했지만 요즘 이사문제로 잠시 다른집에 얹혀 사는 입장에서

서버까지 돌려놓을수 없어서 친구에게 옮기기로 결정했고 단순히 Repository 폴더를 통째로 압축해서 보내줬다.

예전에 CVS 를 그렇게 옮겨 보았고 SVN 도 별다르게 틀리지 않을거라는 예상에.....

하지만 친구로부터 온 문자 때문에 이번에는 SVN 의 Repository 백업과 복구에 대해서 알아보았다.

SVN 의 Repository 의 백업은 여러가지가 있는것 같다.

그냥 무식하게 폴더를 통째로 백업(hardcopy) 해 놓는 방법도 그중에 하나이긴하지만 백업하는 타이밍에 데이터가 수정될 경우 문제가 발생하므로 서버를 내려놓고 백업을 하던가 다음 명령어로 백업을 할 수 있다.

svnadmin hotcopy path/to/repository path/to/backup --clean-logs

뭐..이건 SVN help 를 통해서 찾은내용이고 웹에 떠도는 내용을 토대로 실제 백업과 복구를 해보았다.

svnadmin help 명령어를 사용하면 hotcopy 이외에 여러가지 명령어가 나오는데 그중에

dump 와 load 명령어를 사용하면 된다.

* dump
- 특정 프로젝트를 백업하는 명령어
- $ svnadmin help dump
┌────────────────────────────────────────
│ dump: 사용법: svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]
│ 파일 시스템의 내용을 stdout 으로 포터블한 형식의 'dumpfile'로 적재하며,
│ stderr로 피드백을 보냅니다. 리비젼 LOWER rev 부터 UPPER rev 까지
│ 적재합니다. 주어진 리비젼이 없다면, 모든 리비젼 트리를 적재합니다.
│ --incremental 옵션을 사용한다면, 모든 내용이 아닌 이전 버젼과의 차이만 적재됩니다.
│ 옵션:
│  -r [--revision] arg      : 리비젼 넘버 ARG ( 또는 X:Y 범위 )를 지정합니다
│  --incremental            : incremental 적재를 합니다.
│  --deltas                 : 적재된 결과물에 deltas를 사용합니다
│  -q [--quiet]             : stderr 에 대한 진행사항이 (오류에 한해서) 없습니다

└────────────────────────────────────────

* load
- 특정 프로젝트를 복구 하는 명령어
- $ svnadmin help load
┌────────────────────────────────────────
│ load: 사용법: svnadmin load REPOS_PATH
│ stdin 으로 'dumpfile' 형식의 스트림을 읽어들여, 새로운 리비젼을
│ 저장소의 파일시스템으로 커밋합니다. 이전에 저장소가
│ 비어있었다면, 기본적으로 그것의 UUID 가 스트림에 지정된
│ 한가지로 변경될것입니다. 진행 피드백은 stdout 으로 전송됩니다.
│ 옵션:
│   -q [--quiet]             : stderr 에 대한 진행사항이 (오류에 한해서) 없습니다
│   --ignore-uuid            : 스트림에 어떤 repos UUID가 발견되어도 무시합니다
│   --force-uuid             : 만약 있다면, repos UUID 를 스트림에서 발견된 것에 설정합니다,
│   --use-pre-commit-hook    : 리비전을 새로이 커밋하기 전 post-commit 훅을 호출합니다.
│   --use-post-commit-hook   : 리비전을 새로이 커밋한 뒤 post-commit 훅을 호출합니다.
│   --parent-dir arg         : 저장소의 지정된 디렉토리에 로드합니다

└────────────────────────────────────────

오늘 피시에 SVN 을 설치했습니다.

그동안 쭉 CVS 관련 기술서적만 독학으로 공부하다가 회사에서 SVN 을 사용해보고는 사용의 편리함 때문에 바꾸게 되었습니다.

SVN 은 사용은 편하지만 서버쪽 세팅은 매우 복잡합니다. (물론 CVS도 매우 복잡하죠)

하지만 한번만 세팅을 해놓으면 그 이후로는 별로 수정할 일이 없습니다.

그러나.... 그 한번 세팅해놓은걸 계속 기억하고 있는것은 아니죠..

그래서 설치했던 순서대로 남겨두려고 합니다.

1. svn 서버를 다운로드 받습니다.

http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91

이 주소에서
"Windows installer with the basic win32 binaries"  버전을 다운로드 받습니다.
여러가지 버전이 많은데 다른 버전을 받으면 왠지 세팅할것이 매우 많을 것 같다는 생각이 들거든요. SVN 서버를 전문적으로 관리 하실분들은 다른 버전을 다운 받으셔도 무방합니다.

2. 다운 받은 파일을 "다음" 버튼이 사라지고 "마침" 버튼이 나올때까지 눌러서 설치합니다. (대부분의 MS Windows 응용프로그램은 이렇게 설치하죠. -_-)

3. 설치를 했으면 Repository 를 세팅해야합니다. Repository 는 영문을 그대로 번역하자면 저장소 라고 하는데 앞으로 사용할 프로젝트를 넣어두는 폴더 라고 생각하시면 됩니다. 만드는 방법은 간단합니다. 그냥 폴더를 하나 만드시면 끝납니다. -0-
d:\>mkdir svn_repo

4. 서버를 실행시켜야 합니다. 서버를 실행시키는 방법도 매우~!!! 간단합니다.
svnserve -d -r [저장소경로] 라고 입력만 하면 SVN 서버가 가동됩니다.
d:\>svnserve -d -r d:/svn_repo
|:\>svnserve -d -r d:/svn_repo

도스창(cmd.exe)에서 실행시켰다면 그 상태 그대로가 서버가 동작하는 상태입니다. 창을 꺼(Ctrl+C)버리면 서버는 종료됩니다.

↑↑↑↑↑↑↑↑↑↑↑↑↑ <== 서버 설치 끝!

초간단 서버 설치는 끝났습니다. 그럼 다음은 초간단 프로젝트 생성입니다.

이렇게 설치를 하고나면 아무짝에도 쓸모가 없습니다. 자신의 프로젝트를 직접 세팅해야 비로소 제대로된 SVN 서버세팅이라고 할 수 있습니다.

1. 설치해둔 Repository 경로로 이동한 후 다음 명령어로 프로젝트를 초기화 합니다.
d:\>cd svn_repo
d:\svn_repo>
d:\svn_repo>svnadmin create --fs-type fsfs svntestprj
위 명령어는 svntestprj 라는 이름으로 파일시스템 타입이 DB 를 생성하는 명령어 입니다.
만일 버클리 타입의 DB를 생성하려면 다음과 같이 생성해야합니다.
d:\svn_repo>svnadmin create --fs-type bdb svntestprj
버클리? 파일시스템 DB? 둘의 차이점은 도움말을 참고하세요.

↑↑↑↑↑↑↑↑↑↑↑↑↑ <== 프로젝트 생성 끝!

마지막으로 프로젝트 세팅까지 끝냈으면 서버 관리를 좀더 편하게 하는 툴을 사용하는것을 권장 합니다.
매번 PC를 켜서 로그인 후에 커맨드창을 열어서 서버 실행 명령어를 치는것은 여간 귀찮은 작업이 아닙니다.

이러한 귀찮은 작업을 손쉽게 처리해주는 툴을 PYRASIS 라는 분께서 제작하여 공개하고 있습니다.
http://www.pyrasis.com/main/SVNSERVEManager

매우 편리하므로 꼭! 설치하셔서 서비스모드로 서버를 실행시키세요. PC의 전원버튼을 누르는것 만으로 SVN 서버는 잘 동작할 것입니다.

이상 SVN 서버 초간단 설치방법을 끝내겠습니다.

SVN 의 복잡한 세팅(권한 문제, 접속방법 등등 여러가지) 는 다음을 참고하세요.

1. 그림과 함께하는 설치방법(저보다 더 설명 잘해놓았다는)

[각종 세팅방법]



사용자 삽입 이미지

게임가드 에러전송 시스템을 구상하고 있는 도중에 발견한 WoW 에러 전송화면.

어떤 소프트웨어이든 에러는 발생할 수 있습니다.

100% 완벽한 소프트웨어는 존재 하지 않으니까요.

누구나 실수는 합니다. 가장 이상적인것은 그 실수를 하지 않는 것이지만 현실적으로 불가능 합니다.

다만 그 실수를 최대한 빠르게 수습하는 차선책으로 보완을 한다면 100% 는 아니지만 99.999% 의 완벽한 소프트웨어가 될 수 있습니다.

에러를 수집할 수 있는 시스템은 그래서 필수라고 생각되네요.

소프트웨어를 사용하는 사람들이 참여하는 완벽한 제품 만들기...

보다 유저 친화적인 에러 전송화면과 정확한 보고내용을 가진 에러수집 시스템은 수많은 QA팀 인원을 확충하는 가장 효율적일 것입니다.
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1279597-1";
urchinTracker();
</script>

스킨 최하단에 기입 ㄱㄱㄱ
여러 HTML 강좌를 필요에 따라 살펴본다.

내가 필요한 기능부분만 보고 다시 덮어버리는 그런 강좌를 말이다.

오늘 찾은 이 사이트는 이제껏 살펴본 강좌사이트중에 가장 내 맘에 든다.

http://www.hansigan.com/

만화로 그려진 알기쉬운 강좌들이 즐비하다.

내가 만일 만화를 그릴줄 안다면 정말 저런 강좌를 써서 올리고싶다.

윈도우를 사용하시던 분들은 탭이동을 할때 간단하게 Ctrl+Tab 으로 이동을 하게 된다.

탭 다음 이동 : Ctrl+Tab
탭 이전 이동 : Ctrl+Shift+Tab

하지만 이클립스에서는 이런 키를 눌렀을 때 그냥 상단의 도구모음 아이콘의 포커스만 변경된다.

이클립스에서는 위 키에 대한 대응이 다음과 같다.

탭 다음 이동 : Ctrl+Page Up ( Ctrl + F6 )
탭 이전 이동 : Ctrl+Page Down ( Ctrl + Shift + F6 )

이대로 쓰지 않고 원래 윈도우에 맞도록 변경시킬려면

[메뉴] Window -> Preferences -> General -> Keys 항목을 열어서

사용자 삽입 이미지

며칠간 골머릴 싸메게 하는 이슈사항이다.

왜 게임가드는 윈도우 2000 에서 경고메세지를 띄울까?  다음은 그것에 대한 힌트가 될것이다.

http://msdn.microsoft.com/msdnmag/issues/02/08/EscapefromDLLHell/

리버싱 내공이 워낙 미천하여 이 API 모음을 참고하지 않으면 정말 헤메게 된다.

더구나 이젠 기억력도 흐려서 외우기도 힘들고..

OllyDebug 를 이용한 리버싱시에 어디에서부터 시작해야할지 막막할 때가 많다. -_ㅡ;

매일 리버싱을 하면서 분석하는 분석팀이나 분석쟁이들과는 달리 나는 리버싱을 거의 하지 않는다. 게을러서.. -_-;

아마도 팀원중에서 최하위 레벨의 리버싱 실력일 것이다.

윈도우 2003 은 정말 쉣 같은 OS다.

온갖 보안세팅 때문에 내 시간을 좀먹는 버러지같은 서버다. ㅜㅜ

아 정말 시간 허비한것 생각하면. 젝11111

다음은 윈도우2003 에서 원격접속을 할 때 자신의 리소스를 공유하지 못하는경우에 대한 해결책이다.

+ Recent posts