CrackMe练习——Acid_burn

前言

首先十分感谢整理这些CrackMe的吾爱大佬,真是方便了我这样的小白。希望最后这160个CrackMe都可以做出,我会认真做好分析过程的。

准备

  • 系统:Windows 7 SP1 x64 ultimate
  • 工具:PEiD、OD

分析

运行程序,看下需要做些什么。

程序先弹出了一个对话框,就是一个简单的欢迎框,确定后即可看到主界面。

从主界面可以看到该程序有两个需要破解的地方,一个是左边的按钮,点开是序列号与用户名破解,另一个是右边的按钮,点开是序列号的破解。

那么,一个一个来吧。

Serial

先从单独一个序列号的开始吧。

先查下壳。

无壳,Delphi写的。

在序列号输入框中,随便输入,看看得到什么提示。

得到一个Try Again!的提示。

将程序载入OD,搜索下字符串,可以看到三个Try Again!字符串。其中有一个挨着Failed,所以猜测可能是这个。

双击定位,然后在调用函数的地方下断。

运行程序,输入错误的序列号,成功断下。

0042F4CA  |.  8B45 F0       mov eax,[local.4]
0042F4CD  |.  8B55 F4       mov edx,[local.3]
0042F4D0  |.  E8 2745FDFF   call Acid_bur.004039FC  //检测输入的序列号
0042F4D5  |.  75 1A         jnz short Acid_bur.0042F4F1
0042F4D7  |.  6A 00         push 0x0
0042F4D9  |.  B9 64F54200   mov ecx,Acid_bur.0042F564                ;  Congratz!
0042F4DE  |.  BA 70F54200   mov edx,Acid_bur.0042F570                ;  God Job dude !! =)
0042F4E3  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]
0042F4E8  |.  8B00          mov eax,dword ptr ds:[eax]
0042F4EA  |.  E8 81ACFFFF   call Acid_bur.0042A170
0042F4EF  |.  EB 18         jmp short Acid_bur.0042F509
0042F4F1  |>  6A 00         push 0x0
0042F4F3  |.  B9 84F54200   mov ecx,Acid_bur.0042F584                ;  Failed!
0042F4F8  |.  BA 8CF54200   mov edx,Acid_bur.0042F58C                ;  Try Again!!
0042F4FD  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]
0042F502  |.  8B00          mov eax,dword ptr ds:[eax]
0042F504  |.  E8 67ACFFFF   call Acid_bur.0042A170
0042F509  |>  33C0          xor eax,eax

可以看到成功提示和失败提示紧挨着,说明0x0042F4D0处调用的Acid_bur.00039FC函数,可能就是检测函数。

在0x0042F4D0处下断,运行到此处,可以看到该函数有两个参数,分别保存在eax和edx中,观察两个寄存器的值,可以看到我们输入的错误序列号和另一个序列号。

EAX 004F636C ASCII "123456"
ECX 75F66D51 user32.75F66D51
EDX 004F9834 ASCII "Hello Dude!"
EBX 004FA788
ESP 0018F8E0
EBP 0018F900
ESI 004F2480
EDI 004F2480
EIP 0042F4D0 Acid_bur.0042F4D0

那么Hello Dude!应该就是正确的序列号,输入测试,提示成功。

Serial/Name

接下来破解序列号+用户名。

随便输入,获取提示。

查看OD搜索的字符串,看到两组挨着的Try Again!Sorry , The serial is incorect !

点开第一组失败提示。

0042FA3B  |.  8B45 EC       mov eax,[local.5]
0042FA3E  |.  0FB640 02     movzx eax,byte ptr ds:[eax+0x2]
0042FA42  |.  6BC0 0E       imul eax,eax,0xE
0042FA45  |.  03F0          add esi,eax
0042FA47  |.  8935 58174300 mov dword ptr ds:[0x431758],esi
0042FA4D  |.  A1 6C174300   mov eax,dword ptr ds:[0x43176C]
0042FA52  |.  E8 D96EFDFF   call Acid_bur.00406930  //计算用户名长度
0042FA57  |.  83F8 04       cmp eax,0x4     //用户名长度需要大于等于4
0042FA5A  |.  7D 1D         jge short Acid_bur.0042FA79
0042FA5C  |.  6A 00         push 0x0
0042FA5E  |.  B9 74FB4200   mov ecx,Acid_bur.0042FB74                ;  Try Again!
0042FA63  |.  BA 80FB4200   mov edx,Acid_bur.0042FB80                ;  Sorry , The serial is incorect !
0042FA68  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]          ;  x_O
0042FA6D  |.  8B00          mov eax,dword ptr ds:[eax]
0042FA6F  |.  E8 FCA6FFFF   call Acid_bur.0042A170
0042FA74  |.  E9 BE000000   jmp Acid_bur.0042FB37

