#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 |