学习反汇编记录

时间:2021-03-18 01:01:12

最近要做驱动程序,需要用到反汇编。在网上收集了一些资料,了解到一些常用工具名称,一些反

汇编操作的经验总结,有一篇文章说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,掌握

更多操作方式。过几天学多了,我把经验继续贴进来。