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

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

有信息框,很好。

PEID:MASM32 / TASM32 [覆盖]

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

3、思路分析和破解流程

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

2、点击About->Register,随意输入伪码:bbdxf  123123。点击OK按钮,弹出信息框,不要关闭,回到OD。

3、Ctrl+K查看堆栈信息:

选中Cruehead.0040137E,右键->Show calls

0040137E  /$  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
00401382  |.  56            push esi                                 ;  // "bbdxf"
00401383  |>  8A06          /mov al,byte ptr ds:[esi]
00401385  |.  84C0          |test al,al
00401387  |.  74 13         |je short 0040139C
00401389  |.  3C 41         |cmp al,0x41                             ;  "A"
0040138B  |.  72 1F         |jb short 004013AC
0040138D  |.  3C 5A         |cmp al,0x5A                             ;  "Z"
0040138F  |.  73 03         |jnb short 00401394
00401391  |.  46            |inc esi
00401392  |.^ EB EF         |jmp short 00401383
00401394  |>  E8 39000000   |call 004013D2                           ;  // 如果在A-Z之间,则处理(+0x20)
00401399  |.  46            |inc esi
0040139A  |.^ EB E7         \jmp short 00401383
0040139C  |>  5E            pop esi
0040139D  |.  E8 20000000   call 004013C2                            ;  // 处理完成在这里处理
004013A2  |.  81F7 78560000 xor edi,0x5678                           ;  // 在这里进行比较
004013A8  |.  8BC7          mov eax,edi
004013AA  |.  EB 15         jmp short 004013C1
004013AC  |>  5E            pop esi
004013AD  |.  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF  |.  68 60214000   push 00402160                            ; |Title = "No luck!"
004013B4  |.  68 69214000   push 00402169                            ; |Text = "No luck there, mate!"
004013B9  |.  FF75 08       push [arg.1]                             ; |hOwner
004013BC  |.  E8 79000000   call <jmp.&USER32.MessageBoxA>           ; \MessageBoxA
004013C1  \>  C3            retn

这段代码只是将name分析处理了一下,如果不合格则跳转到失败。

我们选中这段代码头部,即0040137E地址处,OD提示:

Local call from 0040122D

我们转到地址 0040122D,附近代码如下:

00401228   .  68 8E214000   push 0040218E                            ;  ASCII "BBDXF"
0040122D   .  E8 4C010000   call 0040137E
00401232   .  50            push eax                                 ;  // 比较之后来到这里
00401233   .  68 7E214000   push 0040217E                            ;  ASCII "123123"
00401238   .  E8 9B010000   call 004013D8
0040123D   .  83C4 04       add esp,0x4                              ;  // 再次处理之后
00401240   .  58            pop eax
00401241   .  3BC3          cmp eax,ebx
00401243   .  74 07         je short 0040124C
00401245   .  E8 18010000   call 00401362
0040124A   .^ EB 9A         jmp short 004011E6
0040124C   >  E8 FC000000   call 0040134D                            ;  // 这个跳转到正确的提示
00401251   .^ EB 93         jmp short 004011E6

发现,这里调用了大量的Call,我们一个个分析一下(注释里已经分析好了):

call 0040137E 内容:0040137E  /$  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
00401382  |.  56            push esi                                 ;  // "bbdxf"
00401383  |>  8A06          /mov al,byte ptr ds:[esi]
00401385  |.  84C0          |test al,al
00401387  |.  74 13         |je short 0040139C
00401389  |.  3C 41         |cmp al,0x41                             ;  "A"
0040138B  |.  72 1F         |jb short 004013AC
0040138D  |.  3C 5A         |cmp al,0x5A                             ;  "Z"
0040138F  |.  73 03         |jnb short 00401394
00401391  |.  46            |inc esi
00401392  |.^ EB EF         |jmp short 00401383
00401394  |>  E8 39000000   |call 004013D2                           ;  // 如果在A-Z之间,则处理(+0x20)
00401399  |.  46            |inc esi
0040139A  |.^ EB E7         \jmp short 00401383
0040139C  |>  5E            pop esi
0040139D  |.  E8 20000000   call 004013C2                            ;  // 处理完成在这里处理
004013A2  |.  81F7 78560000 xor edi,0x5678                           ;  // 在这里进行比较
004013A8  |.  8BC7          mov eax,edi
004013AA  |.  EB 15         jmp short 004013C1
004013AC  |>  5E            pop esi
004013AD  |.  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF  |.  68 60214000   push 00402160                            ; |Title = "No luck!"
004013B4  |.  68 69214000   push 00402169                            ; |Text = "No luck there, mate!"
004013B9  |.  FF75 08       push [arg.1]                             ; |hOwner
004013BC  |.  E8 79000000   call <jmp.&USER32.MessageBoxA>           ; \MessageBoxA
004013C1  \>  C3            retn其中,call 004013D2 内容:
004013D2  /$  2C 20         sub al,0x20
004013D4  |.  8806          mov byte ptr ds:[esi],al
004013D6  \.  C3            retn其中,call 004013C2 内容:
004013C2  /$  33FF          xor edi,edi
004013C4  |.  33DB          xor ebx,ebx
004013C6  |>  8A1E          /mov bl,byte ptr ds:[esi]
004013C8  |.  84DB          |test bl,bl
004013CA  |.  74 05         |je short 004013D1
004013CC  |.  03FB          |add edi,ebx                             ;  // edi=循环求和
004013CE  |.  46            |inc esi
004013CF  |.^ EB F5         \jmp short 004013C6
004013D1  \>  C3            retnCall 004013D8 内容:
004013D8  /$  33C0          xor eax,eax
004013DA  |.  33FF          xor edi,edi
004013DC  |.  33DB          xor ebx,ebx
004013DE  |.  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
004013E2  |>  B0 0A         /mov al,0xA
004013E4  |.  8A1E          |mov bl,byte ptr ds:[esi]                ;  // "123123"
004013E6  |.  84DB          |test bl,bl
004013E8  |.  74 0B         |je short 004013F5
004013EA  |.  80EB 30       |sub bl,0x30                             ;  // +0x30
004013ED  |.  0FAFF8        |imul edi,eax                            ;  // edi/10
004013F0  |.  03FB          |add edi,ebx                             ;  // edi+ebx
004013F2  |.  46            |inc esi
004013F3  |.^ EB ED         \jmp short 004013E2
004013F5  |>  81F7 34120000 xor edi,0x1234
004013FB  |.  8BDF          mov ebx,edi
004013FD  \.  C3            retncall 0040134D 的内容:
0040134D  /$  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040134F  |.  68 29214000   push 00402129                            ; |Title = "Good work!"
00401354  |.  68 34214000   push 00402134                            ; |Text = "Great work, mate!
Now try the next CrackMe!"
00401359  |.  FF75 08       push [arg.1]                             ; |hOwner
0040135C  |.  E8 D9000000   call <jmp.&USER32.MessageBoxA>           ; \MessageBoxA
00401361  \.  C3            retn

