OllyDBG破解工具入门教程

合集下载

使用OllyDbg从零开始Cracking 第九章-基本概念

使用OllyDbg从零开始Cracking 第九章-基本概念

第九章-基本概念本章我们将开始破解。

我们先从基本的概念开始一步步的来介绍破解所需要的步骤。

本次实验依然是我们熟悉的Cruehead`a的CrackMe,但是不要把自己局限于破解这个简单的CrackMe的不同方式-在此过程中,我们将介绍适用于更加复杂的软件的一些标准方法。

让我们用调试器开始破解之旅吧。

通过这个CrackMe我们可以掌握一些基本的概念。

入口点:程序刚刚被加载第一条指令的地址。

为了不和OEP(原始入口点)相混淆,我们稍后再来介绍OEP的概念。

当用OD加载应用程序后,调试器就会停在入口点处,分析代码并且等待用户的进一步提示。

对于Cruehead`a的CrackMe这个程序来说,入口点为401000。

通常情况下,状态栏会显示调试器暂停的原因。

现在就提示我们,当前是入口点:大部分(99%)的程序启动的时候都会停在入口点处。

还有一些程序通过一些修改方式让其在启动的时候不停在入口点处。

这些方法我们将在后面讨论。

这些方法就是我们常说的反调试。

接下来,让我们来了解一下DLL(动态链接库)的概念以及DLL导出函数的功能。

注意一下突出显示的部分,举个例子,比如我们要调用401020或者要跳转到421367,这里会是外部函数的名称替代了这个绝对地址。

CALL LoadIconA在最右边的列中显示了一些额外的信息,调用的是LoadIconA。

Windows操作系统支持的所谓的动态链接库(扩展名为DLL文件),它们与正常的可执行文件EXE具有相同的格式。

动态链接库可导出函数供其他可执行文件(EXE和DLL)调用。

不是在多个可执行文件中有相同的静态副本,而是把功能放置在DLL中。

如果一个功能的代码量很大,那么这样就可以缩减可执行文件的大小,更重要的是可以节省内存。

Windows的基本功能:文件,内存,进程,线程,图形,声音,网络等都是在标准的动态链接库中实现的。

LoadIconA是在User32.dll中实现的一个加载位图的应用程序接口。

OllyDBG新手使用说明书

OllyDBG新手使用说明书

OllyDBG 新手使用说明书OLLYDBG完全教程(一)一、什么是 OllyDbg ?OllyDbg 是一种具有可视化界面的 32 位汇编 - 分析调试器。

它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。

Version 1.10 是最终的发布版本。

这个工程已经停止,我不再继续支持这个软件了。

但不用担心:全新打造的OllyDbg 2.00 不久就会面世!运行环境: OllyDbg 可以以在任何采用奔腾处理器的Windows 95、98、ME、NT或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用 300-MHz以上的奔腾处理器以达到最佳效果。

还有, OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[ Trace ]之类的扩展功能话,建议您最好使用 128MB以上的内存。

支持的处理器:OllyD 的数据格式,但是不支持SSE2 指令集。

bg 支持所有80x86、奔腾、 MMX、3DNOW!、 Athlon 扩展指令集、 SSE指令集以及相关配置:有多达百余个(天呀!)选项用来设置OllyDbg 的外观和运行。

数据格式: OllyDbg 的数据窗口能够显示的所有数据格式: HEX、ASCII 、UNICODE、 16/32 位有 / 无符号 /HEX 整数、32/64/80 位浮点数、地址、反汇编( MASM、IDEAL或是 HLA)、PE文件头或线程数据块。

帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。

如果您还有 Windows API帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。

启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到 OllyDbg 中,或者重新启动上一个被调试程序,或是挂接[ Attach ]一个正在运行的程序。

OD(OllyDbg)使用教程

OD(OllyDbg)使用教程
运行OllyDbg后,打开选项/调试设置
程序运行之后,在系统 空间里会触发一个INT3
文件入口点
程序的Winmain()函数入口点, 但一般都是在文件入口点
设置完成之后,载入文件,出现如图所示:
虚拟地址
机器码:
CPU执行的机器 代码
汇编指令: 和机器码对应的
程序代码
3、单步跟踪
调试器一个最基本功能就是动态跟踪,OllyDbg单步跟踪功能键:
目的:可以让软件运行的时候停在设断点的地方,以方便 反复跟踪调试
当关闭程序时,OllyDbg会将设置好的断点保存在UDD文件 中,下次运行时还有效。
5、调试分析:
调试分析其实就是分析程序代码的意义,如图:
阅读这些代码时,首先要搞清楚各API函数的定义,还弄明白 那些汇编程序代码的具体含义
6、保存修改后的文件
这里又回到traceme的领空了我们可以按altb调出断点窗口然后将getdlgitemtexta的断点改为已禁止202137chenli18接下来就在004011ae下一个断点因为这里有调用到getdlgitemtexta这个函数然后就要开始分析这些汇编代码的意义所以我们在使用这个软件的时候一定要明白这些代码的含义现在我们只是先认识一下这个软件的作用所以就不为大家做出分析接下来就是修改代码了
注意:此时的领空是模块USER32,领空就是在
某一时刻,CPU的CS:EIP所指向代码的所有者
领空
接着,在USER32的领空中,在77D6B05E代码行按下F2, 下断点,然后按F9运行,然后键入下图所示:
点check,可以看到程序被OD截停在下断点的地方,如图所示: 接着,按Alt+F9,返回到用户代码,可以回到:
图中红色的就是我们修改的地方,然后就点右键,复制到 文件,就可以保存当前的修改

ollydbg破解教学之万能断点篇

ollydbg破解教学之万能断点篇

