OllyDbg 使用笔记 (十三)

参考

书:《加密与解密》

视频:小甲鱼 解密系列 视频

示例程序下载地址:http://pan.baidu.com/s/1hqBrJWo

方法一:内嵌补丁

加载程序,按F9运行,点击Enter Reg.Code 输入name,key等,先不要按OK ,到OD中 按Ctrl+N打开输入输出表,搜索KillTimer,设置断点。再点击注册窗口的OK,我们可以看见:

(也可以通搜索注册失败时弹出窗口中的“The registration code seems to be not valid” 来找到下面代码)

004DC19D   > \83F8 03       cmp     eax, 3
004DC1A0   .  75 1E         jnz     short 004DC1C0
004DC1A2   .  8B57 1C       mov     edx, dword ptr [edi+1C]          ;  Case 3 of switch 004DBDA4
004DC1A5   .  50            push    eax                              ; /TimerID
004DC1A6   .  52            push    edx                              ; |hWnd
004DC1A7   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DC1AD   .  6A 00         push    0
004DC1AF   .  6A 00         push    0
004DC1B1   .  68 5C666400   push    0064665C                         ;  ASCII "The registration code seems to be not valid.",LF,"Please check if you didn't made any mistake."
004DC1B6   .  E8 919D0D00   call    005B5F4C
004DC1BB   .  E9 B7000000   jmp     004DC277
004DC1C0   >  83F8 04       cmp     eax, 4
004DC1C3   .  75 1E         jnz     short 004DC1E3
004DC1C5   .  50            push    eax                              ; /TimerID; Case 4 of switch 004DBDA4
004DC1C6   .  8B47 1C       mov     eax, dword ptr [edi+1C]          ; |
004DC1C9   .  50            push    eax                              ; |hWnd
004DC1CA   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DC1D0   .  6A 00         push    0
004DC1D2   .  6A 00         push    0
004DC1D4   .  68 FC656400   push    006465FC                         ;  ASCII "Thank you for your support!",LF,"Please Exit the Software and start it again to validate the code."
004DC1D9   .  E8 6E9D0D00   call    005B5F4C
004DC1DE   .  E9 94000000   jmp     004DC277
004DC1E3   >  83F8 05       cmp     eax, 5
004DC1E6   .  75 15         jnz     short 004DC1FD
004DC1E8   .  8B4F 1C       mov     ecx, dword ptr [edi+1C]          ;  Case 5 of switch 004DBDA4
004DC1EB   .  50            push    eax                              ; /TimerID
004DC1EC   .  51            push    ecx                              ; |hWnd
004DC1ED   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DC1F3   .  6A FF         push    -1                               ; /ExitCode = FFFFFFFF
004DC1F5   .  FF15 D0545E00 call    dword ptr [<&KERNEL32.ExitProces>; \ExitProcess
004DC1FB   .  EB 7A         jmp     short 004DC277
004DC1FD   >  83F8 06       cmp     eax, 6
004DC200   .  75 0D         jnz     short 004DC20F
004DC202   .  8B57 1C       mov     edx, dword ptr [edi+1C]          ;  Case 6 of switch 004DBDA4
004DC205   .  50            push    eax                              ; /TimerID
004DC206   .  52            push    edx                              ; |hWnd
004DC207   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DC20D   .  EB 68         jmp     short 004DC277
004DC20F   >  83F8 0A       cmp     eax, 0A
004DC212   .  75 2D         jnz     short 004DC241
004DC214   .  50            push    eax                              ; /TimerID; Case A of switch 004DBDA4
004DC215   .  8B47 1C       mov     eax, dword ptr [edi+1C]          ; |
004DC218   .  50            push    eax                              ; |hWnd
004DC219   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DC21F   .  8B17          mov     edx, dword ptr [edi]
004DC221   .  8BCF          mov     ecx, edi
004DC223   .  FF92 C0000000 call    dword ptr [edx+C0]
004DC229   .  85C0          test    eax, eax
004DC22B   .  74 4A         je      short 004DC277
004DC22D   .  8BC8          mov     ecx, eax
004DC22F   .  E8 772D0E00   call    005BEFAB
004DC234   .  85C0          test    eax, eax
004DC236   .  74 3F         je      short 004DC277
004DC238   .  8BC8          mov     ecx, eax
004DC23A   .  E8 F13EFEFF   call    004C0130
004DC23F   .  EB 36         jmp     short 004DC277
004DC241   >  83F8 0B       cmp     eax, 0B
004DC244   .  75 31         jnz     short 004DC277
004DC246   .  50            push    eax                              ; /TimerID; Case B of switch 004DBDA4
004DC247   .  8B47 1C       mov     eax, dword ptr [edi+1C]          ; |
004DC24A   .  50            push    eax                              ; |hWnd
004DC24B   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DC251   .  E8 F3570E00   call    005C1A49
004DC256   .  8B40 04       mov     eax, dword ptr [eax+4]
004DC259   .  6A 00         push    0
004DC25B   .  68 B03C6400   push    00643CB0                         ;  ASCII "ResetToolbars"
004DC260   .  68 1CF16300   push    0063F11C                         ;  ASCII "Settings"
004DC265   .  8BC8          mov     ecx, eax
004DC267   .  E8 255C0E00   call    005C1E91
004DC26C   .  85C0          test    eax, eax
004DC26E   .  74 07         je      short 004DC277
004DC270   .  8BCF          mov     ecx, edi
004DC272   .  E8 99190000   call    004DDC10
004DC277   >  8BCF          mov     ecx, edi                         ;  Default case of switch 004DBDA4
004DC279   .  E8 51040D00   call    005AC6CF
004DC27E   .  8B4D F4       mov     ecx, dword ptr [ebp-C]
004DC281   .  5F            pop     edi
004DC282   .  5E            pop     esi
004DC283   .  5B            pop     ebx
004DC284   .  64:890D 00000>mov     dword ptr fs:[0], ecx
004DC28B   .  8BE5          mov     esp, ebp
004DC28D   .  5D            pop     ebp
004DC28E   .  C2 0400       retn    4

这些代码其实是 swith,现在代码eax为3,正要运行case 3 处的代码。观察每个case,可以发现 case 4 中的"Thank you for your support!",我们可以知道可能case 4 就是注册成功。我们就要想办法把swith 3 改成 swith 4。

我们先前看看,看看swith开始的代码

004DBD80   .  55            push    ebp
004DBD81   .  8BEC          mov     ebp, esp
004DBD83   .  6A FF         push    -1
004DBD85   .  68 17B85D00   push    005DB817                         ;  SE 处理程序安装
004DBD8A   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
004DBD90   .  50            push    eax
004DBD91   .  64:8925 00000>mov     dword ptr fs:[0], esp
004DBD98   .  81EC 68010000 sub     esp, 168
004DBD9E   .  8B45 08       mov     eax, dword ptr [ebp+8]
004DBDA1   .  53            push    ebx
004DBDA2   .  56            push    esi
004DBDA3   .  57            push    edi
004DBDA4   .  83F8 01       cmp     eax, 1                           ;  Switch (cases 1..B)
004DBDA7   .  8BF9          mov     edi, ecx
004DBDA9   .  75 53         jnz     short 004DBDFE
004DBDAB   .  50            push    eax                              ; /TimerID; Case 1 of switch 004DBDA4
004DBDAC   .  8B47 1C       mov     eax, dword ptr [edi+1C]          ; |
004DBDAF   .  50            push    eax                              ; |hWnd
004DBDB0   .  FF15 B4575E00 call    dword ptr [<&USER32.KillTimer>]  ; \KillTimer
004DBDB6   .  E8 8E5C0E00   call    005C1A49

在004DBD80   下断点,删除前面KillTimer设置的断点,重新运行程序。多按几次F9(下断点处的地方,在程序界面产生前就调用了,所以多按几次F9),可以看到程序的界面,打开注册窗口,输入信息,点击OK,发现程序断在前面下断点的地方。

按F8单步运行, 可以发现 mov     eax, dword ptr [ebp+8] ,就是设置swith中eax的值。可以尝试把它改成mov eax ,4,但是我们可以发现原来的代码占用3个字节,改后的代码占用5个字节,后面的代码push    ebx, push    esi被覆盖了。

这时我们可以用内嵌补丁,先把mov     eax, dword ptr [ebp+8]改成jmp xxx到空白的代码处,再在空白的代码处写上要执行的代码,再跳回来。

这里我们可以把mov     eax, dword ptr [ebp+8]  改成jmp     005E47CC

再在005E47CC 写上下面的代码

005E47CB      00            db      00
005E47CC      B8 04000000   mov     eax, 4
005E47D1   .  53            push    ebx
005E47D2   .  56            push    esi
005E47D3   .^ E9 CB75EFFF   jmp     004DBDA3
005E47D8      00            db      00

复制到可执行程序,正常运行程序,可以发现,程序打开时一直弹出"Thank you for your support!"的窗口。调试改后的程序,我们可以发现原来程序一直在循环的执行swith,因为我们改成了switch 4,所以一直弹出"Thank you for your support!"的窗口。其实这个程序只是因为过期后前面有一个让我们输入key的nag窗口而不可以使用,我们只要让这个nag窗口不出现就可以了。我们可以让他switc  0B,0b既不会弹出“The registration code seems
to be not valid” 窗口,也不会弹出"Thank you for your support!"的窗口。把  mov     eax, 4  改成  mov     eax, 0b 复制到可执行程序,再正常运行程序,可以发现程序可以正常运行。

方法二: 查看调用堆栈

此程序,因为产生了一个不可以跳过的nag窗口而不能使用,可以通过改变跳转,使程序不执行nag窗口的代码,来破解。

查找产生nag窗口的代码

重新加载程序,删掉前面设置的断点,按F9运行程序,看到nag窗口出现时,暂停程序,按 alt+K 查看堆栈调用,

图片1

点击最下面的 ”调用来自“。查看代码(点击 函数过程 是看函数的具体代码,点击 调用来自 是看call)

在这个call上下断点,重新运行程序,

图片2

可以发现真是这个call产生了nag窗口。

查找这段代码的开头(即找push ebp)

图片3

在push ebp 下断点重新运行程序,按F9运行,来到断点处。

按F8单步运行,变按边注意跳转,改变寄存器 ,使程序跳过call    005ABE4D。

可以发现只要使 jnz     short 004DBDE6 不跳转即可以实现跳过call    005ABE4D。

时间: 2024-11-05 11:56:49

OllyDbg 使用笔记 (十三)的相关文章

OllyDbg 使用笔记 (二)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 TraceMe.exe下载地址:http://pan.baidu.com/s/1c0s2twO TraceMe.exe 程序破解 程序见下图,破解目标:使我们能够验证成功. 图片1 由于输入肯定会用到获取对话框文本的API,所以在反汇编面板 按Ctrl+G搜索GetDlgItemTextA,试试看. 图片2 也可以按Ctrl+N 打开程序的导入表.查看程序导入了那些函数,选中GetDlgItemTextA,右键 选择在反汇编窗口中跟随输入

OllyDbg 使用笔记 (一)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 ollydbg下载地址:http://tools.pediy.com/debuggers.htm hello.exe下载地址:http://pan.baidu.com/s/1c0iYQOC 一.OllyDbg基本界面 图片1 如果按窗口切换按钮出现下面的情况,乱了,只需要双击一个窗口让它全屏就行了. 图片2 二.部分快捷键介绍 F3 : 打开目标文件 F2 : 设置断点 F7:单步步进,遇到CALL跟进 F8:单步步过,遇到CALL路过,

OllyDbg 使用笔记 (八)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 示例程序下载:http://pan.baidu.com/s/1jG5NKBs 分析 这个程序,未注册版本限制了一些功能. 尝试在register界面写入email和密钥 会弹出注册未成功的窗口.可以利用窗口中的文字作为突破口.在OD中 查找 所有参考文本字串 图片1 暴力破解 查看 未注册成功后弹出窗口中的字符串的代码: 004299AB . 57 push edi 004299AC . 50 push eax 004299AD . E8

ollydbg使用笔记(五)

OllyDbg 使用笔记 (五) 参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 pixtopainbook安装包 下载地址  http://pan.baidu.com/s/191ArG pixtopainbook 破解 pixtopainbook是一个电话簿软件,未注册版本,最多只能添加3个组,每个组最多添加4个人. 去除添加人数跟组数限制 ollydbg 加载 ,按F9运行. 如果OD暂停,在下面出现"异常 E06D7363 - 使用Shift+F7/F8/F9来忽略程序

OllyDbg 使用笔记 (四)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 RegisterMe程序下载地址:http://pan.baidu.com/s/1gd3l4XH 这个RegisterMe程序,运行前和运行后都会有neg窗口.破解目标,去除这个两个窗口. 用OD直接打开这个程序,我们会发现出错.也可能OD会卡死. 因为这个程序的PE文件被故意修改了. 我们先到 选项---> 调试设置 --> 事件 --> 选择系统断点. 图片1 这样用OD打开就不会卡死. 按 alt + M 来到 m

swift 笔记 (十三) —— 继承

继承 一个类可以从其它类继承方法,属性以及一些特征.被继承的类叫父类,那另一种就是子类了..这个我们都懂的.. 这是一个官方给的例子,它是一个基类(Base Class),因为它没有继承任何一个类,这个类里面有一个init方法,我们暂时忽略,只要知道这是个初始化方法,在我们创建一个类的实例的时候,这个方法会被执行,下一篇笔记会详细分析. class MyCar: Vehicle {          //继承的语法 init () {                              /

java之jvm学习笔记十三(jvm基本结构)

java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍. 为了让你每一个知识点都有迹

OllyDbg 使用笔记 (六)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 VisualSite Designer下载地址:http://pan.baidu.com/s/1ntyVLsH VisualSite Designer 运行前有个NAG,关闭程序后有个广告窗口,并且有运行次数限制. 去除NAG以及运行次数限制 方法1: 去除NAG窗口的方法是:F8运行程序,碰到出现NAG的CALL就下断点,重新运行按F7进入此CALL,直到找到用户领空"真正"CALL出NAG窗口的CALL.观察此CA

Swift学习笔记十三:继承

一个类可以继承(inherit)另一个类的方法(methods),属性(property)和其它特性 一.基本语法 class Human{ var name :String init(){ name = "human" println(name) } func description(){ println("name:\(name)") } } class Student:Human{ var score = 0 init(){ super.init() name

OllyDbg 使用笔记 (三)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 reverseME.exe 下载地址:http://pan.baidu.com/s/1c0fBgi8 reverseMe.exe 破解 这个reverseMe会读取密钥文件来注册. 加载,观察注解,我们可以发现几个关键的地方 0040105C . 6A 00 push 0 ; /hTemplateFile = NULL 0040105E . 68 6F214000 push 0040216F ; |Attributes = READONL