网络断魂 发表于 2007-11-10 12:05:52

半仙算命V2007 build 11.01 算法简单分析(高手飞过)

半仙算命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:
0055BCCF|.64:8920       mov   dword ptr fs:, esp
0055BCD2|.B2 01         mov   dl, 1
0055BCD4|.A1 00324700   mov   eax, dword ptr
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           ; |
0055BD05|.50            push    eax                              ; |Buffer
0055BD06|.E8 E1B5EAFF   call    <jmp.&kernel32.GetSystemDirector>; \GetSystemDirectoryA
0055BD0B|.8D45 FC       lea   eax, dword ptr
0055BD0E|.8D95 7BFFFFFF lea   edx, dword ptr
0055BD14|.B9 81000000   mov   ecx, 81
0055BD19|.E8 CE8EEAFF   call    00404BEC
0055BD1E|.8D95 70FFFFFF lea   edx, dword ptr
0055BD24|.8BBB FC020000 mov   edi, dword ptr
0055BD2A|.8BC7          mov   eax, edi
0055BD2C|.E8 AFC1EEFF   call    00447EE0                         ;//取用户名及长度
0055BD31|.8B85 70FFFFFF mov   eax, dword ptr           ;//送用户名
0055BD37|.8D95 74FFFFFF lea   edx, dword ptr
0055BD3D|.E8 8AD5EAFF   call    004092CC
0055BD42|.8B95 74FFFFFF mov   edx, dword ptr           ;//送用户名
0055BD48|.8BC7          mov   eax, edi
0055BD4A|.E8 C1C1EEFF   call    00447F10
0055BD4F|.8D95 68FFFFFF lea   edx, dword ptr
0055BD55|.8BBB 04030000 mov   edi, dword ptr
0055BD5B|.8BC7          mov   eax, edi
0055BD5D|.E8 7EC1EEFF   call    00447EE0                         ;//取假码及长度
0055BD62|.8B85 68FFFFFF mov   eax, dword ptr           ;//送假码
0055BD68|.8D95 6CFFFFFF lea   edx, dword ptr
0055BD6E|.E8 59D5EAFF   call    004092CC
0055BD73|.8B95 6CFFFFFF mov   edx, dword ptr           ;//送假码
0055BD79|.8BC7          mov   eax, edi
0055BD7B|.E8 90C1EEFF   call    00447F10
0055BD80|.8D95 64FFFFFF lea   edx, dword ptr
0055BD86|.8B83 04030000 mov   eax, dword ptr
0055BD8C|.E8 4FC1EEFF   call    00447EE0
0055BD91|.83BD 64FFFFFF>cmp   dword ptr , 0            ;//较验注册码是否为空
0055BD98|.74 1A         je      short 0055BDB4                   ;//跳往注册信息未写全,
0055BD9A|.8D95 60FFFFFF lea   edx, dword ptr
0055BDA0|.8B83 FC020000 mov   eax, dword ptr
0055BDA6|.E8 35C1EEFF   call    00447EE0                         ;//取用户名及长度
0055BDAB|.83BD 60FFFFFF>cmp   dword ptr , 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
0055BDC9|.8B83 04030000 mov   eax, dword ptr
0055BDCF|.E8 0CC1EEFF   call    00447EE0                         ;//取假码及长度
0055BDD4|.8B85 5CFFFFFF mov   eax, dword ptr           ;//送假码
0055BDDA|.50            push    eax                              ;//入栈
0055BDDB|.8D95 54FFFFFF lea   edx, dword ptr
0055BDE1|.8B83 FC020000 mov   eax, dword ptr
0055BDE7|.E8 F4C0EEFF   call    00447EE0                         ;//取用户名及长度
0055BDEC|.8B85 54FFFFFF mov   eax, dword ptr           ;//送用户名
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
0055BE07|.E8 B0FDFFFF   call    0055BBBC                         ;//关键,得出真码
0055BE0C|.8B95 58FFFFFF mov   edx, dword ptr           ;//作内存注册机的位置,软件好像会反内存注册机
0055BE12|.58            pop   eax
0055BE13|.E8 688FEAFF   call    00404D80                         ;//是否注册的较验
0055BE18|.0F85 E9000000 jnz   0055BF07                         ;//跳过本软件已注册
0055BE1E|.A1 807D5700   mov   eax, dword ptr
0055BE23|.8B00          mov   eax, dword ptr
0055BE25|.8B80 2C040000 mov   eax, dword ptr
0055BE2B|.BA 04C05500   mov   edx, 0055C004                  ;本软件已注册
0055BE30|.E8 DBC0EEFF   call    00447F10
0055BE35|.8D95 50FFFFFF lea   edx, dword ptr
0055BE3B|.8B83 FC020000 mov   eax, dword ptr
0055BE41|.E8 9AC0EEFF   call    00447EE0
0055BE46|.8B8D 50FFFFFF mov   ecx, dword ptr
0055BE4C|.BA 1CC05500   mov   edx, 0055C01C                  ;ssbxr
0055BE51|.8BC6          mov   eax, esi
0055BE53|.E8 4877F1FF   call    004735A0
0055BE58|.8D85 4CFFFFFF lea   eax, dword ptr
0055BE5E|.B9 2CC05500   mov   ecx, 0055C02C                  ;\c31l.dll
0055BE63|.8B55 FC       mov   edx, dword ptr
0055BE66|.E8 1D8EEAFF   call    00404C88
0055BE6B|.8B8D 4CFFFFFF mov   ecx, dword ptr
0055BE71|.B2 01         mov   dl, 1
0055BE73|.A1 B0224700   mov   eax, dword ptr
0055BE78|.E8 E364F1FF   call    00472360
0055BE7D|.8BF0          mov   esi, eax
0055BE7F|.8D95 48FFFFFF lea   edx, dword ptr
0055BE85|.8B83 04030000 mov   eax, dword ptr
0055BE8B|.E8 50C0EEFF   call    00447EE0
0055BE90|.8B85 48FFFFFF mov   eax, dword ptr
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
0055BEA5|.FF57 04       call    dword ptr
0055BEA8|.8D95 44FFFFFF lea   edx, dword ptr
0055BEAE|.8B83 FC020000 mov   eax, dword ptr
0055BEB4|.E8 27C0EEFF   call    00447EE0
0055BEB9|.8B85 44FFFFFF mov   eax, dword ptr
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
0055BECE|.FF56 04       call    dword ptr
0055BED1|.8D85 40FFFFFF lea   eax, dword ptr
0055BED7|.B9 2CC05500   mov   ecx, 0055C02C                  ;\c31l.dll
0055BEDC|.8B55 FC       mov   edx, dword ptr
0055BEDF|.E8 A48DEAFF   call    00404C88
0055BEE4|.8B85 40FFFFFF mov   eax, dword ptr
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
0055BF0F|.E8 FCBFEEFF   call    00447F10
0055BF14|.33D2          xor   edx, edx
0055BF16|.8B83 04030000 mov   eax, dword ptr
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:, edx
0055BF29|.68 B3BF5500   push    0055BFB3
0055BF2E|>8D85 40FFFFFF lea   eax, dword ptr
0055BF34|.E8 4B8AEAFF   call    00404984
0055BF39|.8D85 44FFFFFF lea   eax, dword ptr
0055BF3F|.BA 02000000   mov   edx, 2
0055BF44|.E8 5F8AEAFF   call    004049A8
0055BF49|.8D85 4CFFFFFF lea   eax, dword ptr
0055BF4F|.E8 308AEAFF   call    00404984
0055BF54|.8D85 50FFFFFF lea   eax, dword ptr
0055BF5A|.BA 02000000   mov   edx, 2
0055BF5F|.E8 448AEAFF   call    004049A8
0055BF64|.8D85 58FFFFFF lea   eax, dword ptr
0055BF6A|.E8 158AEAFF   call    00404984
0055BF6F|.8D85 5CFFFFFF lea   eax, dword ptr
0055BF75|.BA 04000000   mov   edx, 4
0055BF7A|.E8 298AEAFF   call    004049A8
0055BF7F|.8D85 6CFFFFFF lea   eax, dword ptr
0055BF85|.E8 FA89EAFF   call    00404984
0055BF8A|.8D85 70FFFFFF lea   eax, dword ptr
0055BF90|.E8 EF89EAFF   call    00404984
0055BF95|.8D85 74FFFFFF lea   eax, dword ptr
0055BF9B|.E8 E489EAFF   call    00404984
0055BFA0|.8D45 FC       lea   eax, dword ptr
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:
0055BBD6|.64:8920       mov   dword ptr fs:, 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          ; |
0055BBE8|.E8 5FDAEAFF   call    0040964C                         ; \//结果转换为十进制,作为注册码前面N位
0055BBED|.8B45 FC       mov   eax, dword ptr
0055BBF0|.0FB600      movzx   eax, byte ptr             ;//取第一位
0055BBF3|.8B55 FC       mov   edx, dword ptr
0055BBF6|.0FB652 01   movzx   edx, byte ptr             ;//取第二位
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 , dl             ;//存结果(作为注册码第N+1位)
0055BC0A|.8B45 FC       mov   eax, dword ptr
0055BC0D|.0FB640 02   movzx   eax, byte ptr             ;//取第三位
0055BC11|.8B55 FC       mov   edx, dword ptr
0055BC14|.0FB652 03   movzx   edx, byte ptr             ;//取第四位
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 , bl             ;//存结果(作为注册码第N+2位)
0055BC2A|.8D45 F4       lea   eax, dword ptr
0055BC2D|.8A55 F8       mov   dl, byte ptr
0055BC30|.E8 2F8FEAFF   call    00404B64
0055BC35|.8B45 F4       mov   eax, dword ptr
0055BC38|.8D55 FC       lea   edx, dword ptr
0055BC3B|.B9 1B000000   mov   ecx, 1B
0055BC40|.E8 D792EAFF   call    00404F1C
0055BC45|.8D45 F0       lea   eax, dword ptr
0055BC48|.8BD3          mov   edx, ebx
0055BC4A|.E8 158FEAFF   call    00404B64
0055BC4F|.8B45 F0       mov   eax, dword ptr
0055BC52|.8D55 FC       lea   edx, dword ptr
0055BC55|.B9 19000000   mov   ecx, 19
0055BC5A|.E8 BD92EAFF   call    00404F1C
0055BC5F|.8BC6          mov   eax, esi
0055BC61|.8B55 FC       mov   edx, dword ptr
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:, edx
0055BC71|.68 93BC5500   push    0055BC93
0055BC76|>8D45 F0       lea   eax, dword ptr
0055BC79|.BA 02000000   mov   edx, 2
0055BC7E|.E8 258DEAFF   call    004049A8
0055BC83|.8D45 FC       lea   eax, dword ptr
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 编辑 ]

enjon 发表于 2007-11-10 12:18:18

牛叉,/:good

ThanksBoy 发表于 2007-11-11 08:52:48

这个在ICG看过啊..在这边也支持啊..
下了你这个动画来看看啊...

网络断魂 发表于 2007-11-12 10:05:57

/:018
谢谢支持,嘎嘎

Nisy 发表于 2007-11-12 17:38:49

/:09 不错 欢迎兄弟继续和大家分享算法分析文章

网络断魂 发表于 2007-11-12 23:11:20

NISY,牛人,我的奋斗目标!

fwtfd 发表于 2007-11-14 15:58:32

嘿嘿,看过了,不过还是支持

lj960221 发表于 2007-11-14 22:21:59

哎呀,看不太明白,还是支持

秋之夜 发表于 2007-11-18 00:44:35

呵呵,这么一说,明白了不少。谢谢楼主

江湖一剑 发表于 2007-11-18 20:53:49

谢楼主,学习学习...
页: [1] 2
查看完整版本: 半仙算命V2007 build 11.01 算法简单分析(高手飞过)