ollydbg破解教学之万能断点篇有的只是OD不能下万能断点的断⾔,⼀时⼼恢之极,可是我原来⽤TRW和SICE⽤的挺好,谁知系统⼜跟我闹⽭盾,⼀⽤TRW和SICE就死机,没办法我现在只能⽤OD,我写的⼀些破解⽂章都是⽤OD破的,反复试验,我终于发现OD也能下万能断点,在我以前写的⼀些⽂章中好象有⼀篇简单提到过,但没有说的很详细,这次静下⼼,想写⼀点东西,送给我⼼爱的组织DFCG吧,我的破解是从DFCG组织起步的,很感谢DFCG的⾼⼿们的帮助,在此说声谢谢!为了更明确,这次破解所使⽤的调试器OD是从看雪论坛临时下载的OD1.09的汉化版,没有使⽤我⾃⼰⼿头经过改造的OD,在此也感谢看雪论坛,这⾥真的有很多⾼⼿,在这个论坛我也学到了很多.这次破解的对象是超级XX王,为保护国产软件我隐去了软件相关信息,我不想给⾃⼰带来⿇烦,现在⼯作很忙,能少⼀点⿇烦就尽量少⼀点吧.破解作者yzez[DFCG]破解⼯具ollydbg汉化版,下载https:///softs/58565.html破解⽬的本不为破解⽽破解,只因为技术⽽破解破解环境WINDOWS XP,这个我已经在98和XP下各做了两次,贴图和我这篇⽂章是在XP系统下完成的.破解过程1.检查了⼀下,该程序⽆壳,C++编译,⽤W32DSM反汇编⼀堆乱码,我倒!那就动态调试吧!⽤ollydbg1.09载⼊程序,这次我将教你们如何⽤OD下万能断点,过程我尽可能详细⼀点,下⾯请看.载⼊程序选OD菜单栏上的插件-----命令⾏(快捷键是ALT+F1),在弹出的窗⼝中输⼊万能断点命令:bpx hmemcpy,按ENTER键,结果⼜出现⼀个对话框:Intermodular calls00401164 CALL DWORD PTR DS:[<&USER32.GetWindowRect>] USER32.GetWindowRect0040118F CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect00401279 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect004013E1 CALL DWORD PTR DS:[<&USER32.GetClientRect>] USER32.GetClientRect0040190A CALL DWORD PTR DS:[<&KERNEL32.GetThreadLocale>] kernel32.GetThreadLocale0040191C CALL DWORD PTR DS:[<&KERNEL32.GetLocaleInfoA>] kernel32.GetLocaleInfoA还有很多,我就省略了,在这个框⾥右键单击,出现⼀个对话框,选中在每个命令中设置断点(热键是S),单击,你看每⼀⾏都变成了红⾊吧,这表⽰全部设下断点了,后⾯的过程很烦燥,你要⼀边按F9,边按F2把⼀些⽆⽤的断点去掉,有⼀点耐⼼吧,当然也可以不这样做,但遇到断点跳不过的时候,你就得按F2把这个断点去掉.感觉在这⼀点上OD⽐不上TRW和SICE,到出现注册信息框后,你要输⼊注册信息,然后按确定,程序被断下来,我的序列号是:GK342QZ0C6RE03L,我输⼊试验码:123456789098765.程序中断在下⾯:00471F71 CALL DWORD PTR DS:[<&USER32.GetWindowTex>****按确定后回到OD程序中断在此,按F8⾛,在此还没有到关键处!*****************************************************注意这⾥会循环两次,分别处理序列号和试验码,按F8⾛00471F77 LEA ECX,DWORD PTR DS:[EAX+1]00471F7A PUSH ECX00471F7B MOV ECX,DWORD PTR SS:[EBP+10]00471F7E PUSH EAX00471F7F CALL SuperPIM.0043E15D00471F84 PUSH EAX00471F85 PUSH ESI00471F86 CALL DWORD PTR DS:[<&USER32.GetWindowTex>00471F8C MOV ECX,DWORD PTR SS:[EBP+10]00471F8F PUSH -100471F91 CALL SuperPIM.00401D6A00471F96 JMP SHORT SuperPIM.00471FA300471F98 MOV EAX,DWORD PTR SS:[EBP+10]00471F9B PUSH DWORD PTR DS:[EAX]00471F9D PUSH ESI00471F9E CALL SuperPIM.00470B6100471FA4 POP ESI00471FA5 POP EBP00471FA6 RETN 0C*************************************程序第⼆次循环后最后会返回到0040FE99下⾯看代码:----------------------------------------------------------------------------------------------------------0040FE99 LEA EAX,DWORD PTR SS:[EBP-14]****第⼆次循环后会返回到这⾥,注意这就是我们要找的关键地⽅,按F8往下!0040FE9C PUSH EAX0040FE9D CALL SuperPIM.00433D92***********这就是关键CALL,按F7追进,⼀定要进,因为算法就在这⾥⾯!0040FEA2 POP ECX0040FEA3 AND DWORD PTR SS:[EBP-4],00040FEA7 LEA ESI,DWORD PTR DS:[EDI+74]0040FEAA MOV EAX,DWORD PTR DS:[ESI]******试验码⼊EAX0040FEAC CMP DWORD PTR DS:[EAX-C],0******⽐较试验码输⼊了吗?0040FEB0 JE SHORT SuperPIM.0040FF2F******没有输⼊就跳⾛,⼀跳就失败!0040FEB2 PUSH 280040FEB4 LEA EAX,DWORD PTR SS:[EBP-18]0040FEB7 PUSH ESI0040FEB8 PUSH EAX0040FEB9 CALL SuperPIM.0042CEC8**********此CALL对输⼊的注册码进⾏处理,得到⼀个40位的长字符串,有兴趣⾃⼰跟,******************************************我已是头晕的很,不想跟进!0040FEBE LEA ECX,DWORD PTR SS:[EBP-14]0040FEC1 PUSH ECX0040FEC2 PUSH EAX0040FEC3 CALL SuperPIM.0040F9B7**********此CALL对序列号处理,也是得到⼀个40位的长字符串0040FEC8 MOV ECX,DWORD PTR SS:[EBP-18]0040FECB ADD ESP,140040FECE ADD ECX,-100040FED1 MOV BYTE PTR SS:[EBP-D],AL0040FED4 CALL SuperPIM.00401B5D**********此CALL进⾏⽐较,注册码不对,值为00040FED9 CMP BYTE PTR SS:[EBP-D],0*******⽐较是0吗?0040FEDD JE SHORT SuperPIM.0040FF2F******相等就跳,跳就失败,所以⼀定不能跳!0040FEDF PUSH 0**************************不跳往下你就成功了!下⾯代码省略! ...............................................................省略若⼲代码!.........................============================================================================================================= ************************************关键CALL的代码!*******************************************************00433D92 MOV EAX, SuperPIM.0049844E****追进关键CALL后我们来到这⾥!00433D97 CALL SuperPIM.0045090000433D9C PUSH ECX00433D9D PUSH ECX00433D9E AND [LOCAL.5], 000433DA2 LEA EAX, [LOCAL.5]00433DA5 PUSH EAX00433DA6 CALL SuperPIM.00433CA9********此CALL根据电脑硬件信息得到你的序列号,有兴趣跟吧!我是没有兴趣!00433DAB AND [LOCAL.1], 000433DAF PUSH 1400433DB1 LEA EAX, [LOCAL.5]00433DB4 PUSH EAX00433DB5 LEA EAX, [LOCAL.4]00433DB8 PUSH EAX00433DB9 CALL SuperPIM.0042CEC8*******算法CALL(1),按F7跟进!00433DBE PUSH 2800433DC0 LEA EAX, [LOCAL.4]00433DC3 PUSH EAX00433DC4 PUSH [ARG.1]00433DC7 MOV BYTE PTR SS:[EBP-4], 100433DCB CALL SuperPIM.0042CEC800433DD0 MOV ECX, [LOCAL.4]00433DD3 ADD ESP, 1C00433DD6 ADD ECX, -10*****************************省略N⾏代码!********************************************************0043454B RETN=========================================================================================================== ***********************************算法CALL!*********************************************************0042CEC8 MOV EAX, SuperPIM.00497B52********追进算法CALL我们在这⾥!0042CECD CALL SuperPIM.004509000042CED2 SUB ESP, 140042CED5 PUSH EBX0042CED6 PUSH ESI0042CED7 XOR EBX, EBX0042CED9 PUSH EDI0042CEDA MOV [LOCAL.8], EBX0042CEDD CALL SuperPIM.004639B50042CEE2 MOV EDX, DWORD PTR DS:[EAX]0042CEE4 MOV ECX, EAX0042CEE6 CALL DWORD PTR DS:[EDX+C]0042CEE9 LEA EDI, DWORD PTR DS:[EAX+10]0042CEEC MOV [LOCAL.4], EDI0042CEEF MOV EAX, [ARG.2]0042CEF2 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L移⼊EAX0042CEF4 MOV ESI, DWORD PTR DS:[EAX-C]*****序列号的位数15(⼗六进制值是F)送⼊ESI0042CEF7 CMP ESI, EBX**********************⽐较ESI和EBX,ESI的值是F即序列号位数,EBX的初始值是00042CEF9 MOV [LOCAL.1], EBX0042CEFC MOV [LOCAL.8], ESI0042CEFF JE SuperPIM.0042CFB2*************相等就跳,这⾥当然不相等,所以就不会跳!0042CF05 MOV EAX, [ARG.3]******************常数14(⼗进制值是20)送⼊EAX0042CF08 CMP EAX, ESI**********************⽐较EAX和ESI,即14和F⽐较!0042CF0A MOV [LOCAL.6], EAX0042CF0D JG SHORT SuperPIM.0042CF12*******⼤于就跳!0042CF0F MOV [LOCAL.6], ESI0042CF12 CMP [LOCAL.6], EBX****************跳到这⾥!⽐较14和00042CF15 JLE SuperPIM.0042CFB2*************⼩于就跳,这⾥当然不会⼩!所以不跳!0042CF1B MOV EAX, EBX**********************0移⼊EAX0042CF1D CDQ***********************************EDX清0,准备计算!0042CF1E IDIV ESI***************************除,EAX/ESI ,EAX的值是0,ESI的值存放序列号的位数F0042CF20 MOV EAX, [ARG.2]******************赋EAX地址值0042CF23 MOV EAX, DWORD PTR DS:[EAX]*******序列号:GK342QZ0C6RE03L移⼊EAX0042CF25 PUSH EBX***************************EBX⼊栈0042CF26 MOV AL, BYTE PTR DS:[EDX+EAX]*****序列号的第⼀位G(ASCII码值47)⼊AL0042CF29 MOV BYTE PTR SS:[EBP-1C], AL******保存值470042CF2C PUSH [LOCAL.7]0042CF2F CALL SuperPIM.0042CD8E*************算法CALL(2),按F7跟进!代码直接在下⾯给出============================================================================================================== ***************************算法CALL(2)*****************************************************0042CD8E PUSH EBP0042CD8F MOV EBP, ESP0042CD91 PUSH ECX*************************G的ASCII码值47⼊ECX0042CD92 MOVZX EAX, BYTE PTR SS:[EBP+8]****扩展成000000470042CD96 MOV ECX, [ARG.2]****************赋ECX的初始值为00042CD99 MOV [LOCAL.1], EAX0042CD9C MOV EAX, ECX********************ECX的值移⼊EAX0042CD9E IMUL EAX, ECX********************EAX=EAX*ECX=0*00042CDA1 LEA EAX, DWORD PTR DS:[EAX+EAX*2+7]**EAX+EAX*2+7的值7给EAX0042CDA5 IMUL EAX, ECX********************EAX=EAX*ECX=7*00042CDA8 ADD EAX, 0D*********************EAX=EAX+0D=D0042CDAB IMUL EAX, ECX********************EAX=EAX*ECX=D*0=00042CDAE PUSH ESI*************************序列号位数F⼊栈!0042CDAF LEA ESI, DWORD PTR DS:[ECX+5]0042CDB2 PUSH ESI0042CDB3 MOV [ARG.1], EAX0042CDB6 LEA EAX, [ARG.1]0042CDB9 PUSH 40042CDBB PUSH EAX0042CDBC CALL SuperPIM.0042CD2E***********这个CALL也在计算,我实在不想跟进!0042CDC1 PUSH ESI0042CDC2 LEA EAX, [LOCAL.1]0042CDC5 PUSH 40042CDC7 PUSH EAX0042CDC8 CALL SuperPIM.0042CD5E**********这个CALL也是计算CALL,烦!不跟了!0042CDCD MOV EAX, [ARG.1]0042CDD0 ADD ESP, 180042CDD3 XOR EAX, [LOCAL.1]*************这⾥赋EAX的值380000020042CDD6 POP ESI0042CDD7 LEAVE0042CDD8 RETN=========================================================================算法CALL(2)结束================== 0042CF34 POP ECX0042CF35 POP ECX0042CF36 PUSH 2B***************************常数2B⼊栈!0042CF38 XOR EDX, EDX0042CF3A POP ECX**************************把常数2B赋给ECX0042CF3B DIV ECX**************************除,EAX/ECX=38000002/2B=014D6535,余数1B⼊EDX0042CF3D MOV ECX, EDX*********************结果1B⼊ECX0042CF3F ADD CL, 30***********************CL=CL+30=1B+30=4B(对应的字符串是K)0042CF42 CMP CL, 39***********************⽐较是不是数字90042CF45 MOV BYTE PTR SS:[EBP-14], CL*****保存字符串K0042CF48 JLE SHORT SuperPIM.0042CF55******⼩于就跳⾛!0042CF4A CMP CL, 41***********************⽐较是不是A0042CF4D JGE SHORT SuperPIM.0042CF55******⼤于就跳⾛0042CF4F ADD CL, 0F60042CF52 MOV BYTE PTR SS:[EBP-14], CL0042CF55 CMP EBX, [ARG.3]*****************跳到这⾥!⽐较0和140042CF58 JGE SHORT SuperPIM.0042CF67******⼤于等于就跳⾛!0042CF5A PUSH [LOCAL.5]0042CF5D LEA ECX, [LOCAL.4]0042CF60 CALL SuperPIM.00417EAF0042CF65 JMP SHORT SuperPIM.0042CFA5******⽆条件跳0042CF67 MOV EAX, EBX0042CF69 CDQ0042CF6A IDIV [ARG.3]0042CF6D MOVSX ECX, CL0042CF70 PUSH 2B0042CF72 MOV ESI, EDX0042CF74 MOVSX EAX, BYTE PTR DS:[ESI+EDI]0042CF78 LEA EAX, DWORD PTR DS:[EAX+ECX-60]0042CF7C CDQ0042CF7D POP ECX0042CF7E IDIV ECX0042CF80 ADD DL, 300042CF83 CMP DL, 390042CF86 MOV BYTE PTR SS:[EBP-14], DL0042CF89 JLE SHORT SuperPIM.0042CF960042CF8B CMP DL, 410042CF8E JGE SHORT SuperPIM.0042CF960042CF90 ADD DL, 0F60042CF93 MOV BYTE PTR SS:[EBP-14], DL0042CF96 PUSH [LOCAL.5]0042CF99 LEA ECX, [LOCAL.4]0042CF9C PUSH ESI0042CF9D CALL SuperPIM.0042CE4B0042CFA2 MOV ESI, [LOCAL.8]0042CFA5 MOV EDI, [LOCAL.4]***************上⾯跳到这⾥!0042CFA8 INC EBX*************************EBX加10042CFA9 CMP EBX, [LOCAL.6]**************⽐较1和140042CFAC JL SuperPIM.0042CF1B***********⼩于就跳,循环,序列号只有15位,这⾥循环20次,取完后⼜从第⼀位取出! ************************************循环结束后得到的值是:K3L2LPBDW1F2H4B8S0UY这就是我们要的注册码!0042CFB2 MOV ECX, [ARG.1]0042CFB5 LEA EAX, [LOCAL.4]0042CFB8 PUSH EAX0042CFB9 CALL SuperPIM.00401F360042CFBE LEA ECX, DWORD PTR DS:[EDI-10]0042CFC1 CALL SuperPIM.00401B5D0042CFC6 MOV ECX, [LOCAL.3]0042CFC9 MOV EAX, [ARG.1]0042CFCC POP EDI0042CFCD POP ESI0042CFCE POP EBX0042CFCF MOV DWORD PTR FS:[0], ECX0042CFD6 LEAVE0042CFD7 RETN写这篇⽂章的⽬的是想说明如何在OD下万能断点,算法过程太烦琐,就不想多跟了!希望能对⼤家有点启发,如果觉得这篇破⽂还⾏帮我顶⼀下吧!也是希望有更多的⼈能看到,对更多的⼈有益,我也是⼀只菜鸟,请⼤家多多指点!。

