半仙算命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 编辑 ] 牛叉,/:good 这个在ICG看过啊..在这边也支持啊..
下了你这个动画来看看啊... /:018
谢谢支持,嘎嘎 /:09 不错 欢迎兄弟继续和大家分享算法分析文章 NISY,牛人,我的奋斗目标! 嘿嘿,看过了,不过还是支持 哎呀,看不太明白,还是支持 呵呵,这么一说,明白了不少。谢谢楼主 谢楼主,学习学习...
页:
[1]
2