标签:unicode 断点 sage 完成 程序 push tle code 改变
下面使用两种方式修改回显字符串
代码如下:
#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;
}
使用VS2015生成Crackme,将Crackme载入OD
1.直接修改字符串缓冲区
通过先前设置的断点找到程序入口后,step info逐步找到MessageBoxW函数地址
在数据区找到对应地址的数据
直接在UNICODE更改数据,值得注意的是使用UNICODE修改字符串后必须以NULL结束,占据2个字节且必须在HEX中添加
在完成上述更改后又将HEX字段末尾处的60涂改为00,我对unicode占据2个字节不明白,姑且这样改,原因见下文。
开始还有疑问,最后的M是啥?后来发现是下个地址空间第一个数据,猜测是起提示作用,防止扩充的字符串溢出
运行结果如下
在保存程序副本和重复测试的时候发现结果不能重现,说明上述操作只是碰巧成功
多次运行查找原因为:忽略字符串所占地址区域4DBE80----4DBE90;2个HEX表示一个字节,而Unicode字符串必须以NULL结束且NULL占据2个字节,简而言之在4DBE90地址的最后要空出4个0;Unicode编码中采用2个字节表示1个字母;
重新设置Unicode字符串发现操作成功
程序保存运行后也成功修改
直接修改的缺陷显而易见,对重改后的字符串长度提出了要求,需要有一定的运气,crack后程序也不稳定
2.使用其它内存区域新建字符串传递消息
在程序未使用的内存区域选择一部分作为新的字符串缓冲区,我选择的是0x004fde60,在新地址中写入自定义字符串,其后运行到MessageBoxW函数,改变push的地址内容使其指向刚选择的内存地址
运行结果如下
标签:unicode 断点 sage 完成 程序 push tle code 改变
原文地址:http://www.cnblogs.com/ghost00011011/p/7856290.html