OllyDBG完美教程

OllyDBG完美教程

OllyDBG完美教程(超强入门级)关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。

汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。

同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。

启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。

在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

ollydbg使用方法

ollydbg使用方法

ollydbg使用方法ollydbg是一款用于逆向工程和调试程序的强大工具。

它可以帮助我们分析和修改二进制文件,以理解程序的内部工作原理。

在本文中,我们将介绍ollydbg的使用方法,以帮助读者快速上手使用该工具。

一、ollydbg的安装和配置我们需要下载ollydbg的安装文件,并按照向导完成安装过程。

安装完成后,我们可以在程序菜单中找到ollydbg的快捷方式。

二、打开目标程序在ollydbg中打开目标程序的方法有两种:直接拖拽到ollydbg窗口中或通过菜单中的“文件”选项来打开程序。

无论使用哪种方法,我们都需要找到目标程序所在的路径,并选择打开。

三、调试程序1. 设置断点:在ollydbg中,断点是一种被设置在程序中的暂停执行的标记点。

我们可以通过双击程序中的某一行代码或者在该行代码上点击右键,然后选择“Toggle Breakpoint”来设置断点。

设置断点后,当程序执行到该行代码时,会自动停止执行,方便我们进行调试。

2. 单步执行:在调试过程中,我们可以使用单步执行功能来逐行执行程序。