0x0042FA57处的比较指令可能是在比较用户名的长度。在此处下断,运行到此处,发现正好是用户名的长度,确定0x0042FA52处计算用户名长度,然后是否大于等于4,如果小于4的话,就弹出失败提示。

再定位到第二组失败提示。

0042FAE5  |.  E8 C23EFDFF   call Acid_bur.004039AC
0042FAEA  |.  8D55 F0       lea edx,[local.4]
0042FAED  |.  8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]
0042FAF3  |.  E8 60AFFEFF   call Acid_bur.0041AA58
0042FAF8  |.  8B55 F0       mov edx,[local.4]
0042FAFB  |.  8B45 F4       mov eax,[local.3]
0042FAFE  |.  E8 F93EFDFF   call Acid_bur.004039FC
0042FB03  |.  75 1A         jnz short Acid_bur.0042FB1F
0042FB05  |.  6A 00         push 0x0
0042FB07  |.  B9 CCFB4200   mov ecx,Acid_bur.0042FBCC                ;  Congratz !!
0042FB0C  |.  BA D8FB4200   mov edx,Acid_bur.0042FBD8                ;  Good job dude =)
0042FB11  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]          ;  x_O
0042FB16  |.  8B00          mov eax,dword ptr ds:[eax]
0042FB18  |.  E8 53A6FFFF   call Acid_bur.0042A170
0042FB1D  |.  EB 18         jmp short Acid_bur.0042FB37
0042FB1F  |>  6A 00         push 0x0
0042FB21  |.  B9 74FB4200   mov ecx,Acid_bur.0042FB74                ;  Try Again!
0042FB26  |.  BA 80FB4200   mov edx,Acid_bur.0042FB80                ;  Sorry , The serial is incorect !
0042FB2B  |.  A1 480A4300   mov eax,dword ptr ds:[0x430A48]          ;  x_O
0042FB30  |.  8B00          mov eax,dword ptr ds:[eax]
0042FB32  |.  E8 39A6FFFF   call Acid_bur.0042A170
0042FB37  |>  33C0          xor eax,eax

与成功提示紧挨着,那么0x0042FAFE处调用的Acid_bur.0042FB1F函数可能就是检测函数。有趣的是,函数与跳转指令之间没有比较指令,那么很有可能比较指令放在了函数里进行。

在0x0042FAFE处下断,运行到此处,可以看到该函数的两个参数的值。

EAX 004FA030 ASCII "CW-9512-CRACKED"
ECX 75F66D51 user32.75F66D51
EDX 004F90B0 ASCII "123456"
EBX 004F67B0 ASCII "x鸟"
ESP 0018F8D4
EBP 0018F900
ESI 00000B46
EDI 004F9B3C
EIP 0042FAFE Acid_bur.0042FAFE

edx中是输入的序列号,那么eax中的CW-9512-CRACKED应该就是正确的序列号了。

输入测试。弹出成功提示。

值得注意的是,序列号中的CW和CRACKED是固定的,9512是根据用户名计算的,

反向追踪9512出现的位置,可以发现算法的核心位置。

首先取用户名的第一个字母,与0x29相乘得到注册码初始值,然后计算出注册码,与CW、CRACKED连接起来与输入的注册码比较。

