论坛: 编程破解 标题: [转帖]私人保险箱V5.93的算法分析 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
【文章标题】: 私人保险箱 V5.93 的算法分析
【文章作者】: 小糊涂神
【作者邮箱】: fing-114@163.com
【作者主页】: www.fingsky.cn
【作者QQ号】: 502079909
【软件名称】: 私人保险箱 V5.93
【软件大小】: 3388 KB
【下载地址】: http://www.skycn.com/soft/14176.html
【加壳方式】: ASPack 2.12 -> Alexey Solodovnikov
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: PEID、OD
【操作平台】: WinXP SP2
【软件介绍】: 最新版,10月8日更新的,能够帮助您方便快捷彻底地隐藏文件。
【作者声明】: 呵呵,纯属个人爱好。有不对的地方,请高手指点![破解初学者练手用的]
*********本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!***********
--------------------------------------------------------------------------------
【详细过程】
1、PEID查壳得知: ASPack 2.12 -> Alexey Solodovnikov
这个壳很好脱,也有响应的脱壳机。
不过,偶一直喜欢手脱!嘿嘿~~~(因为很简单,我就不详细说了,我在上次的破文中已经说过了)
OD载入。。。
-----------------------------------------------------------------
005EA001 > 60 pushad
005EA002 E8 03000000 call xx.005EA00A // ESP 定律脱壳!
005EA007 - E9 EB045D45 jmp 45BBA4F7
005EA00C 55 push ebp
005EA00D C3 retn
……
------------------------------------------------------------------

004E0C44 > 55 push ebp //入口点!
004E0C45 8BEC mov ebp,esp
004E0C47 83C4 F0 add esp,-10
004E0C4A 53 push ebx
004E0C4B 56 push esi
004E0C4C B8 BC084E00 mov eax,x.004E08BC
……
-----------------------------------------------------------------
2、脱完壳后,运行看看,注册输入任意注册码:54321 后提示错误:注册失败!
那好!,OD载入脱壳后的程序,查找 ASCII 码:“注册失败”,找到后双击进入!

004DC085 BA 14C14D00 mov edx,x.004DC114 ; 注册失败!

我们就接着往上找代码,找这小段程序的开始,看看在哪里~~很容易就可以找到。。。

004DBFCF 55 push ebp // 注册码验证程序开始,下断,运行

下断运行,输入管理员密码:8888 登陆后,再去注册它!,我的机器码是 3FEBFBFF 试练码:54321 ,确定后

,OD就断在 004DBFCF 这个地方了,取消断点后,F8往下跟。。。

**************************************************************************************
004DBFCF 55 push ebp
004DBFD0 68 C1C04D00 push x.004DC0C1
004DBFD5 64:FF30 push dword ptr fs:[eax]
004DBFD8 64:8920 mov dword ptr fs:[eax],esp
004DBFDB 8D55 FC lea edx,dword ptr ss:[ebp-4]
004DBFDE 8B86 04040000 mov eax,dword ptr ds:[esi+404]
004DBFE4 E8 4F9AF6FF call x.00445A38
004DBFE9 8B45 FC mov eax,dword ptr ss:[ebp-4] //取假码54321送到eax
004DBFEC 50 push eax //eax=00F79400, (ASCII "54321")
004DBFED 6A 03 push 3
004DBFEF 8D45 F8 lea eax,dword ptr ss:[ebp-8] //eax=0012FC5C
004DBFF2 50 push eax
004DBFF3 8D45 F4 lea eax,dword ptr ss:[ebp-C] //eax=0012FC58
004DBFF6 E8 B5AFFEFF call x.004C6FB0
004DBFFB 8B45 F4 mov eax,dword ptr ss:[ebp-C] // eax=(ss:[0012FC58]=)00F6D800,

(ASCII "3FEBFBFF")
004DBFFE B9 02000000 mov ecx,2
004DC003 BA 01000000 mov edx,1
004DC008 E8 7BB0FEFF call x.004C7088 //算真正的注册码 ASCII "3FDAALX{"
004DC00D 8B55 F8 mov edx,dword ptr ss:[ebp-8] //送 00F7947C,

(ASCII "3FDAALX{") 给edx
004DC010 58 pop eax //出栈,取 假码 (堆栈 [0012FC3C]

=00F79400 (00F79400), ASCII "54321")

