那些客套话就不复制了、
大牛飞过、因为这个确实很菜。不过也没办法偶就这水平
来看雪好几年了 从未发一帖。本来打算依然沉默,但无奈想升级这个软件却要收费而且还是二十几美元,为了节约只能冒犯了、
今天证明一下 我还是存在的
一个PDF剪切的软件
软件本身没有壳
典型的注册码错误有提示框的,过程就省了,直接说算法
比较地方的段首
0040E5CC /. 55 push ebp 段首
0040E5CD |. 8BEC mov ebp, esp
0040E5CF |. 83C4 BC add esp, -44
0040E5D2 |. 53 push ebx
0040E5D3 |. 56 push esi
0040E5D4 |. 8BD8 mov ebx, eax
0040E5D6 |. BE D3CE6600 mov esi, 0066CED3
0040E5DB |. B8 E0D06600 mov eax, 0066D0E0
0040E5E0 |. E8 5F3D2300 call 00642344
0040E5E5 |. 66:C745 E0 14>mov word ptr [ebp-20], 14
0040E5EB |. 33D2 xor edx, edx
0040E5ED |. 8955 FC mov dword ptr [ebp-4], edx
0040E5F0 |. 8D55 FC lea edx, dword ptr [ebp-4]
0040E5F3 |. FF45 EC inc dword ptr [ebp-14]
0040E5F6 |. 8B83 18030000 mov eax, dword ptr [ebx+318]
0040E5FC |. E8 47B21D00 call 005E9848
0040E601 |. 66:C745 E0 08>mov word ptr [ebp-20], 8
0040E607 |. 837D FC 00 cmp dword ptr [ebp-4], 0
0040E60B |. 74 05 je short 0040E612
0040E60D |. 8B55 FC mov edx, dword ptr [ebp-4] ; edx=假码
0040E610 |. EB 03 jmp short 0040E615
0040E612 |> 8D56 1D lea edx, dword ptr [esi+1D]
0040E615 |> 8BC3 mov eax, ebx
0040E617 E8 40040000 call 0040EA5C ; 关键call
0040E61C 84C0 test al, al
0040E61E 75 67 jnz short 0040E687
0040E620 66:C745 E0 20>mov word ptr [ebp-20], 20
0040E626 8D56 1E lea edx, dword ptr [esi+1E]
0040E629 8D45 F8 lea eax, dword ptr [ebp-8]
0040E62C E8 97352400 call 00651BC8
0040E631 |. FF45 EC inc dword ptr [ebp-14]
0040E634 |. 8B10 mov edx, dword ptr [eax]
0040E636 |. 8B83 20030000 mov eax, dword ptr [ebx+320]
0040E63C |. E8 37B21D00 call 005E9878
0040E641 |. FF4D EC dec dword ptr [ebp-14]
0040E644 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0040E647 |. BA 02000000 mov edx, 2
0040E64C |. E8 D7362400 call 00651D28
0040E651 |. 6A 10 push 10
0040E653 |. 8D4E 5F lea ecx, dword ptr [esi+5F]
0040E656 |. 51 push ecx
0040E657 |. 8D46 2C lea eax, dword ptr [esi+2C]
0040E65A |. 50 push eax
0040E65B |. 8BC3 mov eax, ebx
0040E65D |. E8 FA181E00 call 005EFF5C
0040E662 |. 50 push eax ; |hOwner
0040E663 |. E8 08762500 call <jmp.&USER32.MessageBoxA> ; \提示错误对话框
0040E668 |. FF4D EC dec dword ptr [ebp-14]
0040E66B |. 8D45 FC lea eax, dword ptr [ebp-4]
0040E66E |. BA 02000000 mov edx, 2
0040E673 |. E8 B0362400 call 00651D28
0040E678 |. 8B4D D0 mov ecx, dword ptr [ebp-30]
0040E67B |. 64:890D 00000>mov dword ptr fs:[0], ecx
0040E682 |. E9 9F000000 jmp 0040E726
从上面的关键call跟进
下面的是关键的算法call
0040EA5C /$ 53 push ebx
0040EA5D |. 56 push esi
0040EA5E |. 57 push edi
0040EA5F |. 8BDA mov ebx, edx
0040EA61 |. 85DB test ebx, ebx ; edx=假码 ebx=假码
0040EA63 |. 74 0C je short 0040EA71
0040EA65 |. 53 push ebx
0040EA66 |. E8 01342300 call 00641E6C ; 应该是获取输入字符串长度call
0040EA6B |. 59 pop ecx
0040EA6C |. 83F8 10 cmp eax, 10 ; eax=字符串长度
0040EA6F |. 74 04 je short 0040EA75 ; 字符长度为16时才跳转
0040EA71 |> 33C0 xor eax, eax
0040EA73 |. EB 2F jmp short 0040EAA4
0040EA75 |> 0FBE73 02 movsx esi, byte ptr [ebx+2] ; 取输入假码第三位ascii 有符号数扩展 esi=00000033
0040EA79 |. 8BC6 mov eax, esi ; eax=00000033 esi=00000033
0040EA7B |. 0FBE7B 08 movsx edi, byte ptr [ebx+8] ; 取假码第九位 edi=00000039
0040EA7F |. 03C7 add eax, edi ; eax等于第三位ascii 加 第九位ascii
0040EA81 |. 3D 9B000000 cmp eax, 9B ; 第三位ascii、第九位ascii和要等于9b
0040EA86 |. 75 1A jnz short 0040EAA2 ; 不等就会提示错误
0040EA88 |. 8BCE mov ecx, esi ; esi=00000033 ecx=假码 执行语句后ecx=00000033
0040EA8A |. 2BCF sub ecx, edi ; ecx=00000033 edi=00000039 执行后ecx=FFFFFFFA
0040EA8C |. 8BC1 mov eax, ecx ; eax=0000006c 执行后eax=FFFFFFFA
0040EA8E |. 99 cdq ; 执行后EDX=FFFFFFFF
0040EA8F |. 33C2 xor eax, edx ; 执行后eax=00000005
0040EA91 |. 2BC2 sub eax, edx ; eax=00000005 edx=FFFFFFFF 执行后eax=00000006
0040EA93 |. 83C0 41 add eax, 41 ; eax=00000006 相加 执行后eax=00000047
0040EA96 |. 0FBE53 05 movsx edx, byte ptr [ebx+5] ; 取第六位 edx=00000036
0040EA9A |. 3BC2 cmp eax, edx ; eax和edx相比
0040EA9C |. 75 04 jnz short 0040EAA2 ; 不等则跳转到错误
0040EA9E |. B0 01 mov al, 1 ; 执行后eax=00000001
0040EAA0 |. EB 02 jmp short 0040EAA4
0040EAA2 |> 33C0 xor eax, eax
0040EAA4 |> 5F pop edi
0040EAA5 |. 5E pop esi
0040EAA6 |. 5B pop ebx
0040EAA7 \. C3 retn
注释的很清楚了 我感觉。上面关键算法里 这种
颜色的全部改成相反的,就可以爆破了!
有人可能觉得改
0040E61C 84C0 test al, al
0040E61E 75 67 jnz short 0040E687
也可以
不过要是这个call其他验证的地方也校验了,就不行了
大概算法分析了一下
要求注册码必须为十六位
第三位ascii 加 第九位ascii =0x9B
第三位 减 第九位 =X
X 异或 0xFFFF =Y
Y 减 0xFFFF =Z
Z 加 0x41 =P
取第六位的ascii
要求 第六位的ascii=P 则为正确的注册码。
本来想用VB写个注册机来着,但是无奈水平不是一般的差,搞了大半天也没搞好就忍了了
有不当之处还请见谅。
bingo 2013.02.25
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)