어셈블리

[SoftIce] 초보를 위한 명령어 이해하기

RSMaster 2019. 7. 9. 15:20

소프트 아이스(SoftICE)란?



Nu-Mega에서 만든 세계 최고의 디버거 프로그램입니다. (웹사이트 http://www.NUMEGA.com)

현제 버젼 3.22까지 나왔고 이 버전은 Windows는 물론 NT와 Memphis까지 지원됩니다.

얻을 수 있는 곳은 기타 해커 동호회나 키텔의 개인 게시판 <>를 치면 됩니다.



-이 강좌는 3.22를 기준으로 설명을 합니다.-



1-1.  소프트 아이스의 기동



소프트 아이스(이하 소아)를 설치한 후 단축키(Ctrl + D)를 누르면 소아의

화면이 출력됩니다. 소아는 크게 네 개의 윈도로 구분이 되는데 가장 위에 있는

윈도를 레지스터 윈도우, 두번째의 윈도우를 데이터 윈도우, 어셈블리어가 출력된

부분이 코드/소스 윈도우, 그리고 맨 마지막에 위치한 윈도우를 명령 윈도라고

부릅니다.



기본적으로 코드/소스 윈도에는 현재의 코드 위치를 나타내는 반전된 막대 형태의

명령행 커서가 있고, 명령 윈도우에는 소아의 명령을 내려 디버깅 작업을 할 수 있도록

도스에서 사용되는 것과 같은 모양의 커서가 존재합니다. 너무 어렵나?? 쉽죠??

아직 시작도 아닌데 지치면 안 되죠? 프로그램을 디버깅하는 방법은 두 가지가 있어요

첫 번째는 프로그램을 실행한 후 트렌 싱하는 방법과 두 번째는 DLDR.EXE 또는 WLDR.EXE

로 로드해서 처음부터 트랜 싱하는 방법이 있습니다. 프로그램과 어떤 크랙을 해야 하는

지에 따라 두 가지로 분류가 됩니다.

1-2.  에러 메시지 처리방법

이런 것 까지 안 쓰려했는데 초보를 위해서... 저도 처음 할 때 이것 때문에 고생했죠.

그 맘을 제가 이해를 합니다. T.T



         ──────────────────────

        │                                                                   │

        │ Enhanced Windows 386 is already running     │

         ──────────────────────



흘... 이런.. 윈도를 WIN.COM으로 실행하지 마시고 WINICE.EXE로 실행을 하세요.

AUTOEXEC.BAT 파일에 C:\\SIW95\\WINICE.EXE를 추가하세요. 디렉터리를 자기 것에

맞게 하세요.(설마 이런 것까지 모르는 초보일라고...) 이건 옛날에 도스용 할 때

알았어요. 고생 좀 했죠. 메시지가 조금 틀리네요. 전에는

'Soft-ICE con not run with other 80386 control programs'라고 떴는데....

그렇게 알아 두시고..



          ──────────────────────────────

        │                                                                                             │

        │ This version of WINICE.EXE will only run on Windows 3.X          │

          ──────────────────────────────

이건 설명이 없어도 알겠죠. 소아 3.22는 윈도 95와 98/NT에서만 실행이 된답니다.

이런 것 초보라도 알겠죠?



         ───────────────

       │                                             │

       │ Win386 Soft-ICE/W Device      │

         ───────────────



정확하게는 모르겠지만 소아의 경로가 바르지 않다는 것 같내요.^^;

이 외의 메시지는 좀 치명적인 것 같네요.

1-3. 소아 명령어 일람표

많이 쓰는 것만 적을 께요. 배울 것이 많은데 머리 더 단단해진다고요..

아직 모든 명령어는 못써보았네요. 이해 못하겠기도 하고...^^

1) 브레이크 포인트 설정

브레이크 포인트.. 브레이크 포인트 줄여서 배포하고 쓰는 것입니다. 편의상.. 그리고

모든 사람이 다 알고 있어요. 어서어서 배워 두세요..

【BPM, BPMB, BPMW, BPMD】

