OD,是一个反汇编工具,又叫OllyDebug,一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3 级的调试器,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目l前最强大的调试工具。基本上,调试自己的程序因为有源码,一般用vc,破解别人的程序用OllyDebug(摘至百度)
OD目前主要用于逆向32位程序,由于我所掌握的知识也不多,所以我将我所知道的关于OD的使用方式都展示出来
OD界面介绍:
了解了最基本的界面,接着,我使用一个小游戏,通过寻找一个功能CALL了解OD的最基本的使用,这里会用到CE工具进行地址的寻找以及代码注入,这里也会进行简单介绍
游戏:热血江湖(32位)
功能:自动杀怪
思路:选中怪物-->写入地址-->打怪CALL访问地址-->实现打怪
一、CE查询地址
1、 打开CE(我所使用的CE是CE6.7版本),附加游戏进程
2、在没有选中怪物时,存放怪物对象的地址内的值应该为NULL,即为0,所以搜索0值(当然结果多到爆)
3、或者选择未知初始值(可能存在选择了其他对象)
4、通过反复选择怪物,缩减可疑值的数量
最后,我取得了这3个可疑的值
4、附件到进程,查看改变该内存值的语句,排除干扰值(按经验而言,选中怪物的时人物,应该是一个对象,所以很大可能是传入怪物下标的那个内存地址)
基本可以确定是该地址
5、分别记录访问该地址的语句和改写该地址的语句
注:查看访问时应该选择攻击动作使用时访问的那几段代码
同时,寻找到选中对象的基址,方便程序重启后继续调试
、
绿色的地址即基址(基址 + 偏移 ====》 [0427EBA0]+1A64)
结束附加,打开OD,进行动态调试
1、附加游戏
点击文件,选中附件,找到游戏进程
进入附加状态后,点击运行,让游戏先运行起来,同时,按Ctrl + G打开转到
跳转到刚刚CE收索到到地址
// 改写
00544575 - 8B 46 0C - mov eax,[esi+0C]
00544578 - 8B 0D 243AE602 - mov ecx,[Client.exe+2A63A24]
0054457E - 89 81 641A0000 - mov [ecx+00001A64],eax <<
00544584 - EB 34 - jmp Client.exe+1445BA
00544586 - C7 85 F8D4FFFF FFFF0000 - mov [ebp-00002B08],0000FFFF
EAX=00001CEA
EBX=0019A5F0
ECX=43795350
EDX=001930C4
ESI=54CAB2F0
EDI=43795350
ESP=00197A7C
EBP=0019A5E0
EIP=00544584
// 访问
00543AB6 - E9 71630000 - jmp Client.exe+149E2C
00543ABB - 83 3D CC9D2401 00 - cmp dword ptr [Client.exe+E49DCC],00
00543AC2 - 8B 87 641A0000 - mov eax,[edi+00001A64] <<
00543AC8 - 89 85 78FEFFFF - mov [ebp-00000188],eax
00543ACE - 0F85 AF5D0000 - jne Client.exe+149883
EAX=00001CEA
EBX=0019A5F0
ECX=00000017
EDX=00000082
ESI=00000000
EDI=43795350
ESP=00197A7C
EBP=0019A5E0
EIP=00543AC8
00545C58 - 85 C0 - test eax,eax
00545C5A - 0F84 233C0000 - je Client.exe+149883
00545C60 - 8B 87 641A0000 - mov eax,[edi+00001A64] <<
00545C66 - 3D 983A0000 - cmp eax,00003A98
00545C6B - 73 1B - jae Client.exe+145C88
EAX=00001CEA
EBX=0019A5F0
ECX=43795350
EDX=0000002E
ESI=00001CE6
EDI=43795350
ESP=00197A7C
EBP=0019A5E0
EIP=00545C66
00545C98 - 68 50040000 - push 00000450
00545C9D - FF D0 - call eax
00545C9F - 89 B7 641A0000 - mov [edi+00001A64],esi <<
00545CA5 - 89 B7 801A0000 - mov [edi+00001A80],esi
00545CAB - 8B 04 B5 283AE602 - mov eax,[esi*4+Client.exe+2A63A28]
EAX=00000001
EBX=0019A5F0
ECX=B5B43C40
EDX=001930C4
ESI=00001CE6
EDI=43795350
ESP=00197A7C
EBP=0019A5E0
EIP=00545CA5
寻找该处后,按下F2在该处进行下断,进入游戏,选中应该怪物进行打怪的操作,查看能否断下来
成功断下后,按Ctrl + F9,执行到返回,返回到上层CALL
断下该处,发现这里在没有进行操作的时候也会断下,说明这里并非是打怪的CALL,排除,按‘-’号键返回之前的代码或是选中状态栏的'B'进入到断点处,进入断点
取消这里段点,同样的方式来测试其他的地址
测试完成我发现,之前的思路可能是不正确的!!!我发现游戏里,打怪应该是调用了攻击这一个动作来进行操作,所以需要先得到动作列表的地址
获取动作基址的方式与之前选中怪的方式类似,检索鼠标是否选中动作,向上回溯出列表基址,我在这里就不做操作,直接贴出我寻得的基址
0085324B . 8B94BB 3C0400>MOV EDX, DWORD PTR DS:[EBX+EDI*4+0x43C] ; 动作列表
攻击 ===》 [02E3BD58]+0x43C+4*2
这里说一下:逆向一个值的由来,有时候需要向上回溯多层才可能得出,所以需要一定的耐心
查找访问该地址的地址
最后在OD内寻得的代码是
<blockquote>008544ED . 8B48 54 MOV ECX, DWORD PTR DS:[EAX+0x54] ; 可能是动作的ID
使用代码注入器测试
=========OK ============
MOV EAX, 0x2C8FD710 //动作对象
MOV ECX, DWORD PTR DS:[EAX+0x54]
MOV EDX, DWORD PTR DS:[0x125256C]
PUSH ECX
MOV ECX, DWORD PTR DS:[EDX+0x28C]
CALL 00713990
总结:
自动打怪的操作:
选中怪物 -----》 向内存内赋值(怪物下标)
使用动作对象 -----》 利用动作使用CALL,传递动作对象地址进行使用
另外的话:
这是我在这个平台第一篇帖子,其目的是锻炼自己,同时也希望这篇帖子所介绍的内容能让大家熟悉OD以及这系列逆向工具的使用,OD更加详细的介绍我之后会补上,这上面都是一些特别基本的操作,而且并不全面,但是希望更多的实践能让我,也让大家对这些工具的使用更加得心应手。
|