- UID
- 32678
注册时间2007-8-2
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
半仙算命V2007 build 11.01 算法简单分析(高手飞过)
【文章标题】: 半仙算命V2007 build 11.01 算法简单分析(高手飞过)
【文章作者】: 网络断魂
【软件名称】: 半仙算命V2007 build 11.01
【下载地址】: http://www.newhua.com/soft/45454.htm
【加壳方式】: ASPACK
【保护方式】: 用户名+注册码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD
【操作平台】: winxp2
【作者声明】: 菜鸟学习算法,失误之处请多指教!
发完破文后发现网络上好像有人分析过早期版本!不过学习嘛,并无影响
1、查壳:ASPack 2.12 -> Alexey Solodovnikov
2、用脱壳机或ESP定律脱壳修复后:Borland Delphi 6.0 - 7.0
3、进入软件后点“软件注册”,输入假码后无提示,(注册成功才有提示)
4、根据字符串,找到注册算法函数,
0055BCB0 /. 55 push ebp
0055BCB1 |. 8BEC mov ebp, esp
0055BCB3 |. B9 18000000 mov ecx, 18
0055BCB8 |> 6A 00 /push 0
0055BCBA |. 6A 00 |push 0
0055BCBC |. 49 |dec ecx
0055BCBD |.^ 75 F9 \jnz short 0055BCB8
0055BCBF |. 53 push ebx
0055BCC0 |. 56 push esi
0055BCC1 |. 57 push edi
0055BCC2 |. 8BD8 mov ebx, eax
0055BCC4 |. 33C0 xor eax, eax
0055BCC6 |. 55 push ebp
0055BCC7 |. 68 A9BF5500 push 0055BFA9
0055BCCC |. 64:FF30 push dword ptr fs:[eax]
0055BCCF |. 64:8920 mov dword ptr fs:[eax], esp
0055BCD2 |. B2 01 mov dl, 1
0055BCD4 |. A1 00324700 mov eax, dword ptr [473200]
0055BCD9 |. E8 2276F1FF call 00473300
0055BCDE |. 8BF0 mov esi, eax
0055BCE0 |. BA 02000080 mov edx, 80000002
0055BCE5 |. 8BC6 mov eax, esi
0055BCE7 |. E8 B476F1FF call 004733A0
0055BCEC |. B1 01 mov cl, 1
0055BCEE |. BA C4BF5500 mov edx, 0055BFC4 ; software\microsoft\yhds
0055BCF3 |. 8BC6 mov eax, esi
0055BCF5 |. E8 0A77F1FF call 00473404
0055BCFA |. 68 80000000 push 80 ; /BufSize = 80 (128.)
0055BCFF |. 8D85 7BFFFFFF lea eax, dword ptr [ebp-85] ; |
0055BD05 |. 50 push eax ; |Buffer
0055BD06 |. E8 E1B5EAFF call <jmp.&kernel32.GetSystemDirector>; \GetSystemDirectoryA
0055BD0B |. 8D45 FC lea eax, dword ptr [ebp-4]
0055BD0E |. 8D95 7BFFFFFF lea edx, dword ptr [ebp-85]
0055BD14 |. B9 81000000 mov ecx, 81
0055BD19 |. E8 CE8EEAFF call 00404BEC
0055BD1E |. 8D95 70FFFFFF lea edx, dword ptr [ebp-90]
0055BD24 |. 8BBB FC020000 mov edi, dword ptr [ebx+2FC]
0055BD2A |. 8BC7 mov eax, edi
0055BD2C |. E8 AFC1EEFF call 00447EE0 ; //取用户名及长度
0055BD31 |. 8B85 70FFFFFF mov eax, dword ptr [ebp-90] ; //送用户名
0055BD37 |. 8D95 74FFFFFF lea edx, dword ptr [ebp-8C]
0055BD3D |. E8 8AD5EAFF call 004092CC
0055BD42 |. 8B95 74FFFFFF mov edx, dword ptr [ebp-8C] ; //送用户名
0055BD48 |. 8BC7 mov eax, edi
0055BD4A |. E8 C1C1EEFF call 00447F10
0055BD4F |. 8D95 68FFFFFF lea edx, dword ptr [ebp-98]
0055BD55 |. 8BBB 04030000 mov edi, dword ptr [ebx+304]
0055BD5B |. 8BC7 mov eax, edi
0055BD5D |. E8 7EC1EEFF call 00447EE0 ; //取假码及长度
0055BD62 |. 8B85 68FFFFFF mov eax, dword ptr [ebp-98] ; //送假码
0055BD68 |. 8D95 6CFFFFFF lea edx, dword ptr [ebp-94]
0055BD6E |. E8 59D5EAFF call 004092CC
0055BD73 |. 8B95 6CFFFFFF mov edx, dword ptr [ebp-94] ; //送假码
0055BD79 |. 8BC7 mov eax, edi
0055BD7B |. E8 90C1EEFF call 00447F10
0055BD80 |. 8D95 64FFFFFF lea edx, dword ptr [ebp-9C]
0055BD86 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0055BD8C |. E8 4FC1EEFF call 00447EE0
0055BD91 |. 83BD 64FFFFFF>cmp dword ptr [ebp-9C], 0 ; //较验注册码是否为空
0055BD98 |. 74 1A je short 0055BDB4 ; //跳往注册信息未写全,
0055BD9A |. 8D95 60FFFFFF lea edx, dword ptr [ebp-A0]
0055BDA0 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0055BDA6 |. E8 35C1EEFF call 00447EE0 ; //取用户名及长度
0055BDAB |. 83BD 60FFFFFF>cmp dword ptr [ebp-A0], 0 ; //较验用户名是否为空
0055BDB2 |. 75 0F jnz short 0055BDC3
0055BDB4 |> B8 E4BF5500 mov eax, 0055BFE4 ; 注册信息没有填写齐全
0055BDB9 |. E8 AE4EEEFF call 00440C6C
0055BDBE |. E9 5E010000 jmp 0055BF21
0055BDC3 |> 8D95 5CFFFFFF lea edx, dword ptr [ebp-A4]
0055BDC9 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0055BDCF |. E8 0CC1EEFF call 00447EE0 ; //取假码及长度
0055BDD4 |. 8B85 5CFFFFFF mov eax, dword ptr [ebp-A4] ; //送假码
0055BDDA |. 50 push eax ; //入栈
0055BDDB |. 8D95 54FFFFFF lea edx, dword ptr [ebp-AC]
0055BDE1 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0055BDE7 |. E8 F4C0EEFF call 00447EE0 ; //取用户名及长度
0055BDEC |. 8B85 54FFFFFF mov eax, dword ptr [ebp-AC] ; //送用户名
0055BDF2 |. E8 89D8EAFF call 00409680 ; //用户名转换为16进制
0055BDF7 |. B9 4C030000 mov ecx, 34C ; //34C==》844(除数)
0055BDFC |. 99 cdq ; //双字节扩展,把EAX中的字的符号扩展到EDX中去
0055BDFD |. F7F9 idiv ecx ; //有符号除法,EAX/ECX,商回送AX,余数回送DX
0055BDFF |. 8BC2 mov eax, edx ; //余数送给EAX
0055BE01 |. 8D95 58FFFFFF lea edx, dword ptr [ebp-A8]
0055BE07 |. E8 B0FDFFFF call 0055BBBC ; //关键,得出真码
0055BE0C |. 8B95 58FFFFFF mov edx, dword ptr [ebp-A8] ; //作内存注册机的位置,软件好像会反内存注册机
0055BE12 |. 58 pop eax
0055BE13 |. E8 688FEAFF call 00404D80 ; //是否注册的较验
0055BE18 |. 0F85 E9000000 jnz 0055BF07 ; //跳过本软件已注册
0055BE1E |. A1 807D5700 mov eax, dword ptr [577D80]
0055BE23 |. 8B00 mov eax, dword ptr [eax]
0055BE25 |. 8B80 2C040000 mov eax, dword ptr [eax+42C]
0055BE2B |. BA 04C05500 mov edx, 0055C004 ; 本软件已注册
0055BE30 |. E8 DBC0EEFF call 00447F10
0055BE35 |. 8D95 50FFFFFF lea edx, dword ptr [ebp-B0]
0055BE3B |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0055BE41 |. E8 9AC0EEFF call 00447EE0
0055BE46 |. 8B8D 50FFFFFF mov ecx, dword ptr [ebp-B0]
0055BE4C |. BA 1CC05500 mov edx, 0055C01C ; ssbxr
0055BE51 |. 8BC6 mov eax, esi
0055BE53 |. E8 4877F1FF call 004735A0
0055BE58 |. 8D85 4CFFFFFF lea eax, dword ptr [ebp-B4]
0055BE5E |. B9 2CC05500 mov ecx, 0055C02C ; \c31l.dll
0055BE63 |. 8B55 FC mov edx, dword ptr [ebp-4]
0055BE66 |. E8 1D8EEAFF call 00404C88
0055BE6B |. 8B8D 4CFFFFFF mov ecx, dword ptr [ebp-B4]
0055BE71 |. B2 01 mov dl, 1
0055BE73 |. A1 B0224700 mov eax, dword ptr [4722B0]
0055BE78 |. E8 E364F1FF call 00472360
0055BE7D |. 8BF0 mov esi, eax
0055BE7F |. 8D95 48FFFFFF lea edx, dword ptr [ebp-B8]
0055BE85 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0055BE8B |. E8 50C0EEFF call 00447EE0
0055BE90 |. 8B85 48FFFFFF mov eax, dword ptr [ebp-B8]
0055BE96 |. 50 push eax
0055BE97 |. B9 40C05500 mov ecx, 0055C040 ; dd
0055BE9C |. BA 4CC05500 mov edx, 0055C04C ; sysetup
0055BEA1 |. 8BC6 mov eax, esi
0055BEA3 |. 8B38 mov edi, dword ptr [eax]
0055BEA5 |. FF57 04 call dword ptr [edi+4]
0055BEA8 |. 8D95 44FFFFFF lea edx, dword ptr [ebp-BC]
0055BEAE |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0055BEB4 |. E8 27C0EEFF call 00447EE0
0055BEB9 |. 8B85 44FFFFFF mov eax, dword ptr [ebp-BC]
0055BEBF |. 50 push eax
0055BEC0 |. B9 5CC05500 mov ecx, 0055C05C ; zc
0055BEC5 |. BA 4CC05500 mov edx, 0055C04C ; sysetup
0055BECA |. 8BC6 mov eax, esi
0055BECC |. 8B30 mov esi, dword ptr [eax]
0055BECE |. FF56 04 call dword ptr [esi+4]
0055BED1 |. 8D85 40FFFFFF lea eax, dword ptr [ebp-C0]
0055BED7 |. B9 2CC05500 mov ecx, 0055C02C ; \c31l.dll
0055BEDC |. 8B55 FC mov edx, dword ptr [ebp-4]
0055BEDF |. E8 A48DEAFF call 00404C88
0055BEE4 |. 8B85 40FFFFFF mov eax, dword ptr [ebp-C0]
0055BEEA |. BA 02000000 mov edx, 2
0055BEEF |. E8 B8DAEAFF call 004099AC
0055BEF4 |. B8 68C05500 mov eax, 0055C068 ; 注册成功!
0055BEF9 |. E8 6E4DEEFF call 00440C6C
0055BEFE |. 8BC3 mov eax, ebx
0055BF00 |. E8 439AF0FF call 00465948
0055BF05 |. EB 1A jmp short 0055BF21
0055BF07 |> 33D2 xor edx, edx
0055BF09 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0055BF0F |. E8 FCBFEEFF call 00447F10
0055BF14 |. 33D2 xor edx, edx
0055BF16 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0055BF1C |. E8 EFBFEEFF call 00447F10
0055BF21 |> 33C0 xor eax, eax
0055BF23 |. 5A pop edx
0055BF24 |. 59 pop ecx
0055BF25 |. 59 pop ecx
0055BF26 |. 64:8910 mov dword ptr fs:[eax], edx
0055BF29 |. 68 B3BF5500 push 0055BFB3
0055BF2E |> 8D85 40FFFFFF lea eax, dword ptr [ebp-C0]
0055BF34 |. E8 4B8AEAFF call 00404984
0055BF39 |. 8D85 44FFFFFF lea eax, dword ptr [ebp-BC]
0055BF3F |. BA 02000000 mov edx, 2
0055BF44 |. E8 5F8AEAFF call 004049A8
0055BF49 |. 8D85 4CFFFFFF lea eax, dword ptr [ebp-B4]
0055BF4F |. E8 308AEAFF call 00404984
0055BF54 |. 8D85 50FFFFFF lea eax, dword ptr [ebp-B0]
0055BF5A |. BA 02000000 mov edx, 2
0055BF5F |. E8 448AEAFF call 004049A8
0055BF64 |. 8D85 58FFFFFF lea eax, dword ptr [ebp-A8]
0055BF6A |. E8 158AEAFF call 00404984
0055BF6F |. 8D85 5CFFFFFF lea eax, dword ptr [ebp-A4]
0055BF75 |. BA 04000000 mov edx, 4
0055BF7A |. E8 298AEAFF call 004049A8
0055BF7F |. 8D85 6CFFFFFF lea eax, dword ptr [ebp-94]
0055BF85 |. E8 FA89EAFF call 00404984
0055BF8A |. 8D85 70FFFFFF lea eax, dword ptr [ebp-90]
0055BF90 |. E8 EF89EAFF call 00404984
0055BF95 |. 8D85 74FFFFFF lea eax, dword ptr [ebp-8C]
0055BF9B |. E8 E489EAFF call 00404984
0055BFA0 |. 8D45 FC lea eax, dword ptr [ebp-4]
0055BFA3 |. E8 DC89EAFF call 00404984
0055BFA8 \. C3 retn
0055BFA9 .^ E9 7A82EAFF jmp 00404228
0055BFAE .^ E9 7BFFFFFF jmp 0055BF2E
0055BFB3 . 5F pop edi
0055BFB4 . 5E pop esi
0055BFB5 . 5B pop ebx
0055BFB6 . 8BE5 mov esp, ebp
0055BFB8 . 5D pop ebp
0055BFB9 . C3 retn
跟进算法CALL:0055BE07 |. E8 B0FDFFFF call 0055BBBC
0055BBBC /$ 55 push ebp
0055BBBD |. 8BEC mov ebp, esp
0055BBBF |. 33C9 xor ecx, ecx
0055BBC1 |. 51 push ecx
0055BBC2 |. 51 push ecx
0055BBC3 |. 51 push ecx
0055BBC4 |. 51 push ecx
0055BBC5 |. 53 push ebx
0055BBC6 |. 56 push esi
0055BBC7 |. 8BF2 mov esi, edx
0055BBC9 |. 8BD8 mov ebx, eax ; //余数送给EBX
0055BBCB |. 33C0 xor eax, eax
0055BBCD |. 55 push ebp
0055BBCE |. 68 8CBC5500 push 0055BC8C
0055BBD3 |. 64:FF30 push dword ptr fs:[eax]
0055BBD6 |. 64:8920 mov dword ptr fs:[eax], esp
0055BBD9 |. 81F3 F1250B00 xor ebx, 0B25F1 ; //余数异或OB25F1(730609)
0055BBDF |. 8BC3 mov eax, ebx ; //结果送给EAX
0055BBE1 |. 33D2 xor edx, edx
0055BBE3 |. 52 push edx ; /Arg2 => 00000000
0055BBE4 |. 50 push eax ; |Arg1
0055BBE5 |. 8D45 FC lea eax, dword ptr [ebp-4] ; |
0055BBE8 |. E8 5FDAEAFF call 0040964C ; \//结果转换为十进制,作为注册码前面N位
0055BBED |. 8B45 FC mov eax, dword ptr [ebp-4]
0055BBF0 |. 0FB600 movzx eax, byte ptr [eax] ; //取第一位
0055BBF3 |. 8B55 FC mov edx, dword ptr [ebp-4]
0055BBF6 |. 0FB652 01 movzx edx, byte ptr [edx+1] ; //取第二位
0055BBFA |. 03C2 add eax, edx ; //第一位+第二位
0055BBFC |. B9 05000000 mov ecx, 5 ; //送5
0055BC01 |. 99 cdq
0055BC02 |. F7F9 idiv ecx ; //结果除以5
0055BC04 |. 80C2 34 add dl, 34 ; //余数+34
0055BC07 |. 8855 F8 mov byte ptr [ebp-8], dl ; //存结果(作为注册码第N+1位)
0055BC0A |. 8B45 FC mov eax, dword ptr [ebp-4]
0055BC0D |. 0FB640 02 movzx eax, byte ptr [eax+2] ; //取第三位
0055BC11 |. 8B55 FC mov edx, dword ptr [ebp-4]
0055BC14 |. 0FB652 03 movzx edx, byte ptr [edx+3] ; //取第四位
0055BC18 |. 03C2 add eax, edx ; //第三位+第四位
0055BC1A |. B9 05000000 mov ecx, 5 ; //送5
0055BC1F |. 99 cdq
0055BC20 |. F7F9 idiv ecx ; //结果除以5
0055BC22 |. 8BDA mov ebx, edx
0055BC24 |. 80C3 33 add bl, 33 ; //余数+33
0055BC27 |. 885D F9 mov byte ptr [ebp-7], bl ; //存结果(作为注册码第N+2位)
0055BC2A |. 8D45 F4 lea eax, dword ptr [ebp-C]
0055BC2D |. 8A55 F8 mov dl, byte ptr [ebp-8]
0055BC30 |. E8 2F8FEAFF call 00404B64
0055BC35 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0055BC38 |. 8D55 FC lea edx, dword ptr [ebp-4]
0055BC3B |. B9 1B000000 mov ecx, 1B
0055BC40 |. E8 D792EAFF call 00404F1C
0055BC45 |. 8D45 F0 lea eax, dword ptr [ebp-10]
0055BC48 |. 8BD3 mov edx, ebx
0055BC4A |. E8 158FEAFF call 00404B64
0055BC4F |. 8B45 F0 mov eax, dword ptr [ebp-10]
0055BC52 |. 8D55 FC lea edx, dword ptr [ebp-4]
0055BC55 |. B9 19000000 mov ecx, 19
0055BC5A |. E8 BD92EAFF call 00404F1C
0055BC5F |. 8BC6 mov eax, esi
0055BC61 |. 8B55 FC mov edx, dword ptr [ebp-4]
0055BC64 |. E8 6F8DEAFF call 004049D8
0055BC69 |. 33C0 xor eax, eax
0055BC6B |. 5A pop edx
0055BC6C |. 59 pop ecx
0055BC6D |. 59 pop ecx
0055BC6E |. 64:8910 mov dword ptr fs:[eax], edx
0055BC71 |. 68 93BC5500 push 0055BC93
0055BC76 |> 8D45 F0 lea eax, dword ptr [ebp-10]
0055BC79 |. BA 02000000 mov edx, 2
0055BC7E |. E8 258DEAFF call 004049A8
0055BC83 |. 8D45 FC lea eax, dword ptr [ebp-4]
0055BC86 |. E8 F98CEAFF call 00404984
0055BC8B \. C3 retn
0055BC8C .^ E9 9785EAFF jmp 00404228
0055BC91 .^ EB E3 jmp short 0055BC76
0055BC93 . 5E pop esi
0055BC94 . 5B pop ebx
0055BC95 . 8BE5 mov esp, ebp
0055BC97 . 5D pop ebp
0055BC98 . C3 retn
算法总结:
1、用户名(纯数字)转换为十六进制除以34C(844),取余数,
2、余数与OB25F1(730609)进行异或运算,结果转换为十进制作为注册码前N位,
3、(第一位ASCII值+第二位ASCII值)除以5,余数+34 转换为数字作为第N+1位注册码,
4、(第三位ASCII值+第四位ASCII值)除以5,余数+33 转换为数字作为第N+2位注册码。
[ 本帖最后由 网络断魂 于 2007-11-10 13:46 编辑 ] |
|