【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【保护方式】: name,serial
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: peid,od,计算器
【操作平台】: winxp
【作者声明】: 只是感兴趣,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先用peid查壳,无壳。运行,收集足够的信息,用OD载入,运行,下断点getdlgitemtexta,输入name:bxm78,serial:780328051,成功断下,单步跟跟踪发现,serial要18位,重新运行,输入18位的serial:780328051780328051,断在下面:
004011CF |. FFD7 call edi ; \GetDlgItemTextA
004011D1 |. 8BF0 mov esi, eax
004011D3 |. 85F6 test esi, esi ; name长度<1 ?
004011D5 |. 0F84 4B010000 je 00401326 ; 是,出错提示
004011DB |. 83FE 40 cmp esi, 40 ; name长度>64 ?
004011DE |. 0F87 42010000 ja 00401326 ; 是,出错提示
004011E4 |. 8B45 08 mov eax, [ebp+8]
004011E7 |. 8D55 94 lea edx, [ebp-6C]
004011EA |. 6A 13 push 13 ; /Count = 13 (19.)
004011EC |. 52 push edx ; |Buffer
004011ED |. 68 E9030000 push 3E9 ; |ControlID = 3E9 (1001.)
004011F2 |. 50 push eax ; |hWnd
004011F3 |. FFD7 call edi ; \GetDlgItemTextA
004011F5 |. 6BC0 03 imul eax, eax, 3 ; serial长度*3
004011F8 |. C1E0 02 shl eax, 2 ; 左移2位
004011FB |. 05 CD000000 add eax, 0CD ; 加上0CD
00401200 |. 8945 FC mov [ebp-4], eax
00401203 |. 817D FC A5010>cmp dword ptr [ebp-4], 1A5 ; 运算结果是否等于1A5,反推后得出serial要18位
0040120A |. 0F85 BC000000 jnz 004012CC ; 不是,出错提示
00401210 |. 33C0 xor eax, eax
00401212 |. 8A45 94 mov al, [ebp-6C]
00401215 |. 84C0 test al, al
00401217 |. 74 13 je short 0040122C
00401219 |. 8D4D 94 lea ecx, [ebp-6C]
0040121C |> 3C 30 /cmp al, 30 ; serial的每一位是否小于30H
0040121E |. 0F82 C6000000 |jb 004012EA ; 是,出错提示
00401224 |. 8A41 01 |mov al, [ecx+1]
00401227 |. 41 |inc ecx
00401228 |. 84C0 |test al, al
0040122A |.^ 75 F0 \jnz short 0040121C
0040122C |> E8 CFFDFFFF call 00401000 ; 寄存器清0
00401231 |. 8D85 2CFFFFFF lea eax, [ebp-D4]
00401237 |. 50 push eax
00401238 |. E8 43FEFFFF call 00401080 ; 关键call 1:和name有关,跟进,我的得到434E4D4E
0040123D |. 8945 FC mov [ebp-4], eax
00401240 |. E8 BBFDFFFF call 00401000
00401245 |. 8D8D 2CFFFFFF lea ecx, [ebp-D4]
0040124B |. 56 push esi
0040124C |. 51 push ecx
0040124D |. E8 BEFDFFFF call 00401010 ; 没看出来有什么用
00401252 |. 83C4 0C add esp, 0C
00401255 |. 33C9 xor ecx, ecx
00401257 |> 8B45 FC /mov eax, [ebp-4] ; 根据434E4D4E再次运算,把中间结果存入[0012FA20]
0040125A |. 33D2 |xor edx, edx
0040125C |. BE 1A000000 |mov esi, 1A ; eax div 1A
00401261 |. F7F6 |div esi
00401263 |. 8A9415 10FFFF>|mov dl, [ebp+edx-F0] ; 根据余数从字符串A到Z中选出相应的字符
0040126A |. 88540D C8 |mov [ebp+ecx-38], dl ; 存入指定地址
0040126E |. 8B45 FC |mov eax, [ebp-4]
00401271 |. C1E0 03 |shl eax, 3
00401274 |. BA 45230100 |mov edx, 12345
00401279 |. F7E8 |imul eax ; eax*eax
0040127B |. 03C2 |add eax, edx ; eax+edx
0040127D |. 8945 FC |mov [ebp-4], eax ; 存入[ebp-4]作为下一次循环用
00401280 |. 41 |inc ecx
00401281 |. 83F9 12 |cmp ecx, 12
00401284 |.^ 72 D1 \jb short 00401257 ; 循环18次
00401286 |. E8 75FDFFFF call 00401000
0040128B |. 33C0 xor eax, eax
0040128D |> 8A4C05 94 /mov cl, [ebp+eax-6C] ; 逐个读取假serial
00401291 |. 8A5405 C8 |mov dl, [ebp+eax-38] ; 逐个读取上面算得的字符串
00401295 |. 80E9 30 |sub cl, 30
00401298 |. 32D1 |xor dl, cl
0040129A |. 885405 C8 |mov [ebp+eax-38], dl
0040129E |. 40 |inc eax
0040129F |. 83F8 12 |cmp eax, 12
004012A2 |.^ 72 E9 \jb short 0040128D
004012A4 |. E8 57FDFFFF call 00401000
004012A9 |. 8D55 C8 lea edx, [ebp-38] ; 根据call 2逆推出[ebp-38]应为ASCII“KD[DAKHNFN>EIZLFUB”
004012AC |. 52 push edx
004012AD |. E8 5EFEFFFF call 00401110 ; 关键call 2:对得到的结果再次运算,存入[12FA20],需跟进
004012B2 |. E8 49FDFFFF call 00401000
004012B7 |. 8D45 C8 lea eax, [ebp-38]
004012BA |. 68 14514000 push 00405114 ; ASCII "KEYGENNING4NEWBIES"
004012BF |. 50 push eax
004012C0 |. E8 6BFEFFFF call 00401130 ; 两串字符比较,相同,返回1,否则返回0
004012C5 |. 83C4 0C add esp, 0C
004012C8 |. 85C0 test eax, eax
004012CA |. 75 3C jnz short 00401308 ; 爆破点
004012CC |> 8B4D 08 mov ecx, [ebp+8]
004012CF |. 6A 10 push 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004012D1 |. 68 0C514000 push 0040510C ; |Title = "Error"
004012D6 |. 68 FC504000 push 004050FC ; |Text = "Bad Serial :o("
004012DB |. 51 push ecx ; |hOwner
004012DC |. FF15 AC404000 call [<&USER32.MessageBoxA>] ; \MessageBoxA
004012E2 |. 5F pop edi
004012E3 |. 33C0 xor eax, eax
004012E5 |. 5E pop esi
004012E6 |. 8BE5 mov esp, ebp
004012E8 |. 5D pop ebp
004012E9 |. C3 retn
004012EA |> 8B55 08 mov edx, [ebp+8]
004012ED |. 6A 10 push 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004012EF |. 68 0C514000 push 0040510C ; |Title = "Error"
004012F4 |. 68 FC504000 push 004050FC ; |Text = "Bad Serial :o("
004012F9 |. 52 push edx ; |hOwner
004012FA |. FF15 AC404000 call [<&USER32.MessageBoxA>] ; \MessageBoxA
00401300 |. 5F pop edi
00401301 |. 33C0 xor eax, eax
00401303 |. 5E pop esi
00401304 |. 8BE5 mov esp, ebp
00401306 |. 5D pop ebp
00401307 |. C3 retn
00401308 |> 8B55 08 mov edx, [ebp+8]
0040130B |. 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040130D |. 68 F4504000 push 004050F4 ; |Title = "Great !"
00401312 |. 68 B0504000 push 004050B0 ; |Text = "Wow you did it... Now write a valid keygen with NO ASM RIPPING :X"
00401317 |. 52 push edx ; |hOwner
00401318 |. FF15 AC404000 call [<&USER32.MessageBoxA>] ; \MessageBoxA
=====================================================================================
关键call 1:
00401080 /$ 55 push ebp
00401081 |. 8BEC mov ebp, esp
00401083 |. 51 push ecx
00401084 |. 53 push ebx
00401085 |. 56 push esi
00401086 |. 57 push edi
00401087 |. 68 80504000 push 00405080 ; ASCII "eheh"
0040108C |. 6A 00 push 0
0040108E |. E8 ADFFFFFF call 00401040 ; 得到68656865
00401093 |. 83C4 08 add esp, 8
00401096 |. 8BD8 mov ebx, eax
00401098 |. E8 63FFFFFF call 00401000 ; 寄存器清0
0040109D |. BF 70504000 mov edi, 00405070 ; ASCII " is a whore."
004010A2 |. 83C9 FF or ecx, FFFFFFFF
004010A5 |. 33C0 xor eax, eax
004010A7 |. F2:AE repne scas byte ptr es:[edi]
004010A9 |. F7D1 not ecx
004010AB |. 2BF9 sub edi, ecx
004010AD |. 8BF7 mov esi, edi
004010AF |. 8B7D 08 mov edi, [ebp+8]
004010B2 |. 8BD1 mov edx, ecx
004010B4 |. 83C9 FF or ecx, FFFFFFFF
004010B7 |. F2:AE repne scas byte ptr es:[edi]
004010B9 |. 8BCA mov ecx, edx
004010BB |. 4F dec edi
004010BC |. C1E9 02 shr ecx, 2
004010BF |. F3:A5 rep movs dword ptr es:[edi]>; 把字符串“ is a whore.”接在name的后面
004010C1 |. 8BCA mov ecx, edx
004010C3 |. 83E1 03 and ecx, 3
004010C6 |. F3:A4 rep movs byte ptr es:[edi],>
004010C8 |. 33FF xor edi, edi
004010CA |. 33F6 xor esi, esi
004010CC |> 8B45 08 /mov eax, [ebp+8]
004010CF |. 50 |push eax ; 把连接后的字符串进栈
004010D0 |. 56 |push esi
004010D1 |. E8 6AFFFFFF |call 00401040 ; 此call功能,把字符串中第ESI个连续四个倒序排列,结果放入EAX返回
004010D6 |. 8B8E 30504000 |mov ecx, [esi+405030] ; 16次循环依次读取12、5C、34、22、AB、9D、54、00、DD、84、AE、66、31、78、73、CF
004010DC |. 83C4 08 |add esp, 8
004010DF |. 33CF |xor ecx, edi ; ecx与循环次数异或
004010E1 |. 03C1 |add eax, ecx
004010E3 |. 8945 FC |mov [ebp-4], eax
004010E6 |. C145 FC 07 |rol dword ptr [ebp-4], 7 ; 循环左移7位
004010EA |. 8B45 FC |mov eax, [ebp-4] ; 结果放入eax
004010ED |. 83C6 04 |add esi, 4
004010F0 |. 33D8 |xor ebx, eax ; ebx与eax异或
004010F2 |. 47 |inc edi
004010F3 |. 83FE 40 |cmp esi, 40
004010F6 |.^ 7C D4 \jl short 004010CC ; 16次循环
004010F8 |. 5F pop edi
004010F9 |. 8BC3 mov eax, ebx
004010FB |. 5E pop esi
004010FC |. 5B pop ebx
004010FD |. 8BE5 mov esp, ebp
004010FF |. 5D pop ebp
00401100 \. C3 retn
=============================================================================================
关键call 2:
00401110 /$ 8B4C24 04 mov ecx, [esp+4] ; 读取上面运算得到的字符串
00401114 |. 33C0 xor eax, eax
00401116 |> 8A1408 /mov dl, [eax+ecx] ; 循环读取每一位字符入dl
00401119 |. 32D0 |xor dl, al ; 与循环次数异或
0040111B |. 881408 |mov [eax+ecx], dl ; 保存在原来的地址
0040111E |. 40 |inc eax
0040111F |. 83F8 12 |cmp eax, 12
00401122 |.^ 72 F2 \jb short 00401116 ; 循环18次
00401124 \. C3 retn
算法小结:
1、name为1到64位。
2、serial为18位。
3、name与字符串“ is a whore.”连接,记为A。
4、ebx=68656865
for(i=0;i<16;i++)
{ 把A中的字符第i个后面的连续四个倒序后连接到EAX
16次循环依次读取12、5C、34、22、AB、9D、54、00、DD、84、AE、66、31、78、73、CF放入ECX
ECX=ECX+i
EAX=EAX+ECX
EAX循环左移7位
ebx=ebx^EAX
}
最终ebx记为B。
5、for(i=0;i<18;i++)
{
根据B除以1A的余数决定存入字符,从字符A到Z中选择相应的字符,即第余数个。
B左移3位
B*B变为64位,低32位+高32位,重新存入B
}
6、字符串“KEYGENNING4NEWBIES”每个字符依次与1、2、……15异或,得字符串“KD[DAKHNFN>EIZLFUB”,记为C。
7、把C与第5步算得的字符串异或,再加上30H即为正确的serial。
本想用TC写个注册机出来,无奈水平有限,搞了一整天,也没写出来,真的很无奈。
可用的一组注册码:
naem:bxm78
serial:<>?E=?21>H?OBHNNJ
注意:后面的一个问号为编码为“A0”的ASCII码,不知道怎样用键盘输入。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年07月08日 下午 04:24:55
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课