我们可以通过菜单中的“调试”选项,或者使用快捷键F7来进行单步执行。

单步执行可以帮助我们逐行分析程序的执行流程,以及观察变量的值的变化。

3. 查看寄存器和内存:在调试过程中,我们经常需要查看程序中的寄存器和内存的值。

ollydbg提供了寄存器窗口和内存窗口,可以方便地查看这些信息。

我们可以通过菜单中的“窗口”选项,选择“寄存器”或者“内存”来打开相应的窗口。

4. 分析代码:在调试过程中,我们可以使用ollydbg的反汇编窗口来查看程序的汇编代码。

我们可以通过菜单中的“窗口”选项,选择“反汇编”来打开反汇编窗口。

反汇编窗口可以帮助我们分析程序的执行流程,以及理解代码的逻辑。

5. 修改变量值:在调试过程中,我们可以通过ollydbg来修改程序中的变量的值。

我们可以在变量所在的内存地址上点击右键,然后选择“修改”,来修改变量的值。

OllyDbg完全教程

OllyDbg完全教程

OLLYDBG完全教程(一) (1)OLLYDBG完全教程(二) (7)OLLYDBG完全教程(三) (13)OLLYDBG完全教程(四) (15)OLLYDBG完全教程(五) (19)OLLYDBG完全教程(六) (20)OLLYDBG完全教程(七) (22)OLLYDBG完全教程(八) (25)OLLYDBG完全教程(九) (28)OLLYDBG完全教程(十) (31)OLLYDBG完全教程(十一) (32)OLLYDBG完全教程(十二) (33)OLLYDBG完全教程(十三) (35)OLLYDBG完全教程(十四) (37)OLLYDBG完全教程(十五) (50)OLLYDBG完全教程(十六) (61)OLLYDBG完全教程(一)一,什么是 OllyDbg?OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。