BPM [B|W|D][size] address [R|W|RW|X] [qualifier] [value]

주어진 메모리의 엑서스 여부를 감지하기 위한 브포(앞에 설명이 있죠? 브레이크 포인트)

를 설정합니다. 메모리에 오게 되면 브레이크가 걸립니다. 피라미터 B, W, D는 각각

바이트 워드, 더블 워드를 나타냅니다. 멌는지 몰라요. 저도 잘.. 그냥 그렇게 알고 있죠.

다음에 R, W, RW, X는 읽기, 쓰기, 읽고 쓰기, 실행을 말합니다. 외우기는 쉬워요.

R은 Read고 W는 Write, RW는 Read and Write, X는.... 음.. 음.. 모르겠다..

하여간에 실행!!!!!!( 다음부터는 얼버무리는 말 안 해야지...)

EX>> bpm cs:1234 RW

;cs:1234번지에 메모리에서 읽기나 쓰기가 이루어지면 브레이크가 걸린다.

EX>> bpm cs:1234 X

;cs:1234번지에 읽거나 쓸 때는 상관없으나 그 위치의 주소가 실행되면 브레이크 발생

【BPINT】 BPINT interrupt-number [[AL|AH|AX]=value]

특정 인터럽트의 발생 여부를 감지하기 위한 브레이크 포인터를 설정합니다.

EX>> BPINT 21 AH=9

; 인터럽트 21H의 9번 펑션 코드가 사용될 경우 브레이크가 걸린다.

브포쓰는 명령어에 따라잡을 수 있는 메모리의 종류가 달라요. 근데 어셈을 잘 몰라

이것을 어떻게 걸어야 잘 잡는 건지 저도 모르겠네요. 저도 얼랑 얼랑 어셈을 배워야

할 텐데..

【BPX】 BPX [address]

주어진 메모리에 부포를 설정한다.

EX>> bpx getsystemtime

; getsystemtime의 함수에 접근이 되면 브레이크 해라.

함수를 걸을 때 많이 쓰는 명령어입니다. 이거 모르면 크랙 못해봅니다. 진짜예요.

천재가 아닌 이상은... ^^

브포의 설명은 여기까지 하죠.

2) 브레이크 포인터 제어하기

【BPE】 BPE break point number

설정된 브레이크 포인터를 수정한다.

EX>> BPE 3

; 현재 설정된 브레이크 포인터 중에서 3번 브레이크 포인터를 수정한다.

【BL】 List current breakpoints

현재 설정되어 있는 브레이크 포인터를 나열한다.

EX>> BL

; 현재 설정되어 있는 모든 브레이크 포인터를 설정된 순서대로 나열한다.

【BC】 BC list | *

현재 설정되어 있는 모든 브레이크 포인터를 해제한다.

EX>> BC *

; 현재 설정되어 있는 모든 브레이크 포인터를 해제한다. 만약에 설정된 프레이크

포인터가 3개이고 2번째를 지우고 싶다면 BC 2라고 하면 되겠죠?

또 2번과 3번만 지우고 싶으면 BC 2,3 이렇게 입력해 주면 됩니다.

【BD】 BD list | *

현재 설정되어 있는 브레이크 포인트를 불가능하게 하여 브레이크 발생을 일시

적으로 불가능하게 한다.

EX>> BD 1,4

; 1번과 4번의 브레이크 포인터를 일시적으로 불가능하게 합니다. 이것도 많이 쓰이더군요

3) 메모리 표시/변경

이것도 많이 쓰도록 노력을 해야 합니다. 중요하고 어셈을 잘 알면 해석이 쉬어지거든요.

