【破文标题】fr1c-crackme7算法分析
【破文作者】tianxj
【作者邮箱】tianxj_2007@126.com
【作者主页】www.chinapyg.com
【破解工具】PEiD,OD,PE Explorer和DeDe
【破解平台】Windows XP
【软件名称】fr1c-crackme7
【原版下载】见附件
【保护方式】注册码
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:).
初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
一、运行程序,有NAG"Kill me !! My name is NAG SCREEN!"和灰色按钮
**************************************************************
二、用PEiD对这个软件查壳,为 UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo
**************************************************************
三、用PEiD对插件脱壳,为 Borland Delphi 4.0 - 5.0
**************************************************************
四、运行OD,打开CrackMe7.exe.unpacked_,右键—超级字串参考—查找ASCII.
发现"kill me !! my name is nag screen!"
00442704 . 53 PUSH EBX
00442705 . 8BD8 MOV EBX,EAX
00442707 . BA 94274400 MOV EDX,CrackMe7.00442794 ; crackme 7 by fr1c -
unregistered
0044270C . A1 34484400 MOV EAX,DWORD PTR DS:[444834]
00442711 . E8 BA16FEFF CALL CrackMe7.00423DD0
00442716 . 68 B8274400 PUSH CrackMe7.004427B8 ; /ursoft w32dasm ver
8.93 program disassembler/debugger
0044271B . 68 F0274400 PUSH CrackMe7.004427F0 ; |owl_window
00442720 . E8 EB39FCFF CALL <JMP.&USER32.FindWindowA> ; \FindWindowA
00442725 . 85C0 TEST EAX,EAX
00442727 . 7E 11 JLE SHORT CrackMe7.0044273A
00442729 . B8 04284400 MOV EAX,CrackMe7.00442804 ; w32dasm found
0044272E . E8 95F9FFFF CALL CrackMe7.004420C8
00442733 . 6A 00 PUSH 0 ; /ExitCode = 0
00442735 . E8 3635FCFF CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess
0044273A > 6A 00 PUSH 0 ; /hTemplateFile = NULL
0044273C . 68 80000000 PUSH 80 ; |Attributes = NORMAL
00442741 . 6A 03 PUSH 3 ; |Mode = OPEN_EXISTING
00442743 . 6A 00 PUSH 0 ; |pSecurity = NULL
00442745 . 6A 03 PUSH 3 ; |ShareMode =
FILE_SHARE_READ|FILE_SHARE_WRITE
00442747 . 68 000000C0 PUSH C0000000 ; |Access =
GENERIC_READ|GENERIC_WRITE
0044274C . 68 14284400 PUSH CrackMe7.00442814 ; |\\.\sice
00442751 . E8 EA34FCFF CALL <JMP.&KERNEL32.CreateFileA> ; \CreateFileA
00442756 . 83F8 FF CMP EAX,-1
00442759 . 74 17 JE SHORT CrackMe7.00442772
0044275B . 50 PUSH EAX ; /hObject
0044275C . E8 C734FCFF CALL <JMP.&KERNEL32.CloseHandle> ; \CloseHandle
00442761 . B8 28284400 MOV EAX,CrackMe7.00442828 ; softice is detected
00442766 . E8 5DF9FFFF CALL CrackMe7.004420C8
0044276B . 6A 00 PUSH 0 ; /ExitCode = 0
0044276D . E8 FE34FCFF CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess
00442772 > B8 44284400 MOV EAX,CrackMe7.00442844 ; kill me !! my name is nag screen!
00442777 . E8 4CF9FFFF CALL CrackMe7.004420C8
0044277C . 33D2 XOR EDX,EDX
0044277E . 8B83 CC020000 MOV EAX,DWORD PTR DS:[EBX+2CC]
00442784 . 8B08 MOV ECX,DWORD PTR DS:[EAX]
00442786 . FF51 60 CALL DWORD PTR DS:[ECX+60]
00442789 . 5B POP EBX
0044278A . C3 RETN
==============================================================
堆栈提示
0012FE2C 00439187 返回到 CrackMe7.00439187
==============================================================
00439150 $ 55 PUSH EBP
00439151 . 8BEC MOV EBP,ESP
00439153 . 51 PUSH ECX
00439154 . 53 PUSH EBX
00439155 . 56 PUSH ESI
00439156 . 57 PUSH EDI
00439157 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0043915A . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0043915D . 66:83B8 AE020>CMP WORD PTR DS:[EAX+2AE],0
00439165 . 74 41 JE SHORT CrackMe7.004391A8 ; //必须跳,NAG和灰色按钮则去掉
00439167 . 33C0 XOR EAX,EAX
00439169 . 55 PUSH EBP
0043916A . 68 91914300 PUSH CrackMe7.00439191
0043916F . 64:FF30 PUSH DWORD PTR FS:[EAX]
00439172 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
00439175 . 8B5D FC MOV EBX,DWORD PTR SS:[EBP-4]
00439178 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0043917B . 8B83 B0020000 MOV EAX,DWORD PTR DS:[EBX+2B0]
00439181 . FF93 AC020000 CALL DWORD PTR DS:[EBX+2AC]
00439187 . 33C0 XOR EAX,EAX
00439189 . 5A POP EDX
0043918A . 59 POP ECX
0043918B . 59 POP ECX
0043918C . 64:8910 MOV DWORD PTR FS:[EAX],EDX
0043918F . EB 17 JMP SHORT CrackMe7.004391A8
00439191 .- E9 DA9EFCFF JMP CrackMe7.00403070
00439196 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00439199 . A1 A4474400 MOV EAX,DWORD PTR DS:[4447A4]
0043919E . E8 396A0000 CALL CrackMe7.0043FBDC
004391A3 . E8 78A1FCFF CALL CrackMe7.00403320
004391A8 > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004391AB . F680 C0020000>TEST BYTE PTR DS:[EAX+2C0],2
004391B2 . 74 0A JE SHORT CrackMe7.004391BE
004391B4 . B2 01 MOV DL,1
004391B6 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004391B9 . E8 CE080000 CALL CrackMe7.00439A8C
004391BE > 5F POP EDI
004391BF . 5E POP ESI
004391C0 . 5B POP EBX
004391C1 . 59 POP ECX
004391C2 . 5D POP EBP
004391C3 . C3 RETN
==============================================================
五、用PE Explorer和DeDe查按钮事件,地址为
00442880 55 push ebp
六、运行OD,打开CrackMe7.exe.unpacked_jmp,右键—转到—表达式—00442880
00442880 /. 55 PUSH EBP
00442881 |. 8BEC MOV EBP,ESP
00442883 |. 33C9 XOR ECX,ECX
00442885 |. 51 PUSH ECX
00442886 |. 51 PUSH ECX
00442887 |. 51 PUSH ECX
00442888 |. 51 PUSH ECX
00442889 |. 53 PUSH EBX
0044288A |. 56 PUSH ESI
0044288B |. 57 PUSH EDI
0044288C |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0044288F |. 33C0 XOR EAX,EAX
00442891 |. 55 PUSH EBP
00442892 |. 68 4B294400 PUSH CrackMe7.0044294B
00442897 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0044289A |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0044289D |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
004428A0 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004428A3 |. 8B80 C4020000 MOV EAX,DWORD PTR DS:[EAX+2C4]
004428A9 |. E8 F214FEFF CALL CrackMe7.00423DA0
004428AE |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; //EAX=[EBP-C]=用户名
004428B1 |. E8 7E11FCFF CALL CrackMe7.00403A34
004428B6 |. 8BF0 MOV ESI,EAX ; //ESI=EAX=用户名长度
004428B8 |. 85F6 TEST ESI,ESI
004428BA |. 7E 41 JLE SHORT CrackMe7.004428FD
004428BC |. BF 01000000 MOV EDI,1 ; //EDI=1
004428C1 |> 8D55 F4 /LEA EDX,DWORD PTR SS:[EBP-C]
004428C4 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
004428C7 |. 8B80 C4020000 |MOV EAX,DWORD PTR DS:[EAX+2C4]
004428CD |. E8 CE14FEFF |CALL CrackMe7.00423DA0
004428D2 |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C] ; //EAX=[EBP-C]=用户名
004428D5 |. 0FB64438 FF |MOVZX EAX,BYTE PTR DS:[EAX+EDI-1] ; //EAX=[EAX+EDI-1]=
用户名第i个字符的ASC值
004428DA |. 8BD8 |MOV EBX,EAX ; //EBX=EAX
004428DC |. 6BC3 63 |IMUL EAX,EBX,63 ; //EAX=EBX*63h
004428DF |. 8BD8 |MOV EBX,EAX ; //EBX=EAX
004428E1 |. 83F3 06 |XOR EBX,6 ; //EBX=EBX xor 6h
004428E4 |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10]
004428E7 |. 8BD3 |MOV EDX,EBX ; //EDX=EBX
004428E9 |. E8 6E10FCFF |CALL CrackMe7.0040395C
004428EE |. 8B55 F0 |MOV EDX,DWORD PTR SS:[EBP-10]
004428F1 |. 8D45 F8 |LEA EAX,DWORD PTR SS:[EBP-8]
004428F4 |. E8 4311FCFF |CALL CrackMe7.00403A3C
004428F9 |. 47 |INC EDI ; //EDI=EDI+1
004428FA |. 4E |DEC ESI ; //ESI=ESI-1
004428FB |.^ 75 C4 \JNZ SHORT CrackMe7.004428C1 ; //循环
004428FD |> 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
00442900 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00442903 |. 8B80 C8020000 MOV EAX,DWORD PTR DS:[EAX+2C8]
00442909 |. E8 9214FEFF CALL CrackMe7.00423DA0
0044290E |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] ; //试练码及地址
00442911 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; //真码地址
00442914 |. E8 2B12FCFF CALL CrackMe7.00403B44 ; //比较CALL
00442919 |. 75 0A JNZ SHORT CrackMe7.00442925 ; //关键跳转
0044291B |. B8 64294400 MOV EAX,CrackMe7.00442964 ; good work cracker!
00442920 |. E8 A3F7FFFF CALL CrackMe7.004420C8
00442925 |> 33C0 XOR EAX,EAX ; (初始 cpu 选择)
00442927 |. 5A POP EDX
00442928 |. 59 POP ECX
00442929 |. 59 POP ECX
0044292A |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0044292D |. 68 52294400 PUSH CrackMe7.00442952
00442932 |> 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
00442935 |. E8 7E0EFCFF CALL CrackMe7.004037B8
0044293A |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0044293D |. E8 760EFCFF CALL CrackMe7.004037B8
00442942 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00442945 |. E8 6E0EFCFF CALL CrackMe7.004037B8
0044294A \. C3 RETN
0044294B .- E9 2809FCFF JMP CrackMe7.00403278
00442950 .^ EB E0 JMP SHORT CrackMe7.00442932
00442952 . 5F POP EDI
00442953 . 5E POP ESI
00442954 . 5B POP EBX
00442955 . 8BE5 MOV ESP,EBP
00442957 . 5D POP EBP
00442958 . C3 RETN
**************************************************************
【破解总结】
反调试,非明码比较,可以在00442914处用命令d eax来查看注册码
--------------------------------------------------------------
【算法总结】
依次将用户名ASC值与63h相乘再与6h异或,取最后2位转字符,将字符相连即为注册码
--------------------------------------------------------------
【算法注册机】
.版本 2
.局部变量 i, 整数型
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 c, 文本型
.局部变量 d, 文本型
.局部变量 e, 整数型
.局部变量 f, 文本型
.如果 (编辑框1.内容 = “”)
编辑框2.内容 = “输入有误,请重新输入!”
.否则
.计次循环首 (取文本长度 (编辑框1.内容), i)
a = 取代码 (取文本中间 (编辑框1.内容, i, 1), )
b = a × 99
b = 位异或 (b, 6)
c = 取十六进制文本 (b)
d = 取文本右边 (c, 2)
e = 十六进制到十进制 (d)
f = f + 字符 (e)
.计次循环尾 ()
编辑框2.内容 = f
.如果结束
.子程序 十六进制到十进制, 整数型
.参数 十六进制文本, 文本型
.局部变量 文本, 文本型
.局部变量 最终值, 整数型
.局部变量 i, 整数型, , , 中间循环变量
.局部变量 临时数值, 文本型, , , 每一位上的值
文本 = 到小写 (十六进制文本)
.变量循环首 (1, 取文本长度 (文本), 1, i)
临时数值 = 取文本中间 (文本, i, 1)
.如果 (取代码 (临时数值, ) ≥ 取代码 (“a”, ) 且 取代码 (临时数值, ) ≤ 取代码 (“f”,
))
最终值 = 最终值 + (取代码 (临时数值, ) - 取代码 (“a”, ) + 10) × 求次方 (16,
取文本长度 (文本) - i)
.否则
最终值 = 最终值 + 到数值 (临时数值) × 求次方 (16, 取文本长度 (文本) - i)
.如果结束
.变量循环尾 ()
返回 (最终值)
--------------------------------------------------------------
【爆破地址】
00442919 |. 75 0A JNZ SHORT CrackMe7.00442925
将JNZ改为JE
--------------------------------------------------------------
【注册信息】
用户名:abcdef
注册码:呧O?t HEX= 85 E0 4F AA 09 74
--------------------------------------------------------------
感谢飘云老大、猫老大、Nisy老大以及很多前辈们的学习教程以及所有帮助过我的论坛兄弟姐妹们!谢谢
--------------------------------------------------------------
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: