Ollydbg 패치

oogu ㅣ 2022. 7. 30. 14:15

#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "user32")

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nCmd)
{
	int num1;
	char str[24];

	for(num1=0; num1<5; num1++) {
		num1 = num1;
		sprintf(str, "Loop Count = %d Time", num1);
		MessageBox(NULL, str, "for 구문", MB_OK);
	}
	return 0;
}

간단한 for문 코드를 만든다.

새로 만들기 - 프로젝트

빈 프로젝트로 만든다.

솔루션 탐색기에서 새 항목

추가

소스 코드를 입력하고 모두 저장한다.

Visual Stdio에서 컴파일하면 사용자가 입력한 코드 이외에 다른 코드들이 추가 되기 때문에 CL 이라는 컴파일러를 이용하기 위해 저장한다.

for.cpp 파일 위치에가서 Shift + 마우스 오른쪽 클릭 - 여기서 명령 창 열기

cl for.cpp /link /debug /opt:icf,ref 

CL 컴파일러를 이용하면 사용자가 입력한 소스코드만 컴파일되어 분석하기 쉬워진다.

for.exe 가 생성되었다.

main 함수 코드 위치이다.

빨간칸을 보면 [EBP-4]와 5를 비교한다. 그리고 [EBP-4] >= 5이면 점프를 하는데 소스코드에서 num1<5; 이 부분이다.

for.exe 파일을 실행하면 0~4 까지 실행한다.

[EBP-4]와 5를 7로 수정하여 5와 6도 나오게 패치하겠다.

수정하고 싶은 어셈블리어칸에서 스페이스바를 누르면 수정할 수 있다.

 

 5 -> 7로 수정했다.

코드창에서 마우스 오른쪽 클릭 후 Copy to executable - All modifications 

Copy

Save file

for.exe 파일을 패치하여 for_패치.exe 파일을 만들었다.

for_패치.exe  실행하면 for.exe 에서는 안나왔던 5와 6도 출력이 된다.

 

 

 

 

 

[패치 시 주의 사항]

 

1. 이미 실행된 어셈블리어는 수정할 수  없다. 즉, 실행되기 전 어셈블리어만 수정할 수 있다.

 

2. 패치를 할 때는 수정되기전 바이트와 수정된 후 바이트가 같아야 한다. 

만약, 바이트가 넘어버리면 다른 코드가 덮여씌우기되기 때문에 파일 실행이 안될 수 있다. 

 

3. 레지스터 값을 변경하는 패치는 불가능 하다.

'레나 튜토리얼' 카테고리의 다른 글

[레나 튜토리얼] - 2  (0) 2022.07.31
[레나 튜토리얼] - 1  (0) 2022.07.30
Ollydbg 설명  (0) 2022.07.30
32_패킹&언패킹  (0) 2022.07.28
MOV, LEA, ADD, SUB, IMUL, IDIV  (0) 2022.07.28