【文章标题】: 简单分析crackme算法之一
【文章作者】: shuair
【软件名称】: CRACKME.EXE
【软件大小】: 6.56 KB
【下载地址】: 本地下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: MASM32 / TASM32 [Overlay]
【使用工具】: OD
【操作平台】: Windows 2003
【作者声明】: 业余爱好,欢迎交流!
--------------------------------------------------------------------------------
【详细过程】
一,用PEID查壳为MASM32 / TASM32 [Overlay]无壳。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
二,运行软件,注册窗口进行注册,输入错误的注册信息进行检测!软件有尾巴!
提示说:“No luck there mate!”
用OD载入,右键超级字串查找,找到"No luck there mate!",双击进入程序代码段,往上查找,在一个合适的地方下断。
00401382 |. 56 push esi ; CRACKME.0040218E
00401383 |> 8A06 /mov al, [esi] 获取第一位
00401385 |. 84C0 |test al, al
00401387 |. 74 13 |je short 0040139C
00401389 |. 3C 41 |cmp al, 41
0040138B |. 72 1F |jb short 004013AC 小于41
0040138D |. 3C 5A |cmp al, 5A
0040138F |. 73 03 |jnb short 00401394 如果大于等于5A 检查!
00401391 |. 46 |inc esi
00401392 |.^ EB EF |jmp short 00401383
00401394 |> E8 39000000 |call 004013D2
00401399 |. 46 |inc esi
0040139A |.^ EB E7 \jmp short 00401383
0040139C |> 5E pop esi
0040139D |. E8 20000000 call 004013C2 ; |这里是用户名位数想加,进入看看!
004013A2 |. 81F7 78560000 xor edi, 5678 //结果与5678 xor
004013A8 |. 8BC7 mov eax, edi
004013AA |. EB 15 jmp short 004013C1
004013AC |> 5E pop esi
004013AD |. 6A 30 push 30 ; /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 dword ptr [ebp+8] ; |hOwner
004013BC |. E8 79000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
004013C1 \> C3 retn //注册码位置
用户名CALL算法:
004013C2 /$ 33FF xor edi, edi
004013C4 |. 33DB xor ebx, ebx
004013C6 |> 8A1E /mov bl, [esi] ; 取第一位
004013C8 |. 84DB |test bl, bl
004013CA |. 74 05 |je short 004013D1
004013CC |. 03FB |add edi, ebx ; 第一位和0加保存=edi ;;第二次=第一次结果+第二位
004013CE |. 46 |inc esi
004013CF |.^ EB F5 \jmp short 004013C6
来到这里:
00401232 . 50 push eax
00401233 . 68 7E214000 push 0040217E ; ASCII "78"
00401238 . E8 9B010000 call 004013D8 ; 算法
0040123D . 83C4 04 add esp, 4
00401240 . 58 pop eax
00401241 . 3BC3 cmp eax, ebx ; 用户名的与5678异或的结果与注册码比较
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
00401253 /. C8 000000 enter 0, 0
00401257 |. 53 push ebx
00401258 |. 56 push esi
00401259 |. 57 push edi
进入算法Call
004013D8 /$ 33C0 xor eax, eax ; 清0
004013DA |. 33FF xor edi, edi ; 清0
004013DC |. 33DB xor ebx, ebx ; 清0
004013DE |. 8B7424 04 mov esi, [esp+4] ; 取注册码78
004013E2 |> B0 0A /mov al, 0A
004013E4 |. 8A1E |mov bl, [esi] ; 取注册码第一位7 取8
004013E6 |. 84DB |test bl, bl
004013E8 |. 74 0B |je short 004013F5
004013EA |. 80EB 30 |sub bl, 30 ; 37-30 38-30
004013ED |. 0FAFF8 |imul edi, eax ; 0*A 第一位结果edi*A
004013F0 |. 03FB |add edi, ebx ; 得到的结果加第一位=edi edi*a+第二位
;
004013F2 |. 46 |inc esi ; 下一位
004013F3 |.^ EB ED \jmp short 004013E2
004013F5 |> 81F7 34120000 xor edi, 1234 ; (edi*a+第二位)结果 与 1234 异或
004013FB |. 8BDF mov ebx, edi
004013FD \. C3 retn
--------------------------------------------------------------------------------
【经验总结】
它的算法是:
用户名的位数想加得到的数与5678做异或运算
注册码第一位-30 = 用A标记 第二次很明显了哦~
第一位 * A(这里被初始为0了;;;这句xor eax, eax) = B 标记 第二次循环时:第一位结果edi*A
第一位edi+0 =C 标记 ;;;第二次时:edi*a+第二位
最后的出edi 与 1234 做异或! 比较注册名与注册码是否相等,如果相等成功.不等OVER.描述有些乱边调试边对照边想想就OK!
后记:有一年多没有来看雪了,突然有种兴奋就有了这篇破文,适合菜鸟看!
PS:感觉论坛很慢!!!!HOHO
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)