|
[分享]零起点学习Linux系列培训视频
正使用ubuntu 回帖,支持lz一下 |
|
[原创]file Bus 序列算法分析,及注册机编写
lz有用到IDA 吗?? |
|
|
|
[原创]J2ME下逆向工程必备工具
我知道这样一个软件:把收费游戏载入,重新编译,打包就可以破解java游戏。成功率达90%以上。 |
|
[原创]为了感谢看雪对我的帮助,支持嵌入式版块,我说点山寨机的内幕
SP计费(即短信计费) 可以打10086到移动投诉被SP服务莫名其妙扣费了。要求他帮你取消SP服务就可以避免上当,永无后顾之忧。其实这样相当于破解了很多短信收费的Java游戏。 至于网页计费嘛,在移动梦网下载游戏,手机主题等就是通过这样的方式扣费的。可以在提示要扣费时,可以提取到实际下载的地址逃过收费。 以上是在手机论坛学到的。 |
|
一个简单的crackme(高手略过)
改了两处,提示成功。不知道有没有被骗? |
|
|
|
|
|
[下载]为了邀请码,送上珍藏多年的C语言设计电子教程
不知道LZ有没有到过ChinaUnix的论坛?如有应该知道这本书不值得收藏。 |
|
[原创]本人写的CrackMe 程序。应该是很牛B的一个Crackme 考验技术
LZ还是直接传上来吧。 |
|
[注意]邀请码发放公布(02.04~02.20)
版主麻烦你核对下这个: zhongqilun 【原创】(申请邀请码)解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码 已发 上面的帖子 【原创】(申请邀请码)解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码 应该是我发的。 不过邀请码我已经收到了。谢谢版主 |
|
安装虚拟机vmware后启动vmware的一个错误提示怎么解决?
不知道LZ的VMware是什么版本的?如果是7.0的,我想你应该是没有输入序列号。如果是低版本的,你就提供这么少的信息,我就不知道为什么了。 |
|
[邀请码已发][原创]解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码
多谢大家支持!除夕啦,大家新年快乐。 |
|
|
|
[邀请码已发][原创]解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码
我的解压后没有一个REG的文件,我用电脑迷的PE里的FINALDATA2.0也是提示要输入序列号的。不知道你的是什么版本,从哪里得到的? |
|
[邀请码已发][原创]申请邀请码-佳宜会员管理软件2.15破解全过程
10年共享软件居然还有未加壳和明码比较的!LZ分析的挺详细的,学习啦 |
|
[邀请码已发][原创]解密FINALDATA2.0,补上序列号验证部分的算法分析和注册机源代码
补上序列号验证部分的算法分析 解密FINALDATA2.0算法分析 00510790 /$ 55 push ebp ; (initial cpu selection) 00510791 |. 8BEC mov ebp, esp 00510793 |. 83EC 50 sub esp, 50 00510796 |. 6A 03 push 3 00510798 |. 8B45 08 mov eax, dword ptr [ebp+8] 0051079B |. 50 push eax 0051079C |. 8D4D C8 lea ecx, dword ptr [ebp-38] 0051079F |. 51 push ecx 005107A0 |. E8 8B200A00 call 005B2830 005107A5 |. 83C4 0C add esp, 0C 005107A8 |. C645 CB 00 mov byte ptr [ebp-35], 0 005107AC |. 68 34867100 push 00718634 ; ntc 005107B1 |. 8D55 C8 lea edx, dword ptr [ebp-38] 005107B4 |. 52 push edx 005107B5 |. E8 C6A00B00 call 005CA880 005107BA |. 83C4 08 add esp, 8 005107BD |. 85C0 test eax, eax ; 前面这段应该是判断输入的注册码的前三位是否NTC 005107BF |. 74 07 je short 005107C8 ; 跳转就完 005107C1 |. 33C0 xor eax, eax 005107C3 |. E9 D7020000 jmp 00510A9F 005107C8 |> 8B45 08 mov eax, dword ptr [ebp+8] ; 注意EAX 005107CB |. 0FBE48 08 movsx ecx, byte ptr [eax+8] 005107CF |. 83F9 2D cmp ecx, 2D ; 2D对应的ASCII "-" 判断第9位是否- 005107D2 |. 75 1B jnz short 005107EF ; 跳转就完 005107D4 |. 8B55 08 mov edx, dword ptr [ebp+8] ; 005107D7 |. 0FBE42 0D movsx eax, byte ptr [edx+D] ; 注意EAX 005107DB |. 83F8 2D cmp eax, 2D ; 2D对应的ASCII "-" 判断第14位是否- 005107DE |. 75 0F jnz short 005107EF 005107E0 |. 8B4D 08 mov ecx, dword ptr [ebp+8] 005107E3 |. 51 push ecx ; /String 005107E4 |. FF15 90D56A00 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA 005107EA |. 83F8 1A cmp eax, 1A ; 这两句是比较我们输入的序列号长度是否为26 005107ED |. 74 07 je short 005107F6 005107EF |> 33C0 xor eax, eax 005107F1 |. E9 A9020000 jmp 00510A9F 005107F6 |> C745 E8 03000>mov dword ptr [ebp-18], 3 005107FD |. EB 09 jmp short 00510808 下面这一段构成一个循环验证4-8位是否为数字 005107FF |> 8B55 E8 /mov edx, dword ptr [ebp-18] 00510802 |. 83C2 01 |add edx, 1 00510805 |. 8955 E8 |mov dword ptr [ebp-18], edx 00510808 |> 837D E8 08 cmp dword ptr [ebp-18], 8 0051080C |. 7D 1F |jge short 0051082D 0051080E |. 8B45 08 |mov eax, dword ptr [ebp+8] 00510811 |. 0345 E8 |add eax, dword ptr [ebp-18] 00510814 |. 0FBE08 |movsx ecx, byte ptr [eax] 00510817 |. 51 |push ecx 00510818 |. E8 D3260A00 |call 005B2EF0 ; 关键 按F7跟进。这里验证是否为数字的算法,后面会分析到 0051081D |. 83C4 04 |add esp, 4 00510820 |. 85C0 |test eax, eax 00510822 75 07 jnz short 0051082B ; 注意 不为零/不等于则跳 00510824 |. 33C0 |xor eax, eax 00510826 |. E9 74020000 |jmp 00510A9F 0051082B |>^ EB D2 \jmp short 005107FF 0051082D |> C745 E8 09000>mov dword ptr [ebp-18], 9 00510834 |. EB 09 jmp short 0051083F 下面这一段构成一个循环验证10-13位是否为数字 00510836 |> 8B55 E8 /mov edx, dword ptr [ebp-18] 00510839 |. 83C2 01 |add edx, 1 0051083C |. 8955 E8 |mov dword ptr [ebp-18], edx 0051083F |> 837D E8 0D cmp dword ptr [ebp-18], 0D 00510843 |. 7D 1F |jge short 00510864 00510845 |. 8B45 08 |mov eax, dword ptr [ebp+8] 00510848 |. 0345 E8 |add eax, dword ptr [ebp-18] 0051084B |. 0FBE08 |movsx ecx, byte ptr [eax] 0051084E |. 51 |push ecx 0051084F |. E8 9C260A00 |call 005B2EF0 ; 关键 按F7跟进 。 00510854 |. 83C4 04 |add esp, 4 00510857 |. 85C0 |test eax, eax 00510859 |. 75 07 |jnz short 00510862 0051085B |. 33C0 |xor eax, eax 0051085D |. E9 3D020000 |jmp 00510A9F 00510862 |>^ EB D2 \jmp short 00510836 下面这一段构成一个循环验证余下12位位是否为数字 00510864 |> C745 E8 0E000>mov dword ptr [ebp-18], 0E 0051086B |. EB 09 jmp short 00510876 0051086D |> 8B55 E8 /mov edx, dword ptr [ebp-18] 00510870 |. 83C2 01 |add edx, 1 00510873 |. 8955 E8 |mov dword ptr [ebp-18], edx 00510876 |> 837D E8 1A cmp dword ptr [ebp-18], 1A 0051087A |. 7D 1F |jge short 0051089B 0051087C |. 8B45 08 |mov eax, dword ptr [ebp+8] 0051087F |. 0345 E8 |add eax, dword ptr [ebp-18] 00510882 |. 0FBE08 |movsx ecx, byte ptr [eax] 00510885 |. 51 |push ecx 00510886 |. E8 65260A00 |call 005B2EF0 ; 关键 按F7跟进 。 0051088B |. 83C4 04 |add esp, 4 0051088E |. 85C0 |test eax, eax 00510890 |. 75 07 |jnz short 00510899 00510892 |. 33C0 |xor eax, eax 00510894 |. E9 06020000 |jmp 00510A9F 00510899 |>^ EB D2 \jmp short 0051086D 至此,我们知道序列号是这样的形式:NTC12345-6789-987654321123,即第1-3位是NTC,第4-8位、10-13位和15-26位均是数字,第9和14位是-。 下面是对输入的序列号抽出部分来运算再做判断,分析下面的运算算法前,我们先看看call 005B2EF0 中如何验证是否为数字的。 005B2EF0 /$ 55 push ebp 005B2EF1 |. 8BEC mov ebp, esp 005B2EF3 |. 51 push ecx 005B2EF4 |. 833D E4E87400>cmp dword ptr [74E8E4], 1 ; 数据窗口中跟随>内存地址 可以看到ds:[0074E8E4]=00000001 005B2EFB 7E 13 jle short 005B2F10 ; <= 则跳。这里一定会跳转的 005B2EFD |. 6A 04 push 4 005B2EFF |. 8B45 08 mov eax, dword ptr [ebp+8] 005B2F02 |. 50 push eax 005B2F03 |. E8 A8C30000 call 005BF2B0 005B2F08 |. 83C4 08 add esp, 8 005B2F0B |. 8945 FC mov dword ptr [ebp-4], eax 005B2F0E |. EB 15 jmp short 005B2F25 005B2F10 |> 8B4D 08 mov ecx, dword ptr [ebp+8] ; (ecx)=序列号中字符的ASCII值 005B2F13 |. 8B15 D8E67400 mov edx, dword ptr [74E6D8] ; 数据窗口中跟随>内存地址。下面给出ds:0074E6D8附近的值 005B2F19 |. 33C0 xor eax, eax 005B2F1B |. 66:8B044A mov ax, word ptr [edx+ecx*2] ; (ax)一定要是***4(*号可以是任意数) 005B2F1F |. 83E0 04 and eax, 4 005B2F22 |. 8945 FC mov dword ptr [ebp-4], eax 005B2F25 |> 8B45 FC mov eax, dword ptr [ebp-4] ; (eax)若是0则完 005B2F28 |. 8BE5 mov esp, ebp 005B2F2A |. 5D pop ebp 005B2F2B \. C3 retn ds:0074E6D8附近的值如下: 0074E6D8 E2 E6 74 00 E2 E6 74 00 00 00 20 00 20 00 20 00 怄t.怄t... . . . 0074E6E8 20 00 20 00 20 00 20 00 20 00 20 00 28 00 28 00 . . . . . .(.(. 0074E6F8 28 00 28 00 28 00 20 00 20 00 20 00 20 00 20 00 (.(.(. . . . . . 0074E708 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 . . . . . . . . 0074E718 20 00 20 00 20 00 20 00 20 00 48 00 10 00 10 00 . . . . .H... 0074E728 10 00 10 00 10 00 10 00 10 00 10 00 10 00 10 00 ........ 0074E738 10 00 10 00 10 00 10 00 10 00 84 00 84 00 84 00 .....??? 0074E748 84 00 84 00 84 00 84 00 84 00 84 00 84 00 10 00 ???????. 0074E758 10 00 10 00 10 00 10 00 10 00 10 00 81 00 81 00 ......?? 0074E768 81 00 81 00 81 00 81 00 01 00 01 00 01 00 01 00 ????.... 从上面可以看到若(ax)是***4(*号可以是任意数),则(edx+ecx*2)=0074E742-0074E754 又(edx)=0074E6E2 因此 (ecx)=[(edx+ecx*2)-(edx)]/2=30-39,所以对应的是0-9,即为数字。 ;为表述上方便,定义从这里开始为对输入的序列号的第一轮运算 0051089B |> 6A 02 push 2 0051089D |. 8B55 08 mov edx, dword ptr [ebp+8] ; 取出输入的序列号 005108A0 |. 83C2 05 add edx, 5 ; 为什么加5后会少了前五位 005108A3 |. 52 push edx 005108A4 |. 8D45 C8 lea eax, dword ptr [ebp-38] 005108A7 |. 50 push eax 005108A8 |. E8 831F0A00 call 005B2830 ; EAX对应的ASCII为34C,即取出序列号中的6、7位 005108AD |. 83C4 0C add esp, 0C 005108B0 |. C645 CA 00 mov byte ptr [ebp-36], 0 005108B4 |. 8D4D C8 lea ecx, dword ptr [ebp-38] 005108B7 |. 51 push ecx 005108B8 |. E8 231E0A00 call 005B26E0 ; 关键 按F7跟入.这里将对取出的数字进行一次运算,后面我们再分析这里。 005108BD |. 83C4 04 add esp, 4 005108C0 |. 83F0 07 xor eax, 7 005108C3 |. 8845 EC mov byte ptr [ebp-14], al 005108C6 |. 6A 02 push 2 005108C8 |. 8B55 08 mov edx, dword ptr [ebp+8] 005108CB |. 83C2 09 add edx, 9 ; 去掉前9位 005108CE |. 52 push edx 005108CF |. 8D45 C8 lea eax, dword ptr [ebp-38] 005108D2 |. 50 push eax 005108D3 |. E8 581F0A00 call 005B2830 ; EAX对应的ASCII为67,即取出序列号中的10、11位 005108D8 |. 83C4 0C add esp, 0C 005108DB |. C645 CA 00 mov byte ptr [ebp-36], 0 005108DF |. 8D4D C8 lea ecx, dword ptr [ebp-38] 005108E2 |. 51 push ecx 005108E3 |. E8 F81D0A00 call 005B26E0 005108E8 |. 83C4 04 add esp, 4 005108EB |. 83F0 03 xor eax, 3 005108EE |. 8845 C0 mov byte ptr [ebp-40], al 005108F1 |. 6A 0A push 0A 005108F3 |. 8B55 08 mov edx, dword ptr [ebp+8] 005108F6 |. 83C2 0E add edx, 0E ; 去掉前14位 005108F9 |. 52 push edx 005108FA |. 8D45 C8 lea eax, dword ptr [ebp-38] 005108FD |. 50 push eax 005108FE |. E8 2D1F0A00 call 005B2830 ; EAX对应的ASCII为9876543211,即取出序列号中的15-23位 00510903 |. 83C4 0C add esp, 0C 00510906 |. C645 D2 00 mov byte ptr [ebp-2E], 0 0051090A |. 8D4D C8 lea ecx, dword ptr [ebp-38] 0051090D |. 51 push ecx 0051090E |. E8 CD1C0A00 call 005B25E0 00510913 |. 83C4 04 add esp, 4 00510916 |. 35 27053620 xor eax, 20360527 0051091B |. 8945 F0 mov dword ptr [ebp-10], eax 0051091E |. 6A 02 push 2 00510920 |. 8B55 08 mov edx, dword ptr [ebp+8] 00510923 |. 83C2 03 add edx, 3 ; 去掉前3位 00510926 |. 52 push edx 00510927 |. 8D45 C8 lea eax, dword ptr [ebp-38] 0051092A |. 50 push eax 0051092B |. E8 001F0A00 call 005B2830 ; EAX对应的ASCII为12,即取出序列号中的4、5位 00510930 |. 83C4 0C add esp, 0C 00510933 |. C645 CA 00 mov byte ptr [ebp-36], 0 00510937 |. 8D4D C8 lea ecx, dword ptr [ebp-38] 0051093A |. 51 push ecx 0051093B |. E8 A01D0A00 call 005B26E0 00510940 |. 83C4 04 add esp, 4 00510943 |. 8845 FC mov byte ptr [ebp-4], al 00510946 |. 6A 01 push 1 00510948 |. 8B55 08 mov edx, dword ptr [ebp+8] 0051094B |. 83C2 07 add edx, 7 ; 去掉前7位 0051094E |. 52 push edx 0051094F |. 8D45 C8 lea eax, dword ptr [ebp-38] 00510952 |. 50 push eax 00510953 |. E8 D81E0A00 call 005B2830 ; EAX对应的ASCII为5,即取出序列号中的8位 00510958 |. 83C4 0C add esp, 0C 0051095B |. C645 C9 00 mov byte ptr [ebp-37], 0 0051095F |. 8D4D C8 lea ecx, dword ptr [ebp-38] 00510962 |. 51 push ecx 00510963 |. E8 781D0A00 call 005B26E0 00510968 |. 83C4 04 add esp, 4 0051096B |. 8845 BC mov byte ptr [ebp-44], al 0051096E |. 6A 02 push 2 00510970 |. 8B55 08 mov edx, dword ptr [ebp+8] 00510973 |. 83C2 0B add edx, 0B 00510976 |. 52 push edx 00510977 |. 8D45 C8 lea eax, dword ptr [ebp-38] 0051097A |. 50 push eax 0051097B |. E8 B01E0A00 call 005B2830 ; EAX对应的ASCII为89,即取出序列号中的12、13位 00510980 |. 83C4 0C add esp, 0C 00510983 |. C645 CA 00 mov byte ptr [ebp-36], 0 00510987 |. 8D4D C8 lea ecx, dword ptr [ebp-38] 0051098A |. 51 push ecx ; EAX对应ASCII为89 0051098B |. E8 501D0A00 call 005B26E0 00510990 |. 83C4 04 add esp, 4 00510993 |. 8845 B4 mov byte ptr [ebp-4C], al ; ebp-4C 00510996 |. 6A 02 push 2 00510998 |. 8B55 08 mov edx, dword ptr [ebp+8] 0051099B |. 83C2 18 add edx, 18 ; 去掉前24位 0051099E |. 52 push edx 0051099F |. 8D45 C8 lea eax, dword ptr [ebp-38] 005109A2 |. 50 push eax 005109A3 |. E8 881E0A00 call 005B2830 ; EAX对应的ASCII为23,即取出序列号中的25、26位 005109A8 |. 83C4 0C add esp, 0C 005109AB |. C645 CA 00 mov byte ptr [ebp-36], 0 005109AF |. 8D4D C8 lea ecx, dword ptr [ebp-38] 005109B2 |. 51 push ecx ; 005109B3 |. E8 281D0A00 call 005B26E0 005109B8 |. 83C4 04 add esp, 4 005109BB |. 8845 F8 mov byte ptr [ebp-8], al ;为表述上方便,定义从这里开始为对输入的序列号的第二轮运算 005109BE |. 8B55 EC mov edx, dword ptr [ebp-14] ; 005109C1 |. 81E2 FF000000 and edx, 0FF ; edx=6,7位(即34)运算后的值 005109C7 |. 8B45 F0 mov eax, dword ptr [ebp-10] ; edx=15-24位(即1234123456)运算后的值 005109CA |. 8D4402 05 lea eax, dword ptr [edx+eax+5] 005109CE |. 33D2 xor edx, edx 005109D0 |. B9 0A000000 mov ecx, 0A 005109D5 |. F7F1 div ecx 005109D7 |. 8855 F4 mov byte ptr [ebp-C], dl ; (ebp-C)=[(ebp-14)+(ebp-10)+5]mod 0AH 005109DA |. 8B55 C0 mov edx, dword ptr [ebp-40] 005109DD |. 81E2 FF000000 and edx, 0FF ; edx为11,12位(即67)经第一轮运算后的值 005109E3 |. 8B45 F0 mov eax, dword ptr [ebp-10] ; edx为15-24位(即9876543211)经第一轮运算后的值 005109E6 |. 8D4402 05 lea eax, dword ptr [edx+eax+5] 005109EA |. 33D2 xor edx, edx 005109EC |. B9 64000000 mov ecx, 64 005109F1 |. F7F1 div ecx 005109F3 |. 8855 B8 mov byte ptr [ebp-48], dl ; (ebp-48)=[(ebp-40)+(ebp-10)+5]mod 64H 005109F6 |. 8B55 F4 mov edx, dword ptr [ebp-C] 005109F9 |. 81E2 FF000000 and edx, 0FF 005109FF |. 8B45 B8 mov eax, dword ptr [ebp-48] 00510A02 |. 25 FF000000 and eax, 0FF 00510A07 |. 8D4402 07 lea eax, dword ptr [edx+eax+7] 00510A0B |. 99 cdq 00510A0C |. B9 64000000 mov ecx, 64 00510A11 |. F7F9 idiv ecx 00510A13 |. 8855 B0 mov byte ptr [ebp-50], dl ; (ebp-50)=[(ebp-C+(ebp-48)+7]mod 64H 00510A16 |. 8B55 F4 mov edx, dword ptr [ebp-C] 00510A19 |. 81E2 FF000000 and edx, 0FF 00510A1F |. 8B45 B8 mov eax, dword ptr [ebp-48] 00510A22 |. 25 FF000000 and eax, 0FF 00510A27 |. 03D0 add edx, eax 00510A29 |. 8B4D B0 mov ecx, dword ptr [ebp-50] 00510A2C |. 81E1 FF000000 and ecx, 0FF 00510A32 |. 8D440A 08 lea eax, dword ptr [edx+ecx+8] 00510A36 |. 99 cdq 00510A37 |. B9 64000000 mov ecx, 64 00510A3C |. F7F9 idiv ecx 00510A3E |. 8855 C4 mov byte ptr [ebp-3C], dl ; (ebp-3C)=[(ebp-C)+(ebp-48)+(ebp-50)+8]mod 0AH ; 对前面两轮运算结果进行判断 00510A41 |. 8B55 F4 mov edx, dword ptr [ebp-C] ;ebp-C 00510A44 |. 81E2 FF000000 and edx, 0FF 00510A4A |. 8B45 BC mov eax, dword ptr [ebp-44] ;ebp-44 00510A4D |. 25 FF000000 and eax, 0FF 00510A52 |. 3BD0 cmp edx, eax 00510A54 |. 75 40 jnz short 00510A96 ; 不为零/不等于则完 00510A56 |. 8B4D B8 mov ecx, dword ptr [ebp-48] ; ebp-48 00510A59 |. 81E1 FF000000 and ecx, 0FF 00510A5F |. 8B55 B4 mov edx, dword ptr [ebp-4C] ; (第12,13位经第一轮运算的结果) 00510A62 |. 81E2 FF000000 and edx, 0FF 00510A68 |. 3BCA cmp ecx, edx 00510A6A |. 75 2A jnz short 00510A96 ; 不为零/不等于则完 00510A6C |. 8B45 B0 mov eax, dword ptr [ebp-50] ; ebp-50 00510A6F |. 25 FF000000 and eax, 0FF 00510A74 |. 8B4D FC mov ecx, dword ptr [ebp-4] ; (第3,4位经第一轮运算的结果) 00510A77 |. 81E1 FF000000 and ecx, 0FF 00510A7D |. 3BC1 cmp eax, ecx 00510A7F |. 75 15 jnz short 00510A96 ; 不为零/不等于则完 00510A81 |. 8B55 C4 mov edx, dword ptr [ebp-3C] ; ebp-3C 00510A84 |. 81E2 FF000000 and edx, 0FF 00510A8A |. 8B45 F8 mov eax, dword ptr [ebp-8] ; (第11,12位经第一轮运算的结果) 00510A8D |. 25 FF000000 and eax, 0FF 00510A92 |. 3BD0 cmp edx, eax 00510A94 |. 74 04 je short 00510A9A ; 零/等于则跳,激活 00510A96 |> 33C0 xor eax, eax 00510A98 |. EB 05 jmp short 00510A9F 00510A9A |> B8 01000000 mov eax, 1 ; 若跳转到这就激活 00510A9F |> 8BE5 mov esp, ebp ; 若跳转到这就完 00510AA1 |. 5D pop ebp 00510AA2 \. C3 retn 下面我们分析call 005B26E0 005B26E0 /$ 55 push ebp 005B26E1 |. 8BEC mov ebp, esp 005B26E3 |. 8B45 08 mov eax, dword ptr [ebp+8] 005B26E6 |. 50 push eax 005B26E7 |. E8 F4FEFFFF call 005B25E0 ; 还要跳转一次 005B26EC |. 83C4 04 add esp, 4 005B26EF |. 5D pop ebp 005B26F0 \. C3 retn 005B25E0 /$ 55 push ebp 005B25E1 |. 8BEC mov ebp, esp 005B25E3 |. 83EC 14 sub esp, 14 005B25E6 |> 833D E4E87400>/cmp dword ptr [74E8E4], 1 005B25ED |. 7E 17 |jle short 005B2606 ; 小于或等于/不大于则跳 005B25EF |. 6A 08 |push 8 005B25F1 |. 8B45 08 |mov eax, dword ptr [ebp+8] 005B25F4 |. 33C9 |xor ecx, ecx 005B25F6 |. 8A08 |mov cl, byte ptr [eax] 005B25F8 |. 51 |push ecx 005B25F9 |. E8 B2CC0000 |call 005BF2B0 005B25FE |. 83C4 08 |add esp, 8 005B2601 |. 8945 F0 |mov dword ptr [ebp-10], eax 005B2604 |. EB 19 |jmp short 005B261F 005B2606 |> 8B55 08 |mov edx, dword ptr [ebp+8] 005B2609 |. 33C0 |xor eax, eax 005B260B |. 8A02 |mov al, byte ptr [edx] ; (EAX)=前面取出的数字中的第1位的ASCII值 005B260D |. 8B0D D8E67400 |mov ecx, dword ptr [74E6D8] ; Unpacked.0074E6E2 005B2613 |. 33D2 |xor edx, edx 005B2615 |. 66:8B1441 |mov dx, word ptr [ecx+eax*2] 005B2619 |. 83E2 08 |and edx, 8 005B261C |. 8955 F0 |mov dword ptr [ebp-10], edx 005B261F |> 837D F0 00 |cmp dword ptr [ebp-10], 0 005B2623 |. 74 0B |je short 005B2630 ; 零/等于则跳 005B2625 |. 8B45 08 |mov eax, dword ptr [ebp+8] 005B2628 |. 83C0 01 |add eax, 1 005B262B |. 8945 08 |mov dword ptr [ebp+8], eax 005B262E |.^ EB B6 \jmp short 005B25E6 前面这段又是判断从输入的序列号取出的第一位是否为数字 005B2630 |> 8B4D 08 mov ecx, dword ptr [ebp+8] 005B2633 |. 33D2 xor edx, edx 005B2635 |. 8A11 mov dl, byte ptr [ecx] ; (EAX)=从输入的序列号取出的数字中的第1位的ASCII值 005B2637 |. 8955 FC mov dword ptr [ebp-4], edx 005B263A |. 8B45 08 mov eax, dword ptr [ebp+8] 005B263D |. 83C0 01 add eax, 1 005B2640 |. 8945 08 mov dword ptr [ebp+8], eax 005B2643 |. 8B4D FC mov ecx, dword ptr [ebp-4] 005B2646 |. 894D F4 mov dword ptr [ebp-C], ecx 005B2649 |. 837D FC 2D cmp dword ptr [ebp-4], 2D ; - 005B264D |. 74 06 je short 005B2655 005B264F |. 837D FC 2B cmp dword ptr [ebp-4], 2B ; + 005B2653 |. 75 13 jnz short 005B2668 005B2655 |> 8B55 08 mov edx, dword ptr [ebp+8] 005B2658 |. 33C0 xor eax, eax 005B265A |. 8A02 mov al, byte ptr [edx] 005B265C |. 8945 FC mov dword ptr [ebp-4], eax 005B265F |. 8B4D 08 mov ecx, dword ptr [ebp+8] 005B2662 |. 83C1 01 add ecx, 1 005B2665 |. 894D 08 mov dword ptr [ebp+8], ecx 005B2668 |> C745 F8 00000>mov dword ptr [ebp-8], 0 ;下面这一段构成一个循环对从输入的序列号取出的数字进行运算 005B266F |> 833D E4E87400>/cmp dword ptr [74E8E4], 1 005B2676 |. 7E 13 |jle short 005B268B ; 小于或等于/不大于则跳 005B2678 |. 6A 04 |push 4 005B267A |. 8B55 FC |mov edx, dword ptr [ebp-4] 005B267D |. 52 |push edx 005B267E |. E8 2DCC0000 |call 005BF2B0 005B2683 |. 83C4 08 |add esp, 8 005B2686 |. 8945 EC |mov dword ptr [ebp-14], eax 005B2689 |. EB 15 |jmp short 005B26A0 005B268B |> 8B45 FC |mov eax, dword ptr [ebp-4] 005B268E |. 8B0D D8E67400 |mov ecx, dword ptr [74E6D8] ; Unpacked.0074E6E2 005B2694 |. 33D2 |xor edx, edx 005B2696 |. 66:8B1441 |mov dx, word ptr [ecx+eax*2] 005B269A |. 83E2 04 |and edx, 4 005B269D |. 8955 EC |mov dword ptr [ebp-14], edx 005B26A0 |> 837D EC 00 |cmp dword ptr [ebp-14], 0 005B26A4 |. 74 25 |je short 005B26CB ; 零/等于则跳,最后从这里跳出循环 005B26A6 |. 8B45 F8 |mov eax, dword ptr [ebp-8] ;初始时(ebp-8)=0,之后就等于前一次的运算结果 005B26A9 |. 6BC0 0A |imul eax, eax, 0A 005B26AC |. 8B4D FC |mov ecx, dword ptr [ebp-4] 005B26AF |. 8D5408 D0 |lea edx, dword ptr [eax+ecx-30] ; 注意 (eax)+(ecx)-30 005B26B3 |. 8955 F8 |mov dword ptr [ebp-8], edx 005B26B6 |. 8B45 08 |mov eax, dword ptr [ebp+8] 005B26B9 |. 33C9 |xor ecx, ecx 005B26BB |. 8A08 |mov cl, byte ptr [eax] 005B26BD |. 894D FC |mov dword ptr [ebp-4], ecx 005B26C0 |. 8B55 08 |mov edx, dword ptr [ebp+8] 005B26C3 |. 83C2 01 |add edx, 1 005B26C6 |. 8955 08 |mov dword ptr [ebp+8], edx 005B26C9 |.^ EB A4 \jmp short 005B266F 005B26CB |> 837D F4 2D cmp dword ptr [ebp-C], 2D 005B26CF |. 75 07 jnz short 005B26D8 005B26D1 |. 8B45 F8 mov eax, dword ptr [ebp-8] 005B26D4 |. F7D8 neg eax 005B26D6 |. EB 03 jmp short 005B26DB 005B26D8 |> 8B45 F8 mov eax, dword ptr [ebp-8] 005B26DB |> 8BE5 mov esp, ebp 005B26DD |. 5D pop ebp 005B26DE \. C3 retn 前面这段实验这样的功能: 假设序列号中取出的数字排列为 abcd,则经过这段代码后(eax)=[(a * 0AH+b) * 0AH+c] * 0AH+d 即是把取出的数字排列abcd转换为十进制数abcd。 至此整个验证序列号的算法完全弄清楚啦。这个软件的验证算法也真的较麻烦了。 第一次写算法分析,难免有错误,欢迎大家批评指正。 我的编程水平太菜了,写两天才把注册机写出来。 下面是注册机代码(VB 6.0): Private Sub Command1_Click() start: Randomize a1 = Int((9 * Rnd) + 0) a2 = Int((9 * Rnd) + 0) X1 = Val(a1 & a2) X1 = X1 Xor 7 b1 = Int((9 * Rnd) + 0) b2 = Int((9 * Rnd) + 0) X2 = Val(b1 & b2) X2 = X2 Xor 3 c1 = Int((9 * Rnd) + 0) c2 = Int((9 * Rnd) + 0) c3 = Int((9 * Rnd) + 0) c4 = Int((9 * Rnd) + 0) c5 = Int((9 * Rnd) + 0) c6 = Int((9 * Rnd) + 0) c7 = Int((9 * Rnd) + 0) c8 = Int((9 * Rnd) + 0) c9 = Int((9 * Rnd) + 0) c10 = Int((9 * Rnd) + 0) Dim tmp As Double tmp = Val(c1 & c2 & c3 & c4 & c5 & c6 & c7 & c8 & c9 & c10) If tmp > 2147483647 Then GoTo start Dim X3 As Long X3 = tmp X3 = X3 Xor 540411175 Y1 = (X1 + X3 + 5) Mod 10 Y2 = (X2 + X3 + 5) Mod 100 y3 = (Y1 + Y2 + 7) Mod 100 y4 = (Y1 + Y2 + y3 + 8) Mod 100 x5 = Y1 X6 = Y2 If X6 < 10 Then X6 = "0" & X6 X4 = y3 If X4 < 10 Then X4 = "0" & X4 X7 = y4 If X7 < 10 Then X7 = "0" & X7 Form1.Text1.Text = "NTC" & X4 & a1 & a2 & x5 & "-" & b1 & b2 & X6 & "-" & c1 & c2 & c3 & c4 & c5 & c6 & c7 & c8 & c9 & c10 & X7 End Sub 总算把一个软件的爆破,到算法分析、注册机的全过程完成了,花了很长时间,不过收获很大。 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值