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

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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,选择第34个Cruehead.3.exe,保存下来。运行程序,程序界面如下:

 

悲剧啊,啥也没有!

PEID:MASM32 / TASM32 [覆盖]

汇编写的程序啊!哎!要么很简单,要么就很坑啦!

 

3、思路分析和破解流程

1、打开OD,将exe拖到OD窗口中,等程序暂停后,不用理会(先不要运行,否则无法进行爆破)。

2、右键->中文搜索插件->智能搜索,找到提示成功字符串:

很容易找到提示成功的字符串:Good work cracker! 选中它,右键->Follow.

00401362  /$  8B0D 49214000 mov ecx,dword ptr ds:[0x402149]
00401368 |. 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
0040136C |. 8B7C24 08 mov edi,dword ptr ss:[esp+0x8]
00401370 |. 83C7 0C add edi,0xC
00401373 |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[>
00401375 |. 66:C707 210D mov word ptr ds:[edi],0xD21
0040137A |. 83C7 02 add edi,0x2
0040137D |. 8B7424 0C mov esi,dword ptr ss:[esp+0xC]
00401381 |. B9 1A000000 mov ecx,0x1A
00401386 |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[>
00401388 |. 6A 30 push 0x30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040138A |. 68 57214000 push 00402157 ; |Good work cracker!
0040138F |. 68 6A214000 push 0040216A ; |Cracked by: Now try the next crackme!
00401394 |. FF35 04204000 push dword ptr ds:[0x402004] ; |hOwner = NULL
0040139A |. E8 19000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
0040139F \. C3 retn

这里只进行了一个提示,我们在头部下断,跟踪,发现这里调用了这段代码:

00401187  |.  58            pop eax                                  ;  // 将结果出栈,问题在于怎样才能找到对应入栈的地方
00401188 |. 3C 01 cmp al,0x1 ; // 比较是否成功
0040118A 75 17 jnz short 004011A3 ; // 不成功则跳转,想要爆破就要改这里
0040118C |. 68 86214000 push 00402186 ; ASCII "xt crackme!"
00401191 |. 68 6A214000 push 0040216A ; ASCII "Cracked by: !\rNow try the next crackme!"
00401196 |. 68 08204000 push 00402008
0040119B |. E8 C2010000 call 00401362
004011A0 |. 83C4 0C add esp,0xC

在0040118A地址处,如果跳转则直接到失败的地方了!所以,想要爆破,只需要将这个判断跳转修改为Nop。

地址: 0040118A 选中 jnz short 004011A3,右键->Binary->Fill with NOPs。

F9,运行程序!

4、注册机的探索

这个汇编代码也不长,但是汇编的代码逻辑性一般都很差,所以,我们还是从头开始分析吧:

00401000 >/$  6A 00         push 0x0                                 ; /pModule = NULL
00401002 |. E8 7D040000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401007 |. A3 E9204000 mov dword ptr ds:[0x4020E9],eax
0040100C |. C705 F9204000>mov dword ptr ds:[0x4020F9],0x0
00401016 |. 6A 00 push 0x0 ; /hTemplateFile = NULL
00401018 |. 68 80000000 push 0x80 ; |Attributes = NORMAL
0040101D |. 6A 03 push 0x3 ; |Mode = OPEN_EXISTING
0040101F |. 6A 00 push 0x0 ; |pSecurity = NULL
00401021 |. 6A 03 push 0x3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401023 |. 68 000000C0 push 0xC0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
00401028 |. 68 D7204000 push 004020D7 ; |FileName = "CRACKME3.KEY"
0040102D |. E8 76040000 call <jmp.&KERNEL32.CreateFileA> ; \CreateFileA
00401032 |. 83F8 FF cmp eax,-0x1
00401035 |. 75 0C jnz short 00401043 ; // 存在则跳过
00401037 |> 68 0E214000 push 0040210E ; ASCII "CrackMe v3.0 "
0040103C |. E8 B4020000 call 004012F5
00401041 |. EB 6B jmp short 004010AE
00401043 |> A3 F5204000 mov dword ptr ds:[0x4020F5],eax
00401048 |. B8 12000000 mov eax,0x12
0040104D |. BB 08204000 mov ebx,00402008
00401052 |. 6A 00 push 0x0 ; /pOverlapped = NULL
00401054 |. 68 A0214000 push 004021A0 ; |pBytesRead = Cruehead.004021A0
00401059 |. 50 push eax ; |BytesToRead => 12 (18.)
0040105A |. 53 push ebx ; |Buffer => Cruehead.00402008
0040105B |. FF35 F5204000 push dword ptr ds:[0x4020F5] ; |hFile = 00000044 (window)
00401061 |. E8 30040000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile
00401066 |. 833D A0214000>cmp dword ptr ds:[0x4021A0],0x12 ; // 比较这个地址的文本是否为0x12
0040106D |.^ 75 C8 jnz short 00401037
0040106F |. 68 08204000 push 00402008
00401074 |. E8 98020000 call 00401311 ; // 进行一些数据比较
00401079 |. 8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678
00401083 |. 83C4 04 add esp,0x4
00401086 |. 68 08204000 push 00402008
0040108B |. E8 AC020000 call 0040133C ; // 一个加法
00401090 |. 83C4 04 add esp,0x4
00401093 |. 3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9]
00401099 |. 0F94C0 sete al
0040109C |. 50 push eax
0040109D |. 84C0 test al,al
0040109F |.^ 74 96 je short 00401037
004010A1 |. 68 0E214000 push 0040210E ; ASCII "CrackMe v3.0 "
004010A6 |. E8 9B020000 call 00401346
004010AB |. 83C4 04 add esp,0x4
004010AE |> 6A 00 push 0x0 ; /Title = NULL
004010B0 |. 68 28214000 push 00402128 ; |Class = "No need to disasm the code!"
004010B5 |. E8 9A030000 call <jmp.&USER32.FindWindowA> ; \FindWindowA

这里查找了CRACKME3.KEY文件,然后通过ReadFile读取文件处理。

我们在exe所在目录下,新建一个空文件:CRACKME3.KEY

由于从地址 00401066 开始,进行了大量的内存数据修改和比较处理,并且没有参照内容,分析了很长时间还是不知道怎样才是正确的,所以只有放弃了!

有关内存处理的地方如下:

00401007  |.  A3 E9204000   mov dword ptr ds:[0x4020E9],eax
0040100C |. C705 F9204000>mov dword ptr ds:[0x4020F9],0x0 00401043 |> \A3 F5204000 mov dword ptr ds:[0x4020F5],eax 00401052 |. 6A 00 push 0x0 ; /pOverlapped = NULL
00401054 |. 68 A0214000 push 004021A0 ; |pBytesRead = Cruehead.004021A0
00401059 |. 50 push eax ; |BytesToRead => 12 (18.)
0040105A |. 53 push ebx ; |Buffer => Cruehead.00402008
0040105B |. FF35 F5204000 push dword ptr ds:[0x4020F5] ; |hFile = NULL
00401061 |. E8 30040000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile

将读取的文本存放在[0x4020F5]内存中,然后进行数据比较,这部分是最重点的内容:

00401066  |.  833D A0214000>cmp dword ptr ds:[0x4021A0],0x12         ;  // 比较这个地址的字节是否为0x12
0040106D |.^ 75 C8 jnz short 00401037
0040106F |. 68 08204000 push 00402008
00401074 |. E8 98020000 call 00401311 ; // 进行一些数据比较
00401079 |. 8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678
00401083 |. 83C4 04 add esp,0x4
00401086 |. 68 08204000 push 00402008
0040108B |. E8 AC020000 call 0040133C ; // 一个加法
00401090 |. 83C4 04 add esp,0x4
00401093 |. 3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9]
00401099 |. 0F94C0 sete al
0040109C |. 50 push eax
0040109D |. 84C0 test al,al
0040109F |.^ 74 96 je short 00401037 Call 00401037:
00401311 /$ 33C9 xor ecx,ecx
00401313 |. 33C0 xor eax,eax
00401315 |. 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
00401319 |. B3 41 mov bl,0x41
0040131B |> 8A06 /mov al,byte ptr ds:[esi]
0040131D |. 32C3 |xor al,bl
0040131F |. 8806 |mov byte ptr ds:[esi],al
00401321 |. 46 |inc esi
00401322 |. FEC3 |inc bl
00401324 |. 0105 F9204000 |add dword ptr ds:[0x4020F9],eax
0040132A |. 3C 00 |cmp al,0x0
0040132C |. 74 07 |je short 00401335
0040132E |. FEC1 |inc cl
00401330 |. 80FB 4F |cmp bl,0x4F
00401333 |.^ 75 E6 \jnz short 0040131B
00401335 |> 890D 49214000 mov dword ptr ds:[0x402149],ecx
0040133B \. C3 retn Call 0040133C:
0040133C /$ 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
00401340 |. 83C6 0E add esi,0xE
00401343 |. 8B06 mov eax,dword ptr ds:[esi]
00401345 \. C3 retn