它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。

Version 1.10 是最终的发布版本。

这个工程已经停止,我不再继续支持这个软件了。

但不用担心:全新打造的 OllyDbg 2.00 不久就会面世!运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。

还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。

支持的处理器: OllyD的数据格式,但是不支持SSE2指令集。

bg 支持所有80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以及相关配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。

数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。

使用OllyDbg从零开始Cracking

使用OllyDbg从零开始Cracking

第4章-汇编指令之前的章节主要是理论知识,现在我们要在OllyDbg中实践一下,为后面打开基础。

OllyDbg中几乎所有的标志我都有考虑,如果你遇到了我没有给出的指令,你可以查阅更加全面的汇编指南。

NOP(无操作)运行这条指令不会对寄存器,内存以及堆栈造成任何影响,英文单词的意思是”无操作”,也就是说,它没有特殊的用途。

例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误,多余的空间将会被NOP填充。

适当数目的nop指令可以将其他指令完全替换掉。

下面使用OllyDbg重新载入CrueHead'а(CrackMe的作者)的CrackMe。

我们可以看到反汇编的源代码,如上图第一条指令是PUSH 0,占两个字节,在这条指令上面单击鼠标右键选择Assemble.或者直接使用快捷键-空格键,在弹出窗口的编辑框中输入NOP。

写入NOP指令后单击Assemble按钮。

这里我们可以看到OD设计的非常智能,考虑到PUSH指令占两个字节,OD会使用两条NOP 指令进行替换,而不是使用一条NOP进行替换。

现在,在原来PUSH 0的地方显示的两条NOP指令,单击F7,指令一条NOP指令,可以看到,这里只改变了EIP(保存了下一条要执行指令的地址)寄存器的值,并没有影响到其他寄存器,堆栈或者标志位。

现在我们需要在数据窗口查看这两个字节,它们的内存地址分别是401000和401001。

在数据窗口中,鼠标右键选择-“Go to”-“Expression”,输入你需要转到的地址。

这里我们需要输入401000。

红色突出显示的是刚刚修改过的字节。

前两个是90,然后E8,FF和04,00,00。

这是一个Call 指令的所有剩余字节。

OD可以撤销我们修改的指令吗?呵呵,当然啦。

在数据窗口或者反汇编窗口中,鼠标拖选中两个字节。

然后单击鼠标右键,选择“UNDO SELECTION”。

这样就恢复了原来的PUSH指令。

在数据窗口中的话,你就可以看到它原始的字节了。

OllyDbg入门完全教程

OllyDbg入门完全教程

OllyDbg完全教程目录第一章概述 (1)第二章组件 (5)一、一般原理[General prnciples] (5)二、反汇编器[Disassembler] (8)三、分析器[Analysis] (9)四、Object扫描器[Object scanner] (12)五、Implib扫描器[Implib scanner] (12)第三章OllyDbg的使用 (13)一、如何开始调试[How to start debugging session] (13)二、CPU窗口[CPU window] (14)三、断点[Breakpoints] (14)四、数据窗口[Dump] (15)五、可执行模块窗口[Executable modules window] (16)六、内存映射窗口[Memory map window] (17)七、监视与监察器[Watches and inspectors] (19)八、线程[Threads] (19)九、调用栈[Call stack] (20)十、调用树[Call tree] (21)十一、选项[Options] (21)十二、搜索[Search] (22)十三、自解压文件[Self—extracting(SFX)files] (22)十四、单步执行与自动执行[Step—by—step execution and animation] (23)十五、Hit跟踪[Hit trace] (23)十六、Run跟踪[Run trace] (24)十七、快捷键 (26)十八、插件[Plugins] (29)十九、技巧提示[Tips and tricks] (29)第四章其他功能 (30)一、调试独立的DLL[Debugging of stand—alone DLLs] (30)二、解码提示[Decoding hints] (32)三、表达式赋值[Evaluation of expressions] (32)四、自定义函数描述[Custom function descriptions] (34)第一章概述OllyDbg是一种具有可视化界面的32位汇编—分析调试器。

