一个使用CE 自动汇编的例子
工具说明:
Cheat Engine 6.8
MingW(gcc)
程序源码
说明:
程序分为两个部分,第一部分为CE
获取变量地址,第二部分是将要注入代码的地方
#include <stdio.h>
int main()
{
int index = 0;
char key = 0;
printf("addr: 0x%x\n", &index);
// CE 获取变量地址
for (;;) {
printf("Test OutPut: %d\n", index);
key = getchar();
if (key == 'c') {
break;
}
index++;
}
index = 0;
// 将要注入代码的地方
for (;;) {
Sleep(1000);
printf("Program OutPut: %d\n", index++);
}
return 0;
}
期待注入的效果
原程序的输出
Program OutPut 1
Program OutPut 2
Program OutPut 3
.
.
我期望它的输出
hello 4
hello 5
hello 6
.
.
调试过程
0x00
执行程序 test.exe
0x01
在CE
中打开进程 test.exe
0x02
在CE
输入0,点击新的扫描
0x03
程序中执行回车一次,并在CE
中输入1,点击再次扫描,这个会得到变量index
内存地址,应该与程序中的输出一致
0x04
在程序中输入 c
并执行回车,则会进入我们将要注入代码的地方。
0x05
将地址0x60FF1C
,添加到地址列表中,并在其上右击选择找出是什么访问了这个地方
,很快我们就会看到CE捕获到了对这个内存的读写操作,点击显示反汇编程序
。
0x06
绿色那一行,便是我们要注入的地方(这块需要懂汇编)
选中绿色这行代码,在菜单中选择工具->自动汇编
在自动汇编窗口的菜单选择模板->代码注入
,然后点击OK,CE会帮助我们自动生成一些代码
0x07
在原有的代码基础上更改将要注入的代码
alloc(newmem,2048)
alloc(newstr,2048)
label(returnhere)
label(originalcode)
label(exit)
// 申请一段新的内存, 放置一个新的字符串
newstr:
db 'h'
db 'e'
db 'l'
db 'l'
db 'o'
db ' '
db '%'
db 'd'
db 0A
newmem: //this is allocated memory, you have read,write,execute access
// place your code here
// 修改之后的代码
push edx // 参数二不进行修改
push newstr // 修改参数一, 字符串为"hello %d\n"
call printf
originalcode:
// 注释原代码
//push edx
//push test.exe+3041
exit:
jmp returnhere
"test.exe"+13BF:
// 修改代码注入的汇编, 主要是执行跳转, 去掉不必要的代码
// jmp 5 byte, E9 [addr]
jmp newmem
// nop 1 byte, 0x90
nop
nop
nop
nop
nop
nop
returnhere:
0x08
改完代码之后,点击执行,执行成功后,程序便会输出预计的效果
相关的文件在这里下载
链接: https://pan.baidu.com/s/1YrJ4KXbQzKn6k15kvuZK6g
提取码: 17q3