[反汇编练习] 160个CrackMe之024.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第24个Chafe.2.EXE,保存下来。运行程序,程序界面如下:

 

注:它是没有信息框提示错误的。

 

3、思路分析和破解流程

PEID:  MASM32 / TASM32

步骤:

1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

2、在exe中输入Name: bbdxf  Key:123123。

3、在OD中反汇编窗口,右键->中文搜索引擎->智能搜索。

我们很容易发现了正确文本提示内容:YES!You found your serial!

右键->Follow。大概地浏览下代码:

00401230   .  8B45 14       mov eax,dword ptr ss:[ebp+0x14]          ;  Case 111 (WM_COMMAND) of switch 004011F5
00401233 . 3B05 60314000 cmp eax,dword ptr ds:[0x403160]
00401239 . 75 1A jnz short 00401255
0040123B . 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
0040123D . 68 96304000 push 00403096 ; |About TEXme v2.0
00401242 . 68 A7304000 push 004030A7 ; |Small crack-me program written by Chafe/TEX99\n\rRULES: Find a serial that matches your name or write a keygenerator. NO PATCHES IS ALLOWED!\n\r\n\rReleased 19/7-99
00401247 . FF75 08 push dword ptr ss:[ebp+0x8] ; |hOwner
0040124A . E8 17020000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
0040124F . 33C0 xor eax,eax
00401251 . C9 leave
00401252 . C2 1000 retn 0x10
00401255 > 3B05 58314000 cmp eax,dword ptr ds:[0x403158] ; // 判断是否是编辑框命令
0040125B . 74 0C je short 00401269
0040125D . 3B05 54314000 cmp eax,dword ptr ds:[0x403154]
00401263 . 0F85 AE000000 jnz 00401317
00401269 > C705 D9124000>mov dword ptr ds:[0x4012D9],0x584554 ; // 如果正确
00401273 . 6A 00 push 0x0 ; /IsSigned = FALSE
00401275 . 8D45 FC lea eax,dword ptr ss:[ebp-0x4] ; |
00401278 . 50 push eax ; |pSuccess
00401279 . 6A 64 push 0x64 ; |ControlID = 64 (100.)
0040127B . FF35 50314000 push dword ptr ds:[0x403150] ; |hWnd = 000401E2 ('TEXme v2.0',class='CTEX')
00401281 . E8 BC010000 call <jmp.&USER32.GetDlgItemInt> ; \GetDlgItemInt
00401286 . 837D FC 00 cmp dword ptr ss:[ebp-0x4],0x0 ; // eax=0x1E240=123456
0040128A . 74 5F je short 004012EB
0040128C . 50 push eax
0040128D . 6A 14 push 0x14 ; /Count = 14 (20.)
0040128F . 68 6C314000 push 0040316C ; |Buffer = Chafe_2.0040316C
00401294 . FF35 54314000 push dword ptr ds:[0x403154] ; |hWnd = 000301EA (class='Edit',parent=000401E2)
0040129A . E8 AF010000 call <jmp.&USER32.GetWindowTextA> ; \GetWindowTextA
0040129F . 85C0 test eax,eax
004012A1 . 74 48 je short 004012EB
004012A3 . A1 0B304000 mov eax,dword ptr ds:[0x40300B] ; CTEX=[0040300B]=58455443
004012A8 . BB 6C314000 mov ebx,0040316C
004012AD > 0303 add eax,dword ptr ds:[ebx] ; // 前四个字符组成的整数+eax
004012AF . 43 inc ebx
004012B0 . 81FB 7C314000 cmp ebx,0040317C ; // 去掉第一个字符与0比较
004012B6 .^ 75 F5 jnz short 004012AD ; // 最后相当于把所有的字符都加了一遍,还有更多的
004012B8 . 5B pop ebx ; // ebx=123456
004012B9 . 03C3 add eax,ebx ; // eax=3788FA49
004012BB . 3105 D9124000 xor dword ptr ds:[0x4012D9],eax ; // 修改[0x4012D9]处的汇编代码
004012C1 . C1E8 10 shr eax,0x10 ; // 右移10位
004012C4 . 66:2905 D9124>sub word ptr ds:[0x4012D9],ax ; // 修改[0x4012D9]处的汇编代码
004012CB . BE EC114000 mov esi,004011EC
004012D0 . B9 3E000000 mov ecx,0x3E
004012D5 . 33DB xor ebx,ebx
004012D7 . EB 04 jmp short 004012DD
004012D9 54 push esp
004012DA 45 inc ebp
004012DB 58 pop eax
004012DC 00AD 33D84975 add byte ptr ss:[ebp+0x7549D833],ch
004012E2 ? FA cli
004012E3 . 81FB FBCFFCAF cmp ebx,0xAFFCCFFB ; // 与一个常量比较,最终跳到了一个错误
004012E9 ^ 74 EE je short 004012D9 ; // 关键跳转
004012EB > 68 59304000 push 00403059 ; /Your serial is not valid.
004012F0 . FF35 5C314000 push dword ptr ds:[0x40315C] ; |hWnd = 000301E8 ('Your serial is not valid.',class='Edit',parent=000401E2)
004012F6 . E8 7D010000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012FB . 33C0 xor eax,eax
004012FD . C9 leave
004012FE . C2 1000 retn 0x10
00401301 . 68 73 30 40 0>ascii "hs0@",0 ; YES! You found your serial!!
00401306 . FF35 5C314000 push dword ptr ds:[0x40315C] ; |hWnd = 000301E8 ('Your serial is not valid.',class='Edit',parent=000401E2)
0040130C . E8 67010000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
00401311 . 33C0 xor eax,eax
00401313 . C9 leave
00401314 . C2 1000 retn 0x10
00401317 > FF75 14 push dword ptr ss:[ebp+0x14] ; /lParam; Default case of switch 004011F5
0040131A . FF75 10 push dword ptr ss:[ebp+0x10] ; |wParam
0040131D . FF75 0C push dword ptr ss:[ebp+0xC] ; |Message
00401320 . FF75 08 push dword ptr ss:[ebp+0x8] ; |hWnd
00401323 . E8 08010000 call <jmp.&USER32.DefWindowProcA> ; \DefWindowProcA
00401328 . C9 leave
00401329 . C2 1000 retn 0x10

