1、程序实例
Cosh.1.exe
破解前:
破解后:
2、查找打补丁地址
通过字符串搜索,可以定位到关键点。
1 | 地址 硬编码 汇编代码 |
如果比较结果为相等,则跳转,输出字符串“Well done,Cracker”。将跳转指令je改成jmp,实现无条件跳转,输出“Well done,Cracker”。
1 | 地址 硬编码 汇编代码 |
通过上面过程可以看出只要将内存地址0x0040138C处的6个字节0F 84 F3 00 00 00改成E9 F4 00 00 00 90就能达到破解目的。
3、代码实现
1、实现这个功能首先我们需要了解几个API。
1、CreateToolhelp32Snapshot()能获得系统进程快照的句柄。
1 | HANDLE |
2、Heap32ListFirst()查找系统进程快照中的第一个进程。
1 | BOOL |
3、Process32Next()获得下一个进程。
1 | BOOL |
4、tagPROCESSENTRY32结构体能够保存进程的信息。
1 | typedef struct tagPROCESSENTRY32 |
4、OpenProcess()用来打开一个已存在的进程对象,并返回进程的句柄。
1 | WINBASEAPI |
5、WriteProcessMemory()对内存区域进行读写。
1 | WINBASEAPI |
2、代码
先在系统中查找需要打补丁程序的进程名与进程ID,然后通过WriteProcessMemory()函数对内存进行读写,将内存地址0x0040138C处的6个字节0F 84 F3 00 00 00改成E9 F4 00 00 00 90。
1 | #include <Windows.h> |
将程序Cosh.1.exe运行,再运行编译成功的补丁程序。
通过Windbg的附加功能,我们可以看到,地址0x0040138C处的六个字节代码已经呗更改,破解成功。