[反汇编练习] 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. PHP如何利用sleep实现 输出->等待->输出

    sleep()函数一般用在暂停上,但是一个PHP一旦有了sleep,其他的输出(print,echo)就都要等待sleep()函数的完成,这是因为缓冲区,这里有详细解释 在这里不赘述,而如果要实现先输 ...

  2. hibernate源码分析1-保存一个对象

    要点 用了event的方式贯穿CRUD的过程 值得学习 用dynamic-insert 支持 插入时 可选 全字段插入 还是仅仅有值的字段插入. 返回主键的值 用了 Serializable 类型作为 ...

  3. Android 资源文件local.properties使用以及Gradle文件中的值、Manifests文件中的值

    这篇也是因为Gradle存储密钥问题一路填坑总结的,期初连.properties创建都有疑问 因为当时是在Android下查看新建的properties一直没法看到 因为Gradle Scripts是 ...

  4. PostgreSQL order by 排序问题

    默认的排序为order by 字段名, 如果该字段不允许为空的情况下可以这样操作, 但是当字段允许为null时,order by 字段名的方式会导致: 升序时(asc): 会从最小值开始升序,最后面接 ...

  5. 数据表自动生成java代码

    MyBatis生成代码需要用到mybatis-generator-core-1.3.2.jar.数据库连接驱动包和一个xml文件,xml文件一般命令为:generator.xml. Xml内容格式如下 ...

  6. Git 应用问题(一) —— failed to push some refs to git

    今天在本地创建了一个新的 repository,想关联到 Github 上的时候出现问题,如下: Gerrard@LAPTOP-79570TK2 MINGW64 /g/github-workspace ...

  7. 【Luogu】P3232游走(高斯消元解概率)

    题目链接 参见远航之曲dalao的题解,我再写一遍的话就没啥意思了. #include<cstdio> #include<cstring> #include<algori ...

  8. [luoguP2762] 太空飞行计划问题(最大权闭合图—最小割—最大流)

    传送门 如果将每一个实验和其所对的仪器连一条有向边,那么原图就是一个dag图(有向无环) 每一个点都有一个点权,实验为收益(正数),仪器为花费(负数). 那么接下来可以引出闭合图的概念了. 闭合图是原 ...

  9. BZOJ1879 [Sdoi2009]Bill的挑战 【状压dp】

    题目 输入格式 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ 5,M ≤ 15,字符串长 ...

  10. 常用快捷键以及linux命令整理

    关于快捷键的使用,网上有很多.自己在使用过程中不断整理用到的知识点.一个项目完成了就把涉及用到的快捷键和命令介绍给大家,都是一些比较基础的,常用的命令.希望大家有好的知识点,命令可以及时交流整理. 一 ...