我直接就放出分析后的代码。和上一个一样,代码非常简单,关键跳转 je short 004012D9 ,爆破只需要将它改为jmp跳转就可以了。这里省略。

 

4、注册机的探索

注意这段代码

004012B8   .  5B               pop ebx                                  ;  // ebx=123456
004012B9 . 03C3 add eax,ebx ; // eax=3788FA49
004012BB . 3105 D9124000 xor dword ptr ds:[0x4012D9],eax ; // 修改[0x4012D9]处的汇编代码
004012C1 . C1E8 10 shr eax,0x10 ; // 右移10位
004012C4 . 66:2905 D9124000 sub word ptr ds:[0x4012D9],ax ; // 修改[0x4012D9]处的汇编代码
004012CB . BE EC114000 mov esi,004011EC
004012D0 . B9 3E000000 mov ecx,0x3E

程序启动时,它未修改和第一次修改的都是这样的:

004012D7   . /EB 04            jmp short 004012DD
004012D9 |54 push esp
004012DA |45 inc ebp
004012DB |58 pop eax
004012DC |00AD 33D84975 add byte ptr ss:[ebp+0x7549D833],ch
004012E2 ? FA cli
004012E3 . 81FB FBCFFCAF cmp ebx,0xAFFCCFFB ; // 与一个常量比较,最终跳到了一个错误
004012E9 ^ 74 EE je short 004012D9 ; // 关键跳转
004012EB > 68 59304000 push 00403059 ; /Your serial is not valid.
004012F0 . FF35 5C314000 push dword ptr ds:[0x40315C] ; |hWnd = 001101E4 ('Your serial is not valid.',class='Edit',parent=00150228)
004012F6 . E8 7D010000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012FB . 33C0 xor eax,eax
004012FD . C9 leave
004012FE . C2 1000 retn 0x10

最后又被修改为一个错误的代码:

