这个算法可能有问题。
偶的磁盘序号为
14901EF6H
我是解压在ty123 crackme5文件夹下
经计算 crackme5字符后
得出 6575BB3DH
6575BB3DH xor 14901EF6H = DF3C5813H
要得出这个数的字符 那得多少个注册码呀.....
不知道是不是我弄错了..
分析如下
004010CD > \83EF 08 sub edi, 8
004010D0 . FFD7 call edi ;
004010D2 . 85C0 test eax, eax
004010D4 . 0F84 92000000 je 0040116C
004010DA . C1E0 08 shl eax, 8 ; Count shl 8
004010DD . 66:3D 0020 cmp ax, 2000
004010E1 . 0F8F 85000000 jg 0040116C ; ax > 2000 跳走 注册码最大32位
004010E7 . 8D35 F9304000 lea esi, [4030F9] ; 输入序列号
004010ED . C1E8 08 shr eax, 8 ; EAX = 序列号个数
004010F0 . 91 xchg eax, ecx ; 放入 ECX 循环次数
004010F1 . 33C0 xor eax, eax
004010F3 . 33D2 xor edx, edx
004010F5 > AC lods byte ptr [esi]
004010F6 . 03D0 add edx, eax ; edx += eax 将序列号的 ascii 码相加
004010F8 .^ E2 FB loopd short 004010F5
004010FA . 3315 B4314000 xor edx, [4031B4] ; xor C:\序号 GetVolumeInformation
[4031B4] 哪里来的呢? 先在这个内存处下个硬件写断点
重新启动程序 发现 该内存 原来是用 GetVolumeInformation 获取 C:\ 的序号
00401100 . 52 push edx ; 保存 edx s
00401101 . 8D3D A6114000 lea edi, [4011A6]
00401107 . 68 2B314000 push 0040312B
0040110C . 68 80000000 push 80
00401111 . EB 05 jmp short 00401118
00401113 . 44 46 43 47 0>ascii "DFCG",0
00401118 > 83EF 04 sub edi, 4
0040111B . FFD7 call edi ; 获取当前目录
0040111D . 83E8 08 sub eax, 8 ; 目录值 - 8
00401120 . 8D90 2B314000 lea edx, [eax+40312B] ; 取当前目录的最后面8个字符
00401126 . 52 push edx
00401127 . E8 AC000000 call 004011D8 ; 将字符计算得到一个数字
0040112C . 5A pop edx
0040112D . 33C2 xor eax, edx ; 将值 xor s
0040112F 75 3B jnz short 0040116C ; 爆破点 s != 算出值 出错
再看看 00401127 . E8 AC000000 call 004011D8 是如何计算的
004011DE |. 8B7D 08 mov edi, [ebp+8] ; 后面八个字符
004011E1 |. 8B75 08 mov esi, [ebp+8]
004011E4 |> 8A07 /mov al, [edi]
004011E6 |. 47 |inc edi
004011E7 |. 0AC0 |or al, al
004011E9 |.^ 75 F9 \jnz short 004011E4 ; 有可能少于八个字符
004011EB |. 2BF7 sub esi, edi ; esi -= edi 取长度
004011ED |. 33DB xor ebx, ebx
004011EF |. 03FE add edi, esi ; edi += esi 还原edi重新指向字符串头
004011F1 |. 33D2 xor edx, edx
004011F3 |. F7D6 not esi ; not esi (esi 实际长度)
004011F5 |. EB 23 jmp short 0040121A
004011F7 |> 8A07 /mov al, [edi]
004011F9 |. 3C 41 |cmp al, 41 ; al < 41(A)
004011FB |. 72 0C |jb short 00401209
004011FD |. 2C 57 |sub al, 57 ; al - 57(W)
004011FF |. 80D2 00 |adc dl, 0
00401202 |. C0E2 05 |shl dl, 5
00401205 |. 02C2 |add al, dl ; al += dl(dl=0)
00401207 |. EB 02 |jmp short 0040120B
00401209 |> 2C 30 |sub al, 30
0040120B |> 8D4E FF |lea ecx, [esi-1]
0040120E |. 83E0 0F |and eax, 0F ; and 0F 取字节
00401211 |. C1E1 02 |shl ecx, 2
00401214 |. D3E0 |shl eax, cl
00401216 |. 03D8 |add ebx, eax
00401218 |. 47 |inc edi
00401219 |. 4E |dec esi
0040121A |> 0BF6 or esi, esi
0040121C |.^ 75 D9 \jnz short 004011F7
0040121E |. 8BC3 mov eax, ebx
---------------------------------------------------------------
1.将输入序列号的ascii码相加 再xor磁盘序号 得到 D1
2.获取软件目录的后八位字符 s 算出一个数 D2
D1 != D2 序列号无效
计算方法
先计算出 D2
function Calc(Value: string) : DWORD;
var
i,k : Integer;
p : DWORD;
begin
Result := 0;
for i := 1 to Length(Value) do
begin
if Value[i] < 'A' then
begin
p := Ord(Value[i]) - Ord('0');
end
else
begin
p := Ord(Value[i]) - Ord('W');
end;
k := Length(Value) - (i-1) - 1;
k := k shl 2;
p := p and $0F;
p := p shl k;
Result := Result + p;
end;
end;
然后 D2 xor 磁盘序号 得到 数字 D3
只要使生成的注册码ascii码的和 = D3 就可以了