一个专门用于开发和锻炼右脑的软件(名字就不说了)下载地址 http://www.fksd3.com/fksd2.rar。我最近因为待业家中闲的无事,便拿起工具开始玩已经停了几年的加密分析。本来想自己好几年没弄了再说又是菜鸟所以想找个软柿子捏一下鼓舞自己的信心所以找了一个不太有人用并且坐着好几年没有更新的软件。哈哈,哪知道我有眼不识泰山且不说软件本身功能怎么怎么地,但他的加密技术可不是一般地。断断续续搞了快一个礼拜虽然最终结果是失败但是在解密分析的过程中我还是得到很多乐趣的
。下面写一下我这个菜鸟折腾的经过。
软件是绿色包装,目录里有2个执行文件一个是主程序vb写的用了一个不太常用的壳不过很好脱,另一个是注册校验的程序是用upx压缩的delphi程序。脱壳之后用od载入主程序发觉运行不正常而且也不能正常弹出要求注册的窗口,然后又试了通过附加的方式载入程序,od出现异常 C000001E (INVALID LOCK SEQUENCE)忽略之后出现“不知如何回避位于地址01E7B693的命令请尝试更新eip或忽略程序异常”报错估计是主程序用了反调试的技术。我不甘心就这样放弃下载安装了syser但是实在太菜很快放弃,然后又安装了smartcheck也不能运行接着是VBExplorer和 vb_decompiler_pro这两个反编译软件,可能是对中午支持不好也放都弃了。到此看来爆破是不行了,只有去研究那个delphi写的注册校验程序了结果那些犹如天书般得汇编代码让我差点晕倒在电脑前最终也无功而返,不过我对这个程序倒也分析出了点头绪。
主程序运行之后提示要注册,点击注册按钮启动注册验证程序输入用户名和密码用od跟踪发现程序对输入的序列号进行5次验证前两次是验证用户和密码是否为空,第三次验证序列号的前8位这个数字和机器的硬件码对应。第四次和第三次用的是一样的call但是对应的序列号每次都在变我还没弄懂。第五次可能是序列号长度的验证。我通过改od代码的方式成功运行到弹出”注册成功请重启程序“。但是主程序启动还是提示注册。注册验证程序会在res的目录下 产生一个 lhg.lc文件里面是经过加密的序列号等信息。程序的关键算法我觉得是在这里:
00466C12 |. E8 4D25FAFF call 00409164 ; 产生随机序列号的过程是关键的地方
00466C17 |. 8B55 A4 mov edx, dword ptr [ebp-5C]
00466C1A |. 8B45 E0 mov eax, dword ptr [ebp-20]
00466C1D |. E8 72E4F9FF call 00405094 ;这个是比较序列号的call
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00409164 /$ 55 push ebp
00409165 |. 8BEC mov ebp, esp
00409167 |. 83F8 20 cmp eax, 20
0040916A |. 7E 02 jle short 0040916E
0040916C |. 31C0 xor eax, eax
0040916E |> 56 push esi
0040916F |. 89E6 mov esi, esp
00409171 |. 83EC 20 sub esp, 20
00409174 |. B9 10000000 mov ecx, 10
00409179 |. 52 push edx
0040917A |. 89C2 mov edx, eax
0040917C |. 8D45 08 lea eax, dword ptr [ebp+8]
0040917F |. E8 C4FEFFFF call 00409048 ; 进入这里
00409184 |. 89F2 mov edx, esi
00409186 |. 58 pop eax
00409187 |. E8 ECBBFFFF call 00404D78
0040918C |. 83C4 20 add esp, 20
0040918F |. 5E pop esi
00409190 |. 5D pop ebp
00409191 \. C2 0800 retn 8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00409048 /$ 08C9 or cl, cl
0040904A |. 75 30 jnz short 0040907C
0040904C |. B9 0A000000 mov ecx, 0A
00409051 |. F740 04 00000>test dword ptr [eax+4], 80000000
00409058 |. 74 22 je short 0040907C
0040905A |. FF70 04 push dword ptr [eax+4]
0040905D |. FF30 push dword ptr [eax]
0040905F |. 89E0 mov eax, esp
00409061 |. F71C24 neg dword ptr [esp]
00409064 |. 835424 04 00 adc dword ptr [esp+4], 0
00409069 |. F75C24 04 neg dword ptr [esp+4]
0040906D |. E8 0A000000 call 0040907C ; 这里
00409072 |. C646 FF 2D mov byte ptr [esi-1], 2D
00409076 |. 4E dec esi
00409077 |. 41 inc ecx
00409078 |. 83C4 08 add esp, 8
0040907B |. C3 retn
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面是不是最关键的算法呢?
0040907C |$ 56 push esi
0040907D |. 83EC 04 sub esp, 4
00409080 |. D97C24 02 fstcw word ptr [esp+2]
00409084 |. D93C24 fstcw word ptr [esp]
00409087 |. 66:810C24 000>or word ptr [esp], 0F00
0040908D |. D92C24 fldcw word ptr [esp]
00409090 |. 66:890C24 mov word ptr [esp], cx
00409094 |. D9E8 fld1
00409096 |. F740 04 00000>test dword ptr [eax+4], 80000000
0040909D |. 74 27 je short 004090C6
0040909F |. FF70 04 push dword ptr [eax+4]
004090A2 |. FF30 push dword ptr [eax]
004090A4 |. 816424 04 FFF>and dword ptr [esp+4], 7FFFFFFF
004090AC |. 68 FFFFFF7F push 7FFFFFFF
004090B1 |. 68 FFFFFFFF push -1
004090B6 |. DF6C24 08 fild qword ptr [esp+8]
004090BA |. DF2C24 fild qword ptr [esp]
004090BD |. D8C2 fadd st, st(2)
004090BF |. DEC1 faddp st(1), st
004090C1 |. 83C4 10 add esp, 10
004090C4 |. EB 02 jmp short 004090C8
004090C6 |> DF28 fild qword ptr [eax]
004090C8 |> DF0424 fild word ptr [esp]
004090CB |. D9C1 fld st(1)
004090CD |> 4E /dec esi
004090CE |. D9F8 |fprem
004090D0 |. DF1C24 |fistp word ptr [esp]
004090D3 |. DCF9 |fdiv st(1), st
004090D5 |. 8A0424 |mov al, byte ptr [esp]
004090D8 |. 04 30 |add al, 30
004090DA |. 3C 3A |cmp al, 3A
004090DC |. 72 02 |jb short 004090E0
004090DE |. 04 07 |add al, 7
004090E0 |> 8806 |mov byte ptr [esi], al
004090E2 |. D9C1 |fld st(1)
004090E4 |. D8D3 |fcom st(3)
004090E6 |. 9B |wait
004090E7 |. DFE0 |fstsw ax
004090E9 |. 9E |sahf
004090EA |.^ 73 E1 \jnb short 004090CD
004090EC |. D96C24 02 fldcw word ptr [esp+2]
004090F0 |. 83C4 04 add esp, 4
004090F3 |. DDC3 ffree st(3)
004090F5 |. DDC2 ffree st(2)
004090F7 |. DDC1 ffree st(1)
004090F9 |. DDC0 ffree st
004090FB |. 59 pop ecx
004090FC |. 29F1 sub ecx, esi
004090FE |. 29CA sub edx, ecx
00409100 |. 76 10 jbe short 00409112
00409102 |. 29D6 sub esi, edx
00409104 |. B0 30 mov al, 30
00409106 |. 01D1 add ecx, edx
00409108 |. EB 03 jmp short 0040910D
0040910A |> 880432 /mov byte ptr [edx+esi], al
0040910D |> 4A dec edx
0040910E |.^ 75 FA \jnz short 0040910A
00409110 |. 8806 mov byte ptr [esi], al
00409112 \> C3 retn
~~~~~~~~~~~~~~~~~~
呵呵 本人水平也只有这点了。坛里有哪位高人有闲帮忙指点一下给我一点信心吧 谢谢了!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课