最近要做驱动程序,需要用到反汇编。在网上收集了一些资料,了解到一些常用工具名称,一些反
汇编操作的经验总结,有一篇文章说 QQ 大厅多开的破解,很有意思。看起来最简单了,我也试
验一下,拿我很喜欢的小游戏《宝石迷阵》做实验。打这个游戏当年我还创造了 13 万的高分,至今
没有人能超越。前几天也是拿他作查找/修改内存试验,效果很不错。
//2006-10-3
这几天收集整理了大批的反汇编工具,有 Cheat engine, Ollydbg, PE Explorer,IDA Pro, W32ASM。
IDA 不能用,老是说过期了。
Cheat Engine 是修改游戏内存的工具,反汇编用不上。不过还是很好玩的工具,和我写的程序效果
差不多,可以不断检索,很快找到内存位置。今后可能要通过程序动态检索修改内存,所以这样的
工具我不会下功夫继续做下去。
Ollydbg 很好用,正在掌握中。
W32ASM 和 Ollydbg 差不多,只是界面、代码看着更整洁一些。
//2008-10-6
HMODULE hModule = GetModuleHandleA(appName);
if(hModule == 5A4D)
{
ecx = hModule+3C;
exc += eax;
if(ecx == 4550)
{
eax =
}
}
用 Ollydbg 做跟踪,
开两次游戏,
004AB9BF
. /74 1F
JE SHORT WinBej.004AB9E0
跳转到
004AB9E0 > \8379 74 0E
CMP DWORD PTR DS:[ECX+74],0E
在这里
004ABA91 . F645 C8 01
TEST BYTE PTR SS:[EBP-38],1
进行测试,是否有一个句柄。
发出 ZwRaiseException 后退出游戏。
CPU Disasm
Address Hex dump
Command
Comments
004AB9FE |. /75 08
JNE SHORT 004ABA08
CPU Disasm
Address Hex dump
Command
Comments
004ABA0F |. /75 08
JNE SHORT 004ABA19
这里是发生跳转的点
//2008-10-8
CreateMutexA
昨晚在看雪论坛下载到一个可用的 IDA,他也是反汇编好工具。
早上安装使用,发觉他有一个优点,可以用图形的方式列出过程,子过程也可以建立新窗口查看。
从起点 PUSH 60H 开始跟,记录下每一次进入的子过程的地址。
多开 - 路径
004AB97F - 004AB98D - 004AB9A9 -
004AB9B6 - 004AB9E0 - 004AB9E6 -
004AB9EE - 004AB9F4 - 004ABA08 -
004ABA19 - 004ABA32 - 004ABA58 -
004ABA69 - 004ABA7C - 004ABA97 -
004ABAA0 -
004ABAA6 - 跳转 Over
单开 - 路径
004AB97F - 004AB98D - 004AB9A9 -
004AB9B6 - 004AB9E0 - 004AB9E6 -
004AB9EE - 004AB9F4 - 004ABA08 -
004ABA19 - 004ABA32 - 004ABA58 -
004ABA69 - 004ABA7C - 004ABA97 -
004ABAA0 -
004ABAA9 call sub_40BA8C 启动程序
经过前几天的努力,感觉前面不会是问题所在,因为运行过程一模一样,感觉 sub_40BA8C 里面有原因。
用新的窗口打开这个子过程。又打开了几个以后,突然出现了很多很多代码,我想这里是 InitApp
的主体吧。在里面找寻了一会,看到 CreateMutexA 函数。它下面有一句 Cmp eax, 0B7h 估计是检查
创建结果,用 VC 的错误查询器查看 0B7h,是"当文件已存在时,无法创建该文件"。这样的错误很明显
说明 Mutex 已经存在,无法继续创建。得,这就是问题的原因了。
sub-40BA8C - 跟踪
441047 call ds:CreateMutexA
创建互斥矩阵
44105D cmp eax, 0B7h
创建失败 GetLastError() == 0xB7
183(0xB7)错误,当文件已存在时,无法创建该文件。
441062 jnz
short loc_441082
eax - 0B7h != 0 则跳转
再用 Olldbg 启动游戏,在 44105D 处修改一下错误代码,0B7h 改为 0B6h,继续运行,多开运行成功。
总结一下:
用 Olldbg 很多天都找不到问题的原因,是因为用 OD 我一直在 main 函数里面打转转,根本没有进入到
真正初始化的函数里面,原因是程序的跳转太多了,很难一个一个子程序都进入,进入多了以后自
己都不知道转到了哪里。而且 OD 所有过程在一个文件里面,看着容易糊涂。
IDA 的过程方式用图表,子过程又在新的窗口里面,很清楚下面去了哪里。很容易就找到目标。用
OD 5 天没有解决的问题,IDA 半天就连学带用掌握了。
OD 查询函数很麻烦,用了那么久依然不熟练。IDA 修改汇编命令我还没学,只知道 OD 可以一边运行
一边修改指令。
W32ASM 查询很容易,但是和 OD 一样很难一次看清楚所有的子程序。
我想以后我会更喜欢 IDA 的,至少今天只用了半天就通过它搞好了事情。接下来多多熟悉 IDA,掌握
更多操作方式。过几天学多了,我把经验继续贴进来。