1. Hello World! 프로그램


#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR *argv[])
{
MessageBox(NULL,
L"Hello World!",
L"www.reversecore.com",
MB_OK);
return 0;
}

// 릴리즈 모드로 빌드하기.

c언어(HelloWorld.cpp) ---- <빌드> -----> 실행파일(HelloWorld.exe)// 기계어 ------ <디버거> ----> 어셈블리어



2. 디버깅 시작
// Immunity Debugger 사용

 Code Window 

Register Window 

Dump Window 

Stack Window 


- 사용법

// Restart (ctrl+F2)

Step Into (F7) : CALL함수를 만나면, 함수 코드 내부로 따라 들어감.

Step Over (F8) : CALL함수를 만나면, 따라 들어가지 않고, 함수 자체를 실행.

Execute till Return (Ctrl+F9) : 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출 목적)

Go to(Ctrl+G) : 원하는 주소로 이동

Comment (;) : comment 추가

Set/Reset Break Point (F2) : BP 설정/해제

Run (F9) : 실행(BP가 걸려있으면 그곳에서 실행이 정지됨)

Show the previous Cursor (-) : 직전 커서 위치를 다시 보여줌.



* EP(Entry Point)

// Windows 실행 파일(EXE, DLL, SYS)의 코드 시작점을 의미.

address Instruction      Disassembled code                           comment


- address : 가상 메모리내의 주소

- instruction : cpu 명령어

- Disassembled code : OP code를 보기 쉽게 어셈블리로 변환한 코드 (OP code란 Operation Code)

- comment : 디버거에서 추가한 주석



* BP(Break Point)

- view -> Breakpoints // BP목록 보기(Alt+B)



3. main() 찾기

- 경험과 노하우를 통한,,

// push , push, call...~

call에는 메인함수의 주소가 들어있다.



- 문자열 검색 방법

// code window 부분에서 우클릭 -> Search for -> All referenced text strings -> 이동하고자 하는 문자열을 더블클릭




// 제대로 간지 확인법> dump window 에 ctrl+G -> push 뒤에 있는 주소 입력 (0040211c)

-> dump window보면 아스키에 helloworld!가 찍혀 있음.




- API 검색

// 우리가 사용한 MessageBox()를 이용해서 찾는 것.

// Search for -> All intermodular calls -> 원하는 것 더블클릭하면 이동



- 문자열 패치1 <원본문자열의 크기와 수정문자열의 크기가 같거나 작은 것>

만약,,, 크다면,,, 이거는 뒤에 있는 함수에 영향을 주기때문에 프로그램 에러가 발생.

// 바꾸고자 하는 문자열을 드래그 후 ctrl+E (문자열 패치)


// 문자열이 바뀐 것을 확인할 수 있다. 하지만 이건 임시적으로 바꾼 것이다.

따라서, Restart를 하면 처음 상태 그대로 문자열이 helloWorld가 나온다.



// 임시적인게 아니라 저장하고싶다??

저장하고자 하는 문자열 드래그 -> 우클릭 -> Copy to executable file



// hex파일에 드래그 된 부분 우클릭 -> save file



- 문자열패치2 <원본문자열보다 수정문자열이 크기가 더 큰 경우>


// 맨 밑에 널패딩으로 가득한 곳을 찾는다. 그 주소 00401810을 dump window에서 ctrl+G로 검색

// 검색해서 쓰고싶은 만큼 드래그 -> ctrl+E -> 문자열 입력.



// 아까 위에있던 원본 문자열 push하는 부분에서 주소값을 널패딩으로 가득했던..

내가 새로 입력한 문자열 주소로 바꾼다. 주소를 바꾸기 위해서는 바꾸고자하는 줄을 더블클릭해준다.


// 바꾸고, 그 부분에 BP를 추가하여 Run한다. 그럼 내가 바꾼 문자열로 실행되는 것을 볼 수 있다.



* 깨알용어정리

- VA(Virtual Address) : 프로세스의 가상 메모리

- OP code (Operation code) : cpu 명령어(바이트 code)

- PE(Portable Executable) : Windows 실행파일(EXE, DLL, SYS 등)




+ Recent posts