0042FA79  |> \8D55 F0       lea edx,[local.4]
0042FA7C  |.  8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042FA82  |.  E8 D1AFFEFF   call Acid_bur.0041AA58
0042FA87  |.  8B45 F0       mov eax,[local.4]
0042FA8A  |.  0FB600        movzx eax,byte ptr ds:[eax]         ;  取用户名首字母
0042FA8D  |.  F72D 50174300 imul dword ptr ds:[0x431750]        ;  与0x29相乘
0042FA93  |.  A3 50174300   mov dword ptr ds:[0x431750],eax
0042FA98  |.  A1 50174300   mov eax,dword ptr ds:[0x431750]
0042FA9D  |.  0105 50174300 add dword ptr ds:[0x431750],eax
0042FAA3  |.  8D45 FC       lea eax,[local.1]
0042FAA6  |.  BA ACFB4200   mov edx,Acid_bur.0042FBAC           ;  CW
0042FAAB  |.  E8 583CFDFF   call Acid_bur.00403708
0042FAB0  |.  8D45 F8       lea eax,[local.2]
0042FAB3  |.  BA B8FB4200   mov edx,Acid_bur.0042FBB8           ;  CRACKED
0042FAB8  |.  E8 4B3CFDFF   call Acid_bur.00403708
0042FABD  |.  FF75 FC       push [local.1]
0042FAC0  |.  68 C8FB4200   push Acid_bur.0042FBC8              ;  -
0042FAC5  |.  8D55 E8       lea edx,[local.6]
0042FAC8  |.  A1 50174300   mov eax,dword ptr ds:[0x431750]
0042FACD  |.  E8 466CFDFF   call Acid_bur.00406718              ;  计算函数

进一步分析,注册码初始值通过不断与0xA相除,余数+0x30,直到除法的结果为0,最后将每次结果的顺序逆序存放。

00406DC7  |>  8D75 C4       lea esi,[local.15]
00406DCA  |> |31D2          /xor edx,edx
00406DCC  |. |F7F1          |div ecx
00406DCE  |. |80C2 30       |add dl,0x30
00406DD1  |. |80FA 3A       |cmp dl,0x3A
00406DD4  |. |72 03         |jb short Acid_bur.00406DD9
00406DD6  |. |80C2 07       |add dl,0x7
00406DD9  |> |4E            |dec esi
00406DDA  |. |8816          |mov byte ptr ds:[esi],dl
00406DDC  |. |09C0          |or eax,eax
00406DDE  |.^|75 EA         \jnz short Acid_bur.00406DCA
00406DE0  |. |8D4D C4       lea ecx,[local.15]
00406DE3  |. |29F1          sub ecx,esi                         ;  计算注册码长度
00406DE5  |. |8B55 E0       mov edx,[local.8]
00406DE8  |. |83FA 10       cmp edx,0x10
00406DEB  |. |72 01         jb short Acid_bur.00406DEE

比如用户名为"test",取首字母‘t‘,即0x74。0x74 * 0x29 = 0x2528。

然后不断执行除法:

0x2528 / 0xA = 0x3B7...0x2,0x2 + 0x30 = 0x32

0x3B7 / 0xA = 0x5F...0x1,0x1 + 0x30 = 0x31

0x5F / 0xA = 0x9...0x5,0x5 + 0x30 = 0x35

0x9 / 0xA = 0...0x9,0x9 + 0x30 = 0x39

所以注册码应为9512。

参考

原文地址:https://www.cnblogs.com/Roachs/p/9365254.html

时间: 2024-11-07 14:15:15

CrackMe练习——Acid_burn的相关文章

14.6.13 爆破Acid_burn

Broland Delphi 3.0. 有Serial + Name 验证和 Serial 验证. 程序使用的是MessageBox, 所以 bp MessageBoxA. (ShowMessage不可以) Serial + Name 验证 随便输入: 标准的错误提示是: 程序停在MessageBoxA的地址, 来自0x0042A1A9的跳转, 转到这个地址. 这里上面应该压入了错误提示. 往上走找到这个子程序的第一句, 即0x42A170下断. 再次输入Serial 和 Name. 程序停在0

接触CrackMe 第一个