哈哈,大概流程是这样的,地址00401228开始,将Name和Serial分别经过call运算,通过00401241   .  3BC3          cmp eax,ebx 比较,然后根据结果跳转到不同的处理,其中,0040124C   >  E8 FC000000   call 0040134D  是提示正确的处理流程。所以,我们只要00401243   .  74 07         je short 0040124C改为jmp 0040124C,试一试:

4、注册机的探索

算法处理如下:

1、Name字符串,先判断是否在A-Z之间,然后每个字符ANSII值加上0x20,然后对计算后的值求和,最后与0x5678异或。

2、Serial字符串,每个字符ANSII值加上0x30,然后加上上一次的和除以10的值,存到一个变量中,继续下一个,最后与0x1234异或。

3、比较最后的结果。

…..我想想不出来这样的两个字符串,我也没办法反计算,所以,这有作罢!

BY  BBDXF

转载于:https://www.cnblogs.com/bbdxf/p/3840351.html

[反汇编练习] 160个CrackMe之033相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. Crackme006 - 全新160个CrackMe学习系列(图文|视频|注册机源码)

    知乎:逆向驿站 原文链接 CrackMe006 | 难度适中适合练手 |160个CrackMe深度解析(图文+视频+注册机源码) crackme006,依然是delphi的,而且没壳子,条线比较清晰, ...

  8. 视频+图文+注册+机源码 | 160个CrackMe深度解析合集 | 逆向破解入门

    全部合集的获取请关注微信公众号:逆向驿站 回复:160 即可获得其余合集 以下是示例文章 160个CrackMe深度解析合集-001 提倡"刨根问底",拒绝"浅尝辄止&q ...

  9. Crackme006 - 全新160个CrackMe深度解析系列(图文+视频+注册机源码)

    原文链接 CrackMe006 | 难度适中适合练手 |160个CrackMe深度解析(图文+视频+注册机源码) crackme006,依然是delphi的,而且没壳子,条线比较清晰,算法也不难,非常 ...

最新文章

  1. c语言指针实现字符串倒序输出,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
  2. 在CentOS 6.3 64bit上安装Apache Trafficserver 4.2.3挂载SAS硬盘和SSD
  3. 如何使用 Python 操作 Git 代码?GitPython 入门介绍
  4. Linux下的权限掩码umask
  5. plsql command window 执行批量脚本
  6. 这一年的猫粮,我们承包了!CATCODER程序员晒猫大赛正式开启!
  7. 错误消息 parent.relativePath points at wrong local POM的处理方法
  8. Android 动态设置 layout_centerInParent
  9. 浏览器svg插件_Archer-svgs: 异步加载svg方案
  10. Php 安装 zend_loader,在Linux系统中为PHP5.x安装Zend Guard Loader
  11. 提升前端线上问题发现率的方法
  12. 批量 材质 调整_3dmax怎么批量修改材质
  13. 第十六周助教心得体会
  14. 微积分-求导必背公式
  15. 我想健康富有聪明怎么导告_想要成为一个快乐而富有成效的程序员吗? 使用心理学的这5种技巧...
  16. 数学建模学习(47):灰色预测模型案例一(代码模板+模型建立)
  17. 【PostgreSQL-15的 \watch命令】
  18. SQL Server(六)-Transact-SQL语言
  19. Hi3516DV300
  20. 【pandas之DataFrame相关函数】loc()函数、iloc函数

热门文章

  1. php v9最新漏洞,Phpcms v9漏洞分析
  2. IDEA中的maven阿里仓库配置
  3. Simulink仿真系列 - Simulink模块-数字基带调制解调模块详解 M-PAM,M-FSK,M-PSK
  4. 【智慧PDU】智能PDU远程电源开关控制器技术参数
  5. 基于matlab的SEIR/SEIRS传染病模型仿真与模拟
  6. linux 命令:chgrp详解
  7. OpenVPN Connect踩坑日记
  8. Spring Boot入门(07):整合 MySQL 和 Druid数据源 | 全网最详细保姆级教学(两万字)
  9. 基于ssm的医院门诊互联电子病历管理信息系统设计与实现-计算机毕业设计源码+LW文档
  10. Word2010中的功能可以助你识别生僻字