004DC011 E8 7E90F2FF call x.00405094 //关键比较!!进去~~
004DC016 75 66 jnz short x.004DC07E //关键跳,跳走就注册失败!(想偷懒的就改这里)
004DC018 B2 01 mov dl,1
004DC01A A1 547B4600 mov eax,dword ptr ds:[467B54]
004DC01F E8 30BCF8FF call x.00467C54
004DC024 8BD8 mov ebx,eax
004DC026 BA 01000080 mov edx,80000001
004DC02B 8BC3 mov eax,ebx
004DC02D E8 C2BCF8FF call x.00467CF4
004DC032 B1 01 mov cl,1
004DC034 BA D8C04D00 mov edx,x.004DC0D8 ; software\safebox
004DC039 8BC3 mov eax,ebx
004DC03B E8 F8BDF8FF call x.00467E38
004DC040 8D55 F0 lea edx,dword ptr ss:[ebp-10]
004DC043 8B86 04040000 mov eax,dword ptr ds:[esi+404]
004DC049 E8 EA99F6FF call x.00445A38
004DC04E 8B4D F0 mov ecx,dword ptr ss:[ebp-10]
004DC051 BA F4C04D00 mov edx,x.004DC0F4 ; regnum
004DC056 8BC3 mov eax,ebx
004DC058 E8 07C3F8FF call x.00468364
004DC05D 8BC3 mov eax,ebx
004DC05F E8 A87EF2FF call x.00403F0C
004DC064 6A 00 push 0
004DC066 B9 FCC04D00 mov ecx,x.004DC0FC ; 私人保险箱
004DC06B BA 08C14D00 mov edx,x.004DC108 ; 注册成功!
004DC070 A1 542C4E00 mov eax,dword ptr ds:[4E2C54]
004DC075 8B00 mov eax,dword ptr ds:[eax]
004DC077 E8 3CA7F8FF call x.004667B8
004DC07C EB 18 jmp short x.004DC096
004DC07E 6A 00 push 0
004DC080 B9 FCC04D00 mov ecx,x.004DC0FC ; 私人保险箱
004DC085 BA 14C14D00 mov edx,x.004DC114 ; 注册失败!
004DC08A A1 542C4E00 mov eax,dword ptr ds:[4E2C54]
004DC08F 8B00 mov eax,dword ptr ds:[eax]
004DC091 E8 22A7F8FF call x.004667B8
……
******************************************************************************************


3、下面我们来看看他的算法:

004DC008 E8 7BB0FEFF call x.004C7088 //算真正的注册码 ASCII "3FDAALX{"

这个call我们F7跟进去,

***********************************算真正的注册码*******************************************

004C7088 55 push ebp //ebp=0012FC64压栈
004C7089 8BEC mov ebp,esp //esp=0012FC2C 送给 ebp=0012FC2C
004C708B 83C4 F0 add esp,-10 //ESP=0012FC1C
004C708E 53 push ebx //ebx=00F21CFO(LeI)压栈,
004C708F 56 push esi //esi=00F1CF98压栈
004C7090 57 push edi //edi=0012FE20压栈
004C7091 33DB xor ebx,ebx //ebx清0
004C7093 895D F0 mov dword ptr ss:[ebp-10],ebx //ss:[ebp-10]=0012FC1C=ebx=0
004C7096 894D F8 mov dword ptr ss:[ebp-8],ecx //ss:[ebp-8]=0012FC24=ecx=00000002
004C7099 8BF2 mov esi,edx //esi=edx=00000001
004C709B 8945 FC mov dword ptr ss:[ebp-4],eax //将机器码送给ss:[ebp-4]=0012FC28
004C709E 8B7D 08 mov edi,dword ptr ss:[ebp+8] //edi=ss:[0012FC34]=0012FC5C
004C70A1 33C0 xor eax,eax
004C70A3 55 push ebp //ebp=0012FC2C
004C70A4 68 1B714C00 push x.004C711B
004C70A9 64:FF30 push dword ptr fs:[eax]
004C70AC 64:8920 mov dword ptr fs:[eax],esp
004C70AF 8BC7 mov eax,edi //eax=0012FC5C
004C70B1 E8 E2DBF3FF call x.00404C98
004C70B6 8B45 FC mov eax,dword ptr ss:[ebp-4] //去机器码给eax
004C70B9 E8 92DEF3FF call x.00404F50
004C70BE 84C0 test al,al //al=08 (Backspace) (eax=00000008)
004C70C0 76 43 jbe short x.004C7105 //小于等于就跳走,未实现
004C70C2 8845 F7 mov byte ptr ss:[ebp-9],al //al 送给 ss:[0012FC23]=00
004C70C5 B3 01 mov bl,1 //ebx=0,执行后,ebx=00000001
004C70C7 8D45 F0 lea eax,dword ptr ss:[ebp-10] //取0012FC1C给eax (=0012FC1C)
004C70CA 33D2 xor edx,edx //by小糊涂神(天塌了)
004C70CC 8AD3 mov dl,bl
004C70CE 8B4D FC mov ecx,dword ptr ss:[ebp-4] //机器码00F6D800("3FEBFBFF")给ecx
004C70D1 8A5411 FF mov dl,byte ptr ds:[ecx+edx-1]//取机器码的第一个字符‘3’的ASCII码33
004C70D5 8BCE mov ecx,esi //ecx=00000001
004C70D7 C1E9 08 shr ecx,8 //ecx得0
004C70DA 32D1 xor dl,cl //异或,得到ASCII码
004C70DC E8 97DDF3FF call x.00404E78
004C70E1 8B55 F0 mov edx,dword ptr ss:[ebp-10] //堆栈 ss:[0012FC1C]=00F42020 送edx
004C70E4 8BC7 mov eax,edi //eax=0012FC5C
004C70E6 E8 6DDEF3FF call x.00404F58 //进去,(fing)根据异或结果换算ASCII

