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 = READONLY|HIDDEN|SYSTEM|ARCHIVE|TEMPORARY|402048
00401063   .  6A 03         push    3                                ; |Mode = OPEN_EXISTING
00401065   .  6A 00         push    0                                ; |pSecurity = NULL
00401067   .  6A 03         push    3                                ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401069   .  68 000000C0   push    C0000000                         ; |Access = GENERIC_READ|GENERIC_WRITE
0040106E   .  68 79204000   push    00402079                         ; |FileName = "Keyfile.dat"
00401073   .  E8 0B020000   call    <jmp.&KERNEL32.CreateFileA>      ; \CreateFileA
00401078   .  83F8 FF       cmp     eax, -1
0040107B      75 1D         jnz     short 0040109A
0040107D   .  6A 00         push    0                                ; |/Style = MB_OK|MB_APPLMODAL
0040107F   .  68 00204000   push    00402000                         ; ||Title = " Key File ReverseMe"
00401084   .  68 17204000   push    00402017                         ; ||Text = "Evaluation period out of date. Purchase new license"
00401089   .  6A 00         push    0                                ; ||hOwner = NULL
0040108B   .  E8 D7020000   call    <jmp.&USER32.MessageBoxA>        ; |\MessageBoxA
00401090   .  E8 24020000   call    <jmp.&KERNEL32.ExitProcess>      ; \ExitProcess
00401095   .  E9 83010000   jmp     0040121D
0040109A   >  6A 00         push    0                                ; /pOverlapped = NULL
0040109C   .  68 73214000   push    00402173                         ; |pBytesRead = reverseM.00402173
004010A1   .  6A 46         push    46                               ; |BytesToRead = 46 (70.)
004010A3   .  68 1A214000   push    0040211A                         ; |Buffer = reverseM.0040211A
004010A8   .  50            push    eax                              ; |hFile
004010A9   .  E8 2F020000   call    <jmp.&KERNEL32.ReadFile>         ; \ReadFile
004010AE   .  85C0          test    eax, eax
004010B0   .  75 02         jnz     short 004010B4
004010B2   .  EB 43         jmp     short 004010F7
004010B4   >  33DB          xor     ebx, ebx
004010B6   .  33F6          xor     esi, esi
004010B8   .  833D 73214000>cmp     dword ptr [402173], 10
004010BF   .  7C 36         jl      short 004010F7
004010C1   >  8A83 1A214000 mov     al, byte ptr [ebx+40211A]
004010C7   .  3C 00         cmp     al, 0
004010C9   .  74 08         je      short 004010D3
004010CB   .  3C 47         cmp     al, 47
004010CD   .  75 01         jnz     short 004010D0
004010CF   .  46            inc     esi
004010D0   >  43            inc     ebx
004010D1   .^ EB EE         jmp     short 004010C1
004010D3   >  83FE 08       cmp     esi, 8
004010D6   .  7C 1F         jl      short 004010F7
004010D8   .  E9 28010000   jmp     00401205
004010F5   . /EB 00         jmp     short 004010F7
004010F7   > \6A 00         push    0                                ; |/Style = MB_OK|MB_APPLMODAL
004010F9   .  68 00204000   push    00402000                         ; ||Title = " Key File ReverseMe"
004010FE   .  68 86204000   push    00402086                         ; ||Text = "Keyfile is not valid. Sorry."
00401103   .  6A 00         push    0                                ; ||hOwner = NULL
00401105   .  E8 5D020000   call    <jmp.&USER32.MessageBoxA>        ; |\MessageBoxA
0040110A   .  E8 AA010000   call    <jmp.&KERNEL32.ExitProcess>      ; \ExitProcess
0040110F   .  E9 09010000   jmp     0040121D
00401205   > \6A 00         push    0                                ; |/Style = MB_OK|MB_APPLMODAL
00401207   .  68 00204000   push    00402000                         ; ||Title = " Key File ReverseMe"
0040120C   .  68 DE204000   push    004020DE                         ; ||Text = "You really did it! Congratz !!!"
00401211   .  6A 00         push    0                                ; ||hOwner = NULL
00401213   .  E8 4F010000   call    <jmp.&USER32.MessageBoxA>        ; |\MessageBoxA
00401218   .  E8 9C000000   call    <jmp.&KERNEL32.ExitProcess>      ; \ExitProcess
0040121D   >  C3            retn

我们可以由 0040106E 得出 密钥文件是Keyfile.dat

如果没有发现Keyfile.dat ,函数返回eax=-1,0040107b 的 jnz 就不会跳转,接着执行。

如果Keyfile.dat存在,就会跳转到0040109A处。

0040109A~004010A9
是读取文件函数不用管,如果读取出错就会跳到004010F7。

004010B2~004010D8
就是计算Keyfile.dat对不对。

我们可以知道,最终目的是为了要程序跳转到00401205处,可以发现,就是要使004010D8
运行

运行尝试修改004010B2~004010D8
中的跳转,时jmp  00401205 运行。

暴力破解

通过上面的分析,

我们先把0040107B 的   jnz     short 0040109A改成 jmp     short004010D8即可。

分析密钥

看004010B4~004010D8的代码

先比较密钥长度是不是大于10,如果大于10接着运行。

发现004010C1~004010D1这是一个循环,在一个一个的比较密钥文件的字符是不是 ASCII 47,用esi记录循环的次数直到读取到ASCII 0 为止。

循环结束,判断esi是否大于8,大于则jmp 00401205。

所以我们新建Keyfile.dat,用记事本写如 GGGGGGGGGGGGGGGG0 即可。

OllyDbg 使用笔记 (三)

时间: 2024-07-29 13:01:52

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

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 使用笔记 (二)

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

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

构建之法阅读笔记三—结对编程

构建之法阅读笔记三——结对编程 何谓结对编程,结对编程就是程序员肩并肩,平等的,互补的进行开发工作,他们使用同一台电脑,编写同样的程序,一起分析,一起设计,一块交流想法. 然而我以前却并不是这样做的,我以前喜欢在没人打扰的环境下写代码,我觉得有人在我身边看着,会影响我的思路,还有我个人自尊心比较强,不太喜欢被人指指点点,所以每次都是,我写完代码之后,自己先找自己的bug,每当自己实在找不到之后,才会请教大神,但是有时候可能由于自己的能力不足,往往一个很简单的问题,我自己发现就会花费很久的时间,让

3. 蛤蟆的计算机组成原理笔记三系统总线

3. 蛤蟆的计算机组成原理笔记三系统总线 本篇名言:"公正,一定会打倒那些说假话和假作证的人. --赫拉克利特" 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47988545 1.  总线 总线是连接各个部件的信息传输线,是 各个部件共享的传输介质. 1.1             面向CPU 的双总线结构框图 1.2             单总线结构框图 1.3             以存储器为中心的双总线

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

NFC学习笔记——三(在windows操作系统上安装libnfc)

本篇翻译文章: 这篇文章主要是说明如何在windows操作系统上安装.配置和使用libnfc. 一.基本信息 1.操作系统: Windows Vista Home Premium SP 2 2.硬件信息: System: Dell Inspiron 1720 Processor: Intel Core 2 Duo CPU T9300 @ 2.5GHz 2.5GHz System type: 32-bit Operating System 3.所需软件: 在windows操作系统上安装软件需要下列

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①