OllyDBG入门教程

OllyDBG入门教程

OllyDBG 入门系列(一)-认识OllyDBG一、OllyDBG的安装与配置OllyDBG1.10版的发布版本是个ZIP压缩包,只要解压到一个目录下,运行OllyDBG.exe就可以了。

汉化版的发布版本是个RAR压缩包,同样只需解压到一个目录下运行OllyDBG.exe即可:OllyDBG中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考TT小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的CPU寄存器内容。

同样点击标签寄存器(FPU)可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG就可以生效了。

启动后我们要把插件及UDD的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把OllyDBG解压在F:\OllyDBG目录下,所以相应的UDD目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。

在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个UDD目录不清楚。

我这简单解释一下:这个UDD目录的作用是保存你调试的工作。

OllyDbg入门完全教程(完美排版)

OllyDbg入门完全教程(完美排版)

OllyDbg完全教程目录第一章概述 (1)第二章组件 (5)一、一般原理[General prnciples] (5)二、反汇编器[Disassembler] (8)三、分析器[Analysis] (9)四、Object扫描器[Object scanner] (12)五、Implib扫描器[Implib scanner] (12)第三章 OllyDbg的使用 (13)一、如何开始调试[How to start debugging session] (13)二、CPU 窗口[CPU window] (14)三、断点[Breakpoints] (14)四、数据窗口[Dump] (15)五、可执行模块窗口[Executable modules window] (16)六、内存映射窗口[Memory map window] (17)七、监视与监察器[Watches and inspectors] (19)八、线程[Threads] (19)九、调用栈[Call stack] (20)十、调用树[Call tree] (21)十一、选项[Options] (21)十二、搜索[Search] (22)十三、自解压文件[Self—extracting (SFX) files] (22)十四、单步执行与自动执行[Step—by—step execution and animation] (23)十五、Hit跟踪[Hit trace] (23)十六、Run 跟踪[Run trace] (24)十七、快捷键 (26)十八、插件[Plugins] (29)十九、技巧提示[Tips and tricks] (29)第四章其他功能 (30)一、调试独立的DLL[Debugging of stand—alone DLLs] (30)二、解码提示[Decoding hints] (32)三、表达式赋值[Evaluation of expressions] (32)四、自定义函数描述[Custom function descriptions] (34)第一章概述OllyDbg 是一种具有可视化界面的32 位汇编—分析调试器。

使用OllyDbg从零开始Cracking 第二十一章

使用OllyDbg从零开始Cracking 第二十一章

第二^一章-OllyDbg 反调试之检测OD 进程名,窗口类名,窗口标题名本章我们继续讨论反调试,将我修改过的一个CrackMe 作为本章的实验对象。

该CrackMe 的名字叫做buggers,其中做的一些修改是为了介绍检测OllyDbg 进程名的其他一些API 函数,同时该CrackMe 也涵盖 了检测OllyDbg 窗口标题名以及窗口类名等知识点。

我们打开原始的OllyDbg 程序,不使用重命名的,因为本章我们将对上一章的检测OD 的方法进行延伸,因此让OD 的文件名是OllyDbg.exe,保证该CrackMe 可以检测出来OD 。

我们用OD 加载该CrackMe,接着将HideDebugger1.23版插件的IsDebuggerPersent 选项勾选上。

这里只是为了防止该程序调用IsDebuggerPresent 对OD 进行检测。

我们打开原始的OllyDbg.exe,然后打开任务管理器,确保OD 的进程名为”O LLYDBG.EXE ,Archive Opciones Ver Apagar AyudaAplicaciones ProcesosRendimientoFunciones de red UsuariosNombre de imagen PID Nombre de us... CPU 1 Use de ...taskmgr.exe 3128 Ricardo 00 4.640 KB OLLYDBG.EXE 2680 Ricardo00 5.504 KB alg.exe2648 5ERVICIO LOCAL001.260 KB'nTi —.t,Pi i.—Fl Fl好了,我们回到buggers3,看看该程序使用了哪些API 函数。

or de tareas deows1314001 I33040013314001 5 3314001Follow in Dump View 匚all tree►Cfrl+KI Search for► Name (label) in current module Ctrl+N Find references to► Name in all modulesView►I,—'i —b m KVb -iV-ifAL+l■- l-L 匚HideDebugger 插件的配置如下:我的天啦!API 列表中居然只是唯一的一个函数ExitProcess,其他API 函数应该都是通过GetProcAddress 加载的,但是GetProcAddress 也不在该列表中。

OllyICE使用实例教程-初学必备

OllyICE使用实例教程-初学必备

OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。

汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。

同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。

启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。

在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个 UDD 目录不清楚。

使用OllyDbg从零开始Cracking

使用OllyDbg从零开始Cracking

使用OllyDbg从零开始Cracking第4章-汇编指令之前的章节主要是理论知识,现在我们要在OllyDbg中实践一下,为后面打开基础。

OllyDbg中几乎所有的标志我都有考虑,如果你遇到了我没有给出的指令,你可以查阅更加全面的汇编指南。

NOP(无操作)运行这条指令不会对寄存器,内存以及堆栈造成任何影响,英文单词的意思是”无操作”,也就是说,它没有特殊的用途。

例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误,多余的空间将会被NOP填充。

适当数目的nop指令可以将其他指令完全替换掉。

下面使用OllyDbg重新载入CrueHead'а(CrackMe的作者)的CrackMe。

我们可以看到反汇编的源代码,如上图第一条指令是PUSH 0,占两个字节,在这条指令上面单击鼠标右键选择Assemble.或者直接使用快捷键-空格键,在弹出窗口的编辑框中输入NOP。

写入NOP指令后单击Assemble按钮。