码所对应的字符!
004C70EB 33C0 xor eax,eax //00404D2E返回。eax置0
004C70ED 8AC3 mov al,bl //01送给al
004C70EF 8B17 mov edx,dword ptr ds:[edi] //堆栈 ds:[0012FC5C]=00F42020 送 edx
004C70F1 0FB64402 FF movzx eax,byte ptr ds:[edx+eax-1] //先零扩展,再传送 eax=1
ds:[00F42020]=33 ('3')
004C70F6 03F0 add esi,eax //eax(33)+esi(1)=34 送回esi
004C70F8 0FAF75 F8 imul esi,dword ptr ss:[ebp-8] //堆栈 ss:[0012FC24]=00000002
esi=34*2=68
004C70FC 0375 0C add esi,dword ptr ss:[ebp+C] //堆栈 ss:[0012FC38]=00000003
esi=00000068+3=6B
004C70FF 43 inc ebx //ebx自加1得到2
004C7100 FE4D F7 dec byte ptr ss:[ebp-9] //堆栈 ss:[0012FC23]=08 (Backspace)减1
004C7103 ^ 75 C2 jnz short x.004C70C7 //不等于0跳转成功(循环取机器码换算!)
004C7105 33C0 xor eax,eax
004C7107 5A pop edx
004C7108 59 pop ecx
004C7109 59 pop ecx
004C710A 64:8910 mov dword ptr fs:[eax],edx
004C710D 68 22714C00 push x.004C7122
004C7112 8D45 F0 lea eax,dword ptr ss:[ebp-10]
004C7115 E8 7EDBF3FF call x.00404C98
004C711A C3 retn //返回到 004C7122 (x.004C7122)



++++++++++++++++++++++++++++++++++++++ fing 开始 ++++++++++++++++++++++++++++++++++++++++++

00404F58 85D2 test edx,edx
00404F5A 74 3F je short x.00404F9B //未实现
00404F5C 8B08 mov ecx,dword ptr ds:[eax] //ecx=0
00404F5E 85C9 test ecx,ecx
00404F60 ^ 0F84 86FDFFFF je x.00404CEC //跳转实现(很大的回跳哦)(005)
00404F66 53 push ebx
00404F67 56 push esi
00404F68 57 push edi
00404F69 89C3 mov ebx,eax
00404F6B 89D6 mov esi,edx
00404F6D 8B79 FC mov edi,dword ptr ds:[ecx-4]
00404F70 8B56 FC mov edx,dword ptr ds:[esi-4]
00404F73 01FA add edx,edi
00404F75 39CE cmp esi,ecx
00404F77 74 17 je short x.00404F90
00404F79 E8 56030000 call x.004052D4
00404F7E 89F0 mov eax,esi
00404F80 8B4E FC mov ecx,dword ptr ds:[esi-4]
00404F83 8B13 mov edx,dword ptr ds:[ebx]
00404F85 01FA add edx,edi
00404F87 E8 2CDBFFFF call x.00402AB8
00404F8C 5F pop edi
00404F8D 5E pop esi
00404F8E 5B pop ebx
00404F8F C3 retn
00404F90 E8 3F030000 call x.004052D4
00404F95 8B03 mov eax,dword ptr ds:[ebx]
00404F97 89F9 mov ecx,edi
00404F99 ^ EB E8 jmp short x.00404F83
00404F9B C3 retn