근데 저는 어셈을 쪼금밖에 몰라서 많이 않습니다. 알아야 뭘 하지....

  【R】 R [register-name | register-name [=] value

  레지스터 상태를 화면에 표시하거나 변경한다. register-name만 지정하고 값을 생략

  하면 명령 윈도에서 직접 값을 입력받습니다.

  EX>> R AH=5

  ; AH 레지스터에 숫자 5를 저장한다.



┌──────────────────────────────────────┐

│   ★ 중요 ★                                                                                                       

│                                                                                                                          

│ 플러그 레지스터의 변경                                                                                      

│ R FL [=flag-list]                                                                                                  

│                                                                                                                          

│ 플러그 레지스터의 내용을 변경시키는 명려로 flag-list를 set, Reset                       

│시키는 방법은 알의 코드표에 나와 있는 해당 알파벳을 대문자로 쓰거나                    

│앞에 +를 붙이면 Set, 소문자로 쓰거나 -를 붙이면 Reset 됩니다.                                

│저는 그냥 한 번 더 쳐줘요. 그래도 Reset이 되거든요.                                                

│EX>> R FL=CO-i                                                                                                  

│                                                                                                                          

│;플러그 레지스터 중 캐리 플러그(C)와 오버플로우 플래그(O)의 값은 토                     

│ 글하고 인터럽트 플러그(I)는 불가능하게 한다.                                                        

│  ※ 플러그 레지스터의 각종 기능에 해당하는 알파벳 코드                                         

├──────────────────────────────────────┤

│ Overflow  Direction  Interrupt  Sign  Zero  Auxiliary Carry  Parity  Carry                     

├──────────────────────────────────────┤

│   O              D             I          S      Z              A             P      C                                  

├──────────────────────────────────────┤

│   o              d              i          s      z              a             p      c                                           

└──────────────────────────────────────┘





【U】 U [address] [L length]

주어진 메모리의 기계어 코드를 어셈블리어로 역어 셈 블하여 화면에 출력한다.

EX>> U CS:IP-10 L 20

; CS:IP-10번지부터 20h 크기만큼의 기계어 코드를 역 어셈블 해서 화면에 출력한다.

EX>> U 0137:2020202

; 0137:2020202의 내용을 역어 셈해서 화면에 출력한다.



4) 유틸리티 명령

이것도 중요.



【A】 A [address]

어셈블리를 입력받아 어셈블 된 결과를 주어진 번지에 저장한다. 완전히 저장하는 것이

아니라 일시적으로 저장이 됩니다. 껐다 켜거나 하면 저장이 안 되어 있죠. 그래서 이것

저것 해보는 것이 가능합니다.

EX>> A CS:1234 or A

;CS:1234 번지로부터 니모닉 코드를 입력받아 기계어 코드로 변환한다.

  그냥 A 만 키면 현재 커서에 있는 곳을 고칩니다. 니모닉 코드가 뭐냐...

  영어로 mnemonic 뜻은 기계어의 명령을 알아보기 쉽도록 알파벳 문자를 이용하여 기호화

  한 것을 말합니다. 예를 보이자면 cs:1234번지가 실행이 되면 cs:1000으로 점프하게 하고 싶다

  면 A cs:1234를 치면 XXXX:00001234라고 나옵니다. 이곳에 이렇게 입력을 하면 됩니다.

  jmp cs:1000 이렇게 치면 됩니다.



  이것만 알아 두세요. 저도 이것밖에는 모르겠네요.

5) 그 외의 명령들

  많이 쓸만한 명령어들입니다.

【H or HELP】 Help on the specified function

명령어의 간단한 사용방법과 예를 화면에 보여준다.

EX>> H R

;R 명령의 간단한 사용방법과 예를 보여준다.

아마. 제 강좌도 이렇게 해서 곰을 걸요??..............^^

【VER】 SoftICE version

소프트 아이스의 버전을 알려준다. 한번 버전이 얼마나 되는지 쳐보세요.

[HBOOT] System boot (total reset)

시스템을 재부팅시킨다. 이때 소프트 아이스도 메모리에서 함께 제거된다.

달랑 두 개.. 참! 도스의 CLS 명령도 있어요. 뭔지 말 안 해도 알죠??^^ 

'어셈블리' 카테고리의 다른 글

어셈블리 강좌5  (0) 2019.07.09
어셈블리 강좌4  (0) 2019.07.09
어셈블리 강좌3  (0) 2019.07.09
어셈블리 강좌2  (0) 2019.07.09
어셈블리 강좌1  (0) 2019.07.09