1这里我们可以看到OD设计的非常智能,考虑到PUSH指令占两个字节,OD会使用两条NOP指令进行替换,而不是使用一条NOP进行替换。

现在,在原来PUSH 0的地方显示的两条NOP指令,单击F7,指令一条NOP指令,可以看到,这里只改变了EIP(保存了下一条要执行指令的地址)寄存器的值,并没有影响到其他寄存器,堆栈或者标志位。

现在我们需要在数据窗口查看这两个字节,它们的内存地址分别是401000和401001。

在数据窗口中,鼠标右键选择-“Go to”-“Expression”,输入你需要转到的地址。

这里我们需要输入401000。

红色突出显示的是刚刚修改过的字节。

前两个是90,然后E8,FF和04,00,00。

这是一个Call指令的所有剩余字节。

OD可以撤销我们修改的指令吗?2呵呵,当然啦。

在数据窗口或者反汇编窗口中,鼠标拖选中两个字节。

然后单击鼠标右键,选择“UNDO SELECTION”。

OllyDBG2.01软件调试入门教程

OllyDBG2.01软件调试入门教程

OllyDB‎G2.01 入门系列(一)-认识Olly‎DBG一、OllyDB‎G的安装与配置‎OllyDB‎G1.10版的发布版本‎是个ZIP压缩包,只要解压到一‎个目录下,运行OllyDB‎G.exe就可以了。

汉化版的发布‎版本是个RAR压缩包,同样只需解压‎到一个目录下‎运行OllyDB‎G.exe即可:OllyDB‎G中各个窗口的‎功能如上图。

简单解释一下‎各个窗口的功‎能,更详细的内容‎可以参考TT小组翻译的中‎文帮助:反汇编窗口:显示被调试程‎序的反汇编代‎码,标题栏上的地‎址、HEX数据、反汇编、注释可以通过‎在窗口中右击‎出现的菜单界面选项->隐藏标题或显示标题来进行切换是‎否显示。

用鼠标左键点‎击注释标签可‎以切换注释显‎示的方式。

寄存器窗口:显示当前所选‎线程的CPU寄存器内容。

同样点击标签‎寄存器(FPU)可以切换显示‎寄存器的方式‎。

信息窗口:显示反汇编窗‎口中选中的第‎一个命令的参‎数及一些跳转‎目标地址、字串等。

数据窗口:显示内存或文‎件的内容。

右键菜单可用‎于切换显示方‎式。

堆栈窗口:显示当前线程‎的堆栈。

要调整上面各‎个窗口的大小‎的话,只需左键按住‎边框拖动,等调整好了,重新启动一下‎OllyDB‎G就可以生效了‎。

启动后我们要‎把插件及UDD的目录配置为‎绝对路径,点击菜单上的‎选项->界面,将会出来一个‎界面选项的对‎话框,我们点击其中‎的目录标签:因为我这里是‎把OllyDB‎G解压在F:\OllyDB‎G目录下,所以相应的UDD目录及插件目‎录按图上配置‎。

还有一个常用‎到的标签就是‎上图后面那个‎字体,在这里你可以‎更改OllyDB‎G中显示的字体‎。

上图中其它的‎选项可以保留‎为默认,若有需要也可‎以自己修改。

修改完以后点‎击确定,弹出一个对话‎框,说我们更改了‎插件路径,要重新启动OllyDB‎G。

在这个对话框‎上点确定,重新启动一下‎OllyDB‎G,我们再到界面‎选项中看一下‎,会发现我们原‎先设置好的路‎径都已保存了‎。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OllyDBG破解工具入门教程一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。

汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标或显示标题 来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。

同样点击标签 寄存器 (FPU) 可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。

启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的 选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。

在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个 UDD 目录不清楚。

我这简单解释一下:这个 UDD 目录的作用是保存你调试的工作。

比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时 OllyDBG 就会把你所做的工作保存到这个 UDD 目录,以便你下次调试时可以继续以前的工作。

如果不设置这个 UDD 目录,OllyDBG 默认是在其安装目录下保存这些后缀名为 udd 的文件,时间长了就会显的很乱,所以还是建议专门设置一个目录来保存这些文件。

另外一个重要的选项就是调试选项,可通过菜单 选项->调试设置 来配置:新手一般不需更改这里的选项,默认已配置好,可以直接使用。

建议在对 OllyDBG 已比较熟的情况下再来进行配置。

上面那个异常标签中的选项经常会在脱壳中用到,建议在有一定调试基础后学脱壳时再配置这里。

除了直接启动 OllyDBG 来调试外,我们还可以把 OllyDBG 添加到资源管理器右键菜单,这样我们就可以直接在 .exe 及 .dll 文件上点右键选择“用Ollydbg打开”菜单来进行调试。

要把 OllyDBG 添加到资源管理器右键菜单,只需点菜单 选项->添加到浏览器,将会出现一个对话框,先点击“添加 Ollydbg 到系统资源管理器菜单”,再点击“完成”按钮即可。

要从右键菜单中删除也很简单,还是这个对话框,点击“从系统资源管理器菜单删除 Ollydbg”,再点击“完成”就行了。

OllyDBG 支持插件功能,插件的安装也很简单,只要把下载的插件(一般是个 DLL 文件)复制到 OllyDBG 安装目录下的 PLUGIN 目录中就可以了,OllyDBG 启动时会自动识别。

要注意的是 OllyDBG 1.10 对插件的个数有限制,最多不能超过 32 个,否则会出错。

建议插件不要添加的太多。

到这里基本配置就完成了,OllyDBG 把所有配置都放在安装目录下的 ollydbg.ini 文件中。

二、基本调试方法OllyDBG 有三种方式来载入程序进行调试,一种是点击菜单 文件->打开 (快捷键是 F3)来打开一个可执行文件进行调试,另一种是点击菜单 文件->附加 来附加到一个已运行的进程上进行调试。

注意这里要附加的程序必须已运行。

第三种就是用右键菜单来载入程序(不知这种算不算)。