到此结束!

BY  笨笨D幸福

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

  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之024

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Socketserver详解

    Python3中的SocketServer socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver是socket的在封装.sock ...

  2. Java类编译、加载、和执行

    https://www.cnblogs.com/fefjay/p/6305499.html

  3. web安全测试---跨站点脚本测试

    1.1      跨站脚本测试 1.1.1        GET方式跨站脚本测试 编号 SEC_Web_XSS_01 测试用例名称 GET方式跨站脚本测试 测试目的 由于跨站脚本会导致会话被劫持.敏感 ...

  4. python 学习分享-购物车实操篇

    程序要求如下: '''购物车程序: 启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就 ...

  5. jQuery效果show()方法

    $("button").click(function(){ $("p").show(); }); Syntax $(selector).show(speed,e ...

  6. Leetcode 464.我能赢吗

    我能赢吗 在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者. 如果我们将游戏规则改为 ...

  7. pip install ImportError: cannot import name main

    在Ubuntu上用pip install装ansible时报错 root@user:~# pip install --no-cache-dir ansible -i http://mirrors.al ...

  8. 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...

  9. 【Luogu】P2221高速公路(线段树乱搞)

    题目链接 这题……我从一开始就想歪了qwq. 为了缅怀逝去的一小时我就把我的30分暴力思路放上来. 首先我们观察枚举的区间.假设我们要枚举的范围是1~5之间的四条路,为了方便我们把它们叫做abcd. ...

  10. 树状数组--前n项和;

    树状数组是和线段树类似的数据结构,基本上树状数组可以做的线段树都可以做: 树状数组就是一个数组,在信息记录上有一些特点,以动态求前n项和为例:可以改变数组的某一个元素,求前n项和: 数组tree[ i ...