今天刚接触这个 做了一个简单的. 用Onlydbg加载之后,对GetDlgItemTextA函数下断点,因为程序是在控件上获取数据的. Register输入Name和Serial点击Ok之后,断点响应. 然后执行到return 返回到程序的代码,返回值就是 我们输入的数据. 然后经过一大段代码. 然后会看到下面这几行,其中两个call分别对两个数据进行处理. CALL CRACKME.0040137E   观察会变代码就会发现 , 这部分代码主要是判断输入字符串 按照我们的例子 如果是小写字母

160个crackme 004 ajj.1

这个crackme是有点奇葩的,输入name和Serial之后,就没有然后,然后了... 打开以后,输入伪码之后,什么也没有,没有按钮,一副死猪不怕开水烫的样子. PEid,看一下,Delphi的程序: 首先,用Delphi的神器:DeDe: 打开之后,找到过程,发线有几个过程,依次去看: 00457BD0 53 push ebx 00457BD1 8BD8 mov ebx, eax 00457BD3 8D8310030000 lea eax, [ebx+$0310] * Possible St

# 160个CrackMe 003 Afkayas.2

CrackMe 003是002的加强版,我们看看加强在哪里. OD运行,发现提示代码可能显示会出现问题,有压缩,用PEDI查一下, 发现程序并没有壳,这样即使有压缩,我们也可以手动脱掉. 首先,伪码检测: 进入OD,查找参考文本字符串,之后Call进去 向上大致查看一下程序的流程,然后找到函数的头部,F2下断,注意这个函数有点长,需要耐心一点 F9跑起来,输入我们的伪码,开始单步调试,还是同样的原则,先F8,遇到不认识的VB API函数就去查一下他是干什么的,我们需要做的是了解程序的流程,再遇到

160个CrackMe 002 Afkayas.1

首先,同样的操作,PEID查壳: VB的程序,没有壳,OK,注意一下VB中的函数就可以了,这里推荐一个微博,总结了在逆向中常用到的VB的函数 VB程序逆向反汇编常见的函数 试着自己运行: OD运行起来,右键,查找,查找所有参考文本字符串,找到错误字符串的位置 看到我们的错误字符串了,You Get Wrong,并且在上面还发现了应该是正确的字符串,两个字符串相距不远,嗯嗯,这个题目应该不难(至少跳转会少些..) 双击字符串进入位置,发现了跳转指令 在跳转的位置F2下断,重新运行程序,输入我们瞎扯

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

[反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西. 其中,文章中按照如下逻辑编排(解决如下问题): 1.使用什么环境和工具 2.程序分析 3.思路分析和破解流程 4.注册机的探索 ---------------------------------- 提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大

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

原地址:http://www.cnblogs.com/lopezycj/archive/2012/05/16/unity3d_tuchao.html Unity3D吐槽1--FBX导入 Unity3d用了也不久,也就几个月时间.插件很丰富,但有的是在很贵.编辑器写脚本还是不错,挺喜欢的,写好了,就能用,只是有些数据修改了脚本就无法保存了,场景内脚本控制的变量数据.如果要改脚本,就得先记录,后处理. 从3ds max导出带有动作的fbx文件,放进Unity3d里发生了如下的如下的错误: Impor

360破解大赛crackme分析--之3DES解密附加数据

详细的分析这里有,本人只是对这里面有趣的算法进行了一些学习 分析链接 这次是逆向的使用3DES解密的过程中的内容: 使用微软的crypt库 使用3DES解密程序中的附加数据 代码: VOID encryptData() { TCHAR szModuleFile[MAX_PATH] = "C:\\Users\\Administrator\\Desktop\\破解技术考题 360\\破解考题.over"; HANDLE hFile = ::CreateFile(szModuleFile,

第一个Android crackme(2016-05)

第一个Android crackme ? 0x00 背景 最近在学习Android的逆向,把基本的环境搭好后,看了看<第一行代码--Android>,然后就按照非虫大牛的<Android软件安全与逆向分析>开始了第一个apk的crack. 这篇文章权当是记录,没有什么技术含量. ? 0x01初探 首先来看看要crack的apk长啥样儿,启动一个安卓虚拟机,然后使用adb将apk安装到虚拟机中,命令如下: 可以看到虚拟机中已经安装了该apk: ? 启动这个apk,输入任意的用户名和注