004012D7   .  EB 04            jmp short 004012DD
004012D9 53 push ebx
004012DA 62D2 bound edx,edx ; Illegal use of register
004012DC 37 aaa
004012DD > AD lods dword ptr ds:[esi]
004012DE . 33D8 xor ebx,eax
004012E0 . 49 dec ecx
004012E1 .^ 75 FA jnz short 004012DD

这一段代码弄得我崩溃了,相当于进行了一个Hook,但是我却找不到hook之后谁在哪里执行了这段代码。悲剧啊!

 

在这段代码之下,进行了整数的比较:

004012D7   . /EB 04            jmp short 004012DD
004012D9 |54 push esp
004012DA |45 inc ebp
004012DB |58 pop eax
004012DC |00AD 33D84975 add byte ptr ss:[ebp+0x7549D833],ch
004012E2 ? FA cli
004012E3 . 81FB FBCFFCAF cmp ebx,0xAFFCCFFB ; // 与一个常量比较,最终跳到了一个错误
004012E9 ^ 74 EE je short 004012D9 ; // 关键跳转
004012EB > 68 59304000 push 00403059 ; /Your serial is not valid.
004012F0 . FF35 5C314000 push dword ptr ds:[0x40315C] ; |hWnd = 001101E4 ('Your serial is not valid.',class='Edit',parent=00150228)
004012F6 . E8 7D010000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012FB . 33C0 xor eax,eax
004012FD . C9 leave
004012FE . C2 1000 retn 0x10

整个算法流程大概是这样的:

比如我的Name: bbdxf

在地址[0x40300B]处存放一个初始值,将它与“bbdxf”的前四个字节组成的整数进行相加,并且每次去除文本第一个字符,一直到ebx=0, 但是,但是调试跟踪发现,它并不是进行len(bbdxf)-1次,而是循环到了不知干什么的地方….(这是最坑人的地方,没办法模拟这个加法的过程!)

这个循环结束,将结果保存到eax中,然后hook地址[0x4012D9]处的代码,最终与 0xAFFCCFFB 进行比较得出结果。

 

BY  笨笨D幸福

[反汇编练习] 160个CrackMe之024的更多相关文章

  1. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  3. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. [反汇编练习] 160个CrackMe之022

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之020

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之019

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之018

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之017

    [反汇编练习] 160个CrackMe之017. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. 斌哥的 Docker 进阶指南

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

  2. JavaScript语言基础知识点图示(转)

    一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...

  3. (转) C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  4. 转载:PHP,MySQL的安装与配置

    本文转自:http://www.cnblogs.com/janas/archive/2012/08/27/2659240.html 一.安装配置PHP 1.下载Php的版本zip包之后,解压缩到指定目 ...

  5. LoaderManager使用详解(一)---没有Loader之前的世界

    来源: http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html 感谢作者Alex ...

  6. MySql经典语句

    1.三个函数: LENGTH  SUBSTR   LOCATE )) order by WebSiteShopUrl desc 2.序号 两种方法 第一种方法: ) ) as it 第二种方法: ; ...

  7. PHP Simple HTML DOM解析器

    一直以来使用php解析html文档树都是一个难题.Simple HTML DOM parser 帮我们很好地解决了使用 php html 解析 问题.可以通过这个php类来解析html文档,对其中的h ...

  8. 编译FreePascal和Lazarus

    一,准备目录假设我们准备将整个FreePascal环境安装到D盘的fpc目录下,那么我们需要创建以下几个目录:d:\fpc_svn\bind:\laz_svn二,准备环境1,安装SVN客户端Torto ...

  9. Path Sum的变体

    早上看到一个面经题跟Path Sum很像, 给一个TreeNode root和一个target,找到一条从根节点到leaf的路径,其中每个节点和等于target. 与Path Sum不同是, Path ...

  10. UX结合需求实例化进行设计开发

    技  术  文  件 技术文件名称:实例化+UX需求分析实践:场景监控需求实例化 技术文件编号: 版        本:V1.0 共 32 页 (包括封面) 拟  制    廖开蒙.刀锋团队 审  核 ...