00404CEC 85D2 test edx,edx
00404CEE 74 24 je short x.00404D14 //位实现
00404CF0 8B4A F8 mov ecx,dword ptr ds:[edx-8] //把 1 给 ecx
00404CF3 41 inc ecx //ecx自加1得到2
00404CF4 7F 1A jg short x.00404D10 //大于就跳,实现!!!
00404CF6 50 push eax
00404CF7 52 push edx
00404CF8 8B42 FC mov eax,dword ptr ds:[edx-4]
00404CFB E8 5C000000 call x.00404D5C
00404D00 89C2 mov edx,eax
00404D02 58 pop eax
00404D03 52 push edx
00404D04 8B48 FC mov ecx,dword ptr ds:[eax-4]
00404D07 E8 ACDDFFFF call x.00402AB8
00404D0C 5A pop edx
00404D0D 58 pop eax
00404D0E EB 04 jmp short x.00404D14
00404D10 F0:FF42 F8 lock inc dword ptr ds:[edx-8] //锁定前缀,小弟菜鸟,还不是很明白他
00404D14 8710 xchg dword ptr ds:[eax],edx //交换 edx=00F42020
堆栈 ds:[0012FC5C]=00000000
00404D16 85D2 test edx,edx
00404D18 74 14 je short x.00404D2E //为0。跳转实现
00404D1A 8B4A F8 mov ecx,dword ptr ds:[edx-8]
00404D1D 49 dec ecx
00404D1E 7C 0E jl short x.00404D2E
00404D20 F0:FF4A F8 lock dec dword ptr ds:[edx-8]
00404D24 75 08 jnz short x.00404D2E
00404D26 8D42 F8 lea eax,dword ptr ds:[edx-8]
00404D29 E8 62DAFFFF call x.00402790
00404D2E C3 retn //返回到 004C70EB (x.004C70EB)


++++++++++++++++++++++++++++++++++++++ fing 结束 ++++++++++++++++++++++++++++++++++++++++++

4、算法分析:

很明显,首先是逐位读取机器码(我的机器码 3FEBFBFF)!然后逐位计算的。
先读取第1位,“3”,取他ASCII码值(16进制):“33”,然后把ecx里的值(由esi转移值过来,初始值=1)

逻辑右移 8 位,得到的结果的最后一个字节值与“33”做异或运算,得到的结果就是真正注册码的字符的

ASCII 值,保存后,循环,再读取机器码第2位,“F”,他的 ASCII值:“46” ,这个时候esi里的值是第1位

运算后的结果6B(不再是1),所以这个时候是把 6B 逻辑右移 8 位,得到的结果的最后一个字节值与“46”

做异或运算,得到的结果就是真正注册码的下一个字符的 ASCII 值,而这个时候得到的esi的值又将参与下一

位(第3位)注册码的运算~~ esi是前一个字符的ASCII码值加上esi的上一个值后 再乘以 2 然后再加上 3 )

同理推下去~~

注册码第 1 位(ESI值):esi初始值是1,所以 esi[1] = 1

注册码第 2 位(ESI值):首先 : 33(机器码第1个字符‘3’的ASCII值)+ esi[1] = 33+1 = 34
再乘以2得: 34x2=68
然后再加3得: 68+3=6B
所以esi[2]=6B

注册码第 3 位(ESI值):首先 : 46(机器码第2个字符‘F’的ASCII值)+ esi[2] = 46+6B = B1
再乘以2得: B1x2=162
然后再加3得: 162+3=165
所以esi[3]=165

……
……

最后得出: 注册码第N位 = N位字符的ASCII值 xor (esi[N] shr 8 )


我的注册码:3FDAALX{

这个算法不难,写注册机很简单,个人认为用 C 语言写方便~~~

地主 发表时间: 06-10-14 09:33

回复: jhkdiy [jhkdiy]   版主   登录
谢谢,要是原创就更好了。

B1层 发表时间: 06-10-14 16:40

回复: yangguo [yangguo]   论坛用户   登录
排版不是很好,

B2层 发表时间: 06-10-15 00:29

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号