一般情况下我们选第一种方式。

比如我们选择一个 test.exe 来调试,通过菜单 文件->打开 来载入这个程序,OllyDBG 中显示的内容将会是这样:调试中我们经常要用到的快捷键有这些:F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。

(相当于 SoftICE 中的 F9)F8:单步步过。

每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。

(相当于 SoftICE 中的 F10)F7:单步步入。

功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。

(相当于 SoftICE 中的 F8)F4:运行到选定位置。

作用就是直接运行到光标所在位置处暂停。

(相当于 SoftICE 中的 F7)F9:运行。

按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。

(相当于 SoftICE 中的 F5)CTR+F9:执行到返回。

此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。

(相当于 SoftICE 中的 F12)ALT+F9:执行到用户代码。

可用于从系统领空快速返回到我们调试的程序领空。

(相当于 SoftICE 中的 F11)上面提到的几个快捷键对于一般的调试基本上已够用了。

要开始调试只需设置好断点,找到你感兴趣的代码段再按 F8 或 F7 键来一条条分析指令功能就可以了。

就写到这了,改天有空再接着灌。

OllyDBG 入门之字串参考现在我们开始正式进入破解。

今天的目标程序是看雪兄《加密与解密》第一版附带光盘中的 镜像打包中的 CFF Crackme #3,采用用户名/序列号保护方式。

原版加了个 UPX 的壳。

刚开始学破解先不涉及壳的问题,我们主要是熟悉用 OllyDBG 来破解的一般方法。

我这里把壳脱掉来分析,附件是脱壳后的文件,直接就可以拿来用。

先说一下一般软件破解的流程:拿到一个软件先别接着马上用 OllyDBG 调试,先运行一下,有帮助文档的最好先看一下帮助,熟悉一下软件的使用方法,再看看注册的方式。

如果是序列号方式可以先输个假的来试一下,看看有什么反应,也给我们破解留下一些有用的线索。

如果没有输入注册码的地方,要考虑一下是不是读取注册表或 Key 文件(一般称 keyfile,就是程序读取一个文件中的内容来判断是否注册),这些可以用其它工具来辅助分析。

如果这些都不是,原程序只是一个功能不全的试用版,那要注册为正式版本就要自己来写代码完善了。

有点跑题了,呵呵。

获得程序的一些基本信息后,还要用查壳的工具来查一下程序是否加了壳,若没壳的话看看程序是什么编译器编的,如 VC、Delphi、VB 等。

这样的查壳工具有 PEiD 和 FI。

有壳的话我们要尽量脱了壳后再来用 OllyDBG 调试,特殊情况下也可带壳调试。

下面进入正题:我们先来运行一下这个 crackme(用 PEiD 检测显示是 Delphi 编的),界面如图:这个 crackme 已经把用户名和注册码都输好了,省得我们动手^_^。

我们在那个“Register now !”按钮上点击一下,将会跳出一个对话框:好了,今天我们就从这个错误对话框中显示的“Wrong Serial, try again!”来入手。

启动 OllyDBG,选择菜单 文件->打开 载入 CrackMe3.exe 文件,我们会停在这里:我们在反汇编窗口中右击,出来一个菜单,我们在 查找->所有参考文本字串 上左键点击:当然如果用上面那个 超级字串参考+ 插件会更方便。

但我们的目标是熟悉 OllyDBG 的一些操作,我就尽量使用 OllyDBG 自带的功能,少用插件。

好了,现在出来另一个对话框,我们在这个对话框里右击,选择“查找文本”菜单项,输入“Wrong Serial, try again!”的开头单词“Wrong”(注意这里查找内容要区分大小写)来查找,找到一处:在我们找到的字串上右击,再在出来的菜单上点击“反汇编窗口中跟随”,我们来到这里:见上图,为了看看是否还有其他的参考,可以通过选择右键菜单查找参考->立即数,会出来一个对话框:分别双击上面标出的两个地址,我们会来到对应的位置:大家注意看一下上面的注释,我在上面标了两个关键点。

有人可能要问,你怎么知道那两个地方是关键点?其实很简单,我是根据查看是哪条指令跳到“wrong serial,try again”这条字串对应的指令来决定的。

如果你在 调试选项->CPU 标签中把“显示跳转路径”及其下面的两个“如跳转未实现则显示灰色路径”、“显示跳转到选定命令的路径”都选上的话,就会看到是从什么地方跳到出错字串处的:我们在上图中地址 00440F2C 处按 F2 键设个断点,现在我们按 F9 键,程序已运行起来了。

我在上面那个编辑框中随便输入一下,如 CCDebuger,下面那个编辑框我还保留为原来的“754-GFX-IER-954”,我们点一下那个“Register now !”按钮,呵,OllyDBG 跳了出来,暂停在我们下的断点处。

我们看一下信息窗口,你应该发现了你刚才输入的内容了吧?我这里显示是这样:堆栈 SS:[0012F9AC]=00D44DB4, (ASCII "CCDebuger")EAX=00000009上面的内存地址 00D44DB4 中就是我们刚才输入的内容,我这里是 CCDebuger。

你可以在 堆栈 SS:[0012F9AC]=00D44DB4, (ASCII "CCDebuger") 这条内容上左击选择一下,再点右键,在弹出菜单中选择“数据窗口中跟随数值”,你就会在下面的数据窗口中看到你刚才输入的内容。

而 EAX=00000009 指的是你输入内容的长度。

如我输入的 CCDebuger 是9个字符。

如下图所示:现在我们来按 F8 键一步步分析一下:按一下 F7 键,进入这个 CALL,进去后光标停在这一句:按 F8 键一步步过来,我们只关心关键部分:根据上面的分析,我们知道用户名必须是“Registered User”。

我们按 F9 键让程序运行,出现错误对话框,点确定,重新在第一个编辑框中输入“Registered User”,再次点击那个“Register now !”按钮,被 OllyDBG 拦下。

相关文档
最新文档