第一课了解od与使用的方法_第1页
第一课了解od与使用的方法_第2页
第一课了解od与使用的方法_第3页
第一课了解od与使用的方法_第4页
第一课了解od与使用的方法_第5页
已阅读5页,还剩23页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2来调试用户模式应用程序的调试器,它们工作在Ring3级,如OllyDbg、VisualC++等编译器自带的调试CPURing0第2 OllyDbg(简称OD)是由OlehYuschuk( 试器,可以在当前各种Windows版本上运行,但NT的系统架构更能发挥OllyDbg强大功能。OllyDbg结合了动态调试和静态分析,具有GUI界面,非常容易上手,并且对异常的处理相当灵活,这些特性使得OllyDbg成为调试Ring3级程序的首选工具。它的反汇编引擎很强大,可识别数千个被C和Windows开放式的设计给了这个软件很强的生命力,者不断地修改、扩充OllyDbg,执行能力和开放插件OllyDbg本节以OllyDbg1.10讲述其用法,支持32位程序。OllyDbg版本是一个ZIP压缩包,只要将其解压缩到一个下,然后运行ollydbg.exe即可。打开目标程序后,OllyDbg会打开多个子窗口,单击菜单View或单击L、E、M等按钮可在各子窗口间切换,如图2.1所示。这些按钮依次对应Log窗窗口、Callstack窗口、Breakpoints窗口、References窗口、Runtrace窗口、Source窗口等。窗口请查看View菜单,各窗口功能请参考OllyDbg帮助文档的描述。2.1窗口切换面CPUOllyDbg中是最重要的窗口。调试程序的绝大部分操作都要在这5个面板窗口:反汇编面板、寄存器面板、信息面板、数据面板、堆栈面板, 堆 板2.2OllyDbg主界(barAeaac(Addressdump(CommentShiftPgUp/PgDn键,也可利用右键菜单命令。按Ctrl键并按上下光标箭,一行一行地滚动汇编窗口(当数据与代码混合时,此功能非常有用。以十六进制和字符方式显示文件在内存中的数据。要显示数据,可单击鼠标右键“Gotoexpression”显示CPU各寄存器的值,支持浮点、MMX3DNow!寄存器,可以单击鼠标右键切换或单击窗口标OllyDbg的配OllyDbg的设置在菜单Options里,有界面选项(Appearance)和调试选项(Debuggingoptions)等。这些选项配置都保存在ollydbg.ini文件里。Drectres 2.3UDD文件及插件路径设UDDOllyDbg的工程文件,用以保存当前调试的一些状态,如断点、注释等,以便下次调试 (Coloursscheme,2.4OllyDbg界面颜色设highligtin(Exceptions2.5调试选项中的异常设(LibMFC42.DLLOllyDbgMFC42.DLL调试符号,则以函数名显示相关输出函数。加载方法是单击菜单“Debug/Selectimportlibraries”来打开导入库窗口,如图2.6所示。2.6加载调试符号OllyDbgto inWindowsExplorer”按钮即可关联。加载程OllyDbgCreateProcess利用CreateProcess新进程。OllyDbg将接收到目标进程发生的调试,而对其子进程的调试将不予理睬。OllyDbg除了直接加载目标程序外,也支持带参数的程序,方法是:在打开 栏中输入参数行,如图2.7所示。参2.7带参数调试程OllyDbg的一个实用的功能是可以调试正在运行的程序,这个功能称为“附加(Attach。其原理是利用DebugActiveProcess函数可以将调试器到一个正在运行的进程上,如果执行成功,则效果类似于利用CreateProcess创建的新进程。单击菜单“File/Attach”打开附加框,如图2.8所示。选中正在运行的目标进程,单击Attach按钮即可附加目标进程。附加后,目标程序会暂停在Ntdll.dllDbgBreakPoint处,在OllyDbgF9键或Shift+F9键让程序继续运行。接着就可对目标程序进行调试分析了。2.8附加目标进如果是隐藏进程,就不能用上述方法附加了。OllyDbg有一个-ppid就可IceSwordpid,然后在控制台窗口用-p参数附加即可。注意,pid的 C:\OllyDbg.exe–ppid OllyDbgA.exe,其中设置OllyDbg为即时调试器,将B.exe的改成CC,即INT3指令,同时记下原指令。运行A.exe,3指令恢复原指令,继续调试。基本操等,这与Borland的产品习惯完全一样。在这里,以一个用VisualC++6.0编译的程序TraceMeOllyDbg 输输函数GetDlgItemTextA从编辑框中取字计算lstrcmp函数进行字计算比较序列 错 正正 2.9TraceMe程序序列号验证过为了能让OllyDbg中断在程序的点,加载程序前必须要设置一下。运行OllyDbg后,单击菜单置OllyDbg对中断点、模块加载/卸载、线程创建结束等的处理,一般调试只需要将暂停点设置在“Entrypointofmainmodule”或“WinMain”即可。2.10OllyDbg第一次暂Systembreakpoint:系统断点,OllyDbg用CreateProcessADEBUG_ONLY_THIS_PROCESS参数执行,程序运行之后会触发一个INT3,在系统空间里。设置好后,单击菜单“File/Open”打开TraceMe.exe,此时OllyDbg会中断在TraceMe的点,如(EnrPoint 图2.11OllyDbg加载目标程序停在CPU调试器的一个最基本功能就是动态,OllyDbg在菜单“Debug”里控制运行令,各个菜单项都有相应的快捷键。OllyDbg的单步功能键如表2-1所示。表2-1OllyDbg的单步功能 直到出现RET指定时中若进入系统领空,此命令可瞬间回到应用程序领运行程F8CALL指令不会跟进,而路过。esi, ;F8键不会进去,而直接路过这个eax,{ ;按F7键会进入这个eax ;上面那4013FAF7键就会0[esp+8],}键、F12键或遇到其他断点时停止。return会回到4013FA这句。遇到RET指令是暂停还是步过可以在选项里设置,方法是:打开调试设置选项如果跟进系统DLLAPI函数中,此时想返回到应用程序领空里,可以按快捷键“Alt+F9”执行“Executetillusercode(执行到用户代码[ebp-18], ;F7键跟进KERNEL32.dlledx,7C8114AB7C8114ABkernel32.GetVersioneax,ecx,[eax+30]eax,;假设当前光标在这edx,wordptreax,7C8114ABDLL所在的地址空间,这时只要按一下快捷键“Alt+F9”就可回到应edx,;会返回到此如果不想单步,让程序直接运行起来,可以按F9键或单击中的按钮。如果想重新调目标程序,可以按“Ctrl+F2”快捷键或单击中的按钮,Ollydbg结束被调试进程并重新加载它。有时程序进入死循环,可以按F12键暂停程序。行设置断点,再次双击取消断点。当关闭程序时,OllyDbg会自动将当前应用程序的断点位置保存在其安2.12现在开始一个完整的调试分析过程,取消开始设置的所有断点,在OllyDbg里按F9键2.13实例运行起来的界容读出来,如表2-2所示。2-2程序采用的将文本框中内容读出来的函1632位(ANSI版符,如图2.14所示。2.14打开跟随表达式窗图2.15跳到函数在77D6AC1E这一行,按F2键设个断点,即在GetDlgItemTextA函数处设了断点(操作系统版本不同,这个函数地址是不一样的如果这个函数被调用,OllyDbg就会中断。注意:注意:在Windows9x系统中,OllyDbg是无法对API下一步可以列出所有断点来检查一下,按“Alt+B”快捷键或单击按钮打开断点窗口,如图2.16现已经设定了断点,可以捕捉任何对GetDlgItemTextA函数的调用。然后输入和序列号,如也可通过输入表设置断点。在OllyDbgCtrl+N”键打开应用程序的输入表,会发现USER32.GetDlgItemTextA函数,在这个函数上按Enter键或右键菜单执行“Findreferencestoimport”命令;/Count=51;;|ControlID=6E;;;从GetDlgItemTextA函数里出来会回到这;/Count=65;;|ControlID=3E8;;;leaeax,[esp+4C]pushpushcallE;参数:最大字符;参数:文本缓冲区参数框句;GetDlgItemTextA函数leaecx,;上句执行后长度返回到eax;;GetDlgItemText(hDlg,IDC;

pushecxpush000003E8pushesimovebx,eaxcalledi

;最大字符;文本缓冲区指;控件标识(ID号 框句将用户名的长度转到ebx;调用GetDlgItemTextA函数取序列;if(cName[0]==0|| movalbyteptr[esp+4C将用户名第一个字节给

testal,al

;检查有没有输入用户;如果没有输入用户名跳走,告知输入字符太 cmp ;用户名长度是 ; leaedx,[esp+4C] ;用户名地址放到edx中 pushebx ;用户名长度入栈(len参数) leaeax,[esp A0];序列号地址放到eax中 pushedx ;用户名入栈(cName参数) push ;序列号入栈(cCode参数 ;CALLGenRegCode函

movedi,add ;平衡堆栈(C调用约定 testeax, ; 失败 成 API函数基本采用的是stdcall调用约定,即函数参数按从右到左的顺序入栈,并由被调用者eaxAPIpush指令,这些指令将参数放进堆栈以传送给API调用。整个过程中要关注堆栈数据变化。HWNDhDlg,intnIDDlgItem,LPTSTRlpString,intnMaxCount

框句//控件标识(ID号//文本缓冲区指004011AEpush004011B0push004011B1push004011B3push004011B4

;int;LPTSTR;int;HWNDGetWindowTextlpString(LPTSTR是一个长的指针,指向由寄存器单击右键,执行菜单“FollowinDump”命令查看数据窗口中的内容,当然此时数据窗口中没什么有价值的东西。继续按F8键单步执行完下面一句:004011B4call ;GetDlgItemTextA函数输入的字符“pediy2.17所示。2.17数据窗口查看字;序列号计算的edi,esp,eax, ; 是1,执行后为0,如图2.18所示。2.18改变标志寄存器的74372.19键入汇编代 8B3Dedi, 83C4esp, eax, 这 这 改一直有效,就必须将这个变化写进磁盘文件中去。OllyDbg也提供了这个功能,方法是用鼠标选中修改过的代码,单击鼠标右键,执行“Copytoexecutable/Selection”命令,如图2.20所示。2.20保存修改的文File”即可将修改保存到文件。像这种程序的某些功能或改变程序流程,使程序的保护方式失效的方法称为patch(补丁)或“”。2.21文件编辑unsignedunsignedcharTable[8]={0xC,0xA,0x13,0x9,0xC,0xB,0xA,0x8};//数据表,全局变BOOLGenRegCode(TCHAR*rCode,TCHAR*name,int{intunsignedlongcode=0;for(i=3,j=0;i<len;i++,j++){if(j>7)j=0;}if(lstrcmp(rCode,name)==0)returnreturn}004011DB004011DB004011DCeax,;int;TCHAR;;TCHAR进入子程序 2.22堆栈面板窗pushpushmovebp,[esp+0C]pushesipush;ebp入栈,保护现;esi入栈,保护现;edi入栈,保护现;movedi, mov ;i=3,ecx作为变量i使xoresi, ;xoreax ;j=0,eax作为变量j使cmpedi i<lenpush 注意这句401378;if(j>7)CE/cmp||xoreax,j>7|xoredx,|xorebx,|movdl,|movbl,;;(BYTE)是防止处理中文时符号扩];;地址处放的是数据D|imuledx,;edx=|addesi,;code+=|inc;||\inccmpecx,;;;如小于,则循环,计算下一pop ebx出;;;A;F;;wsprintfA函数将数字转换成字moveax,;将参数从堆中传给eax(序列cCode指针Aadd ;wsprintf是唯一一个需手动平衡堆栈API函D;ebp指向的是计算出的真正序列E;eax指向的是输入的序列F[];lstrcmp函数比较字negnegsbbeax,;edi出栈,恢复现AB;eax+1,即序列号相等eax=1,否则CD;子程序的返回值通过eax寄存器 movbl,byteptr 2.23查看数据窗数据窗口显示的就是Table表,其值为:0C0A13090C0B0A08。TraceMe最后调用了函数lstrcmp来比较字符,它的原型是:intintLPCTSTRlpString1LPCTSTR返回值:如相等返回//第一个字符串地//第二个字符串地FpushCalldwordptr;计算出的真正序列;输入的序列];lstrcmp函数比较字2.24数据窗口查看序列号字断INT3 CCINT3指令,其机器码是CChCCINT3指令导致一个异常调试器,也可用其他一些指令代替INT3来触发异常。INT3断点的好处是可以设置无数个断点,缺点是改变了原程序指令,容易被软件检测到。例如为APIAPICChC下面这段代码就是对MessageBoxA函数进行的断点检测:FARPROCFARPROCUaddr;BYTEMark=0;(FARPROC&)Uaddr=GetProcAddress(LoadLibrary("user32.dll"),Mark*((BYTE*)Uaddr取MessageBoxA函数第一字if(Mark //如该字节CCMessageBoxA函数被下return //发现断硬件断点和DRx调试寄存器有关。从In CPU体系架构手册中,可以找到DRx调试寄存器的介绍,如图2.25所示。LENR/WLENR/WLENLENR/WLENR/WLENR/WLENR/W000000GLGLGLGLG EE33221100000000000000000BBB000000000BBBTS321保保用于一般断点的线性地用于一般断点的线性地注意:01保留,未定义图2.25In调试寄存器示意4个调试寄存器(DR0,DR1,DR2,DR3)DR7设定状态,因此最多只能设置4个断点。OllyDbg支持调试寄存器,其称为硬件断点。设断方法是在指定的代码行单击鼠标右键,执行“Breakpoint/Hardware,onexecution(断点/硬件执行”命令。registers(查看调试寄存器4013AA这行设置硬件断点。按F9键执行程序,程序就会中断在4013AA这一行,查看调试寄存器,会发现DR0的值为4013AA,如图2.26所示。2.26演示硬件断设置断点后,OllyDbgDR0~DR344013AADR7中设定相4013AA时,CPUOllyDbg发送异常信息,OllyDbg将该信面板,如图2.27所示,然后单击“Delete”按钮删除相应的硬件断点。2.27删除硬件断INT3断点容易被发现的地方,使用硬件断点来代替会有很好的效果;缺点就是最多能使用4个断点。OllyDbg可以设置内存断点或内存写入断点,原理是对所设的地址设为不可/不可写属性,这样当/写入的时候就会产生异常,OllyDbg截获异常后比较异常地址是不是断点地址,如果是就中断,内存断点会降低OllyDbg速度,因为每次异常时都要通过比较来确定是否应该停下,也许OllyDbg可dword[405528],;对[405528]地址处的内存dword;对[405528]地址处的内004013D0004013D0 dwordptr[405528],2.28设置内存写入断F9键让程序跑起来,会马上中断在“4013D0mov405528],edx”这行。如果要清除内存断点,单击鼠标右键,执行“Breakpoint/Removememorybreakpoint(断点/删除内存断点对代码也可下内存断点。在OllyDbg里重新加载实例,随意定位一行代码,如4013D6,单击鼠标右键,执行“Breakpoint/Memory,onaccess(断点/内存如图2.29所示。图2.29设置内存断会中断在4013D6这行所下的内存断点上。这个实验表明内存执行的地方,也可以用内存中断。内存断点不修改原代码。它不会像INT3断点那样,因为修改代码被程序校验而导致中断失败,因此WindowsOllyDbg里按“Alt+M”键显示内存,可以看到许多段,每个段都有不可、读、写、执行属性。在相应的段上单击右键,如图2.30所示,会发现一个命令“Set性断点,当所在段被或执行时就中断,中断发生以后,断点将被删除。想捕捉调用或返回到某个模块时,如后面章节中的脱壳时,该类断点就显得特别有用。右键中的“Setmemorybreakpointonaccess(设2.30对区块设置内存断(hwnd(msgTraceMe.exeOllyDbg里运行实例,输入用户名与序列号,单击菜单“View/Windows(查看/窗口或单击中的按钮,列出窗口相关参数,如图2.31所示。2.31列出窗口相关参ID2.32设置消息断在弹出的右键菜单中,执行“MessagebreakpointonClassProc(ClassProc上设置消息断点出如图2.33所示的设置窗口。当用鼠标左键单击按钮并松开时,会发送WM_LBUTTONUP2.33中的下拉菜单选择“202WM_LBUTTONUP”,再单击“OK”按钮,至此消息断点设置好了。2.33WinProc上设消息断77D3B00E[ESP+8]==WMedi,ebp,ecx,dwordptrVC可执行文件的执行代码是存放在代码段里的,本例就是.text区块里。当从系统代码回到应用程序键打开内存窗口,对.text区块下内存断点,执行右键菜单命令“Setbreak-on-access(在上设置断点F2,如图2.34所示。图2.34对代码段下内存断eax,;eax,;Switch(casesdwordptr[esp+10],byteptres:[edi],byteptrAeax,5BC;Case3F5ofswitch GetDlgItemTextA>;/Count=51;;|ControlID=6E;;图2.35所示。2.35删除消息断在调试过程中,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论