004012F3 /$ 90 nop ; 关键的注册函数
004012F4 |. 8B0D 89234000 mov ecx, dword ptr [402389] ; 402389存放name串的长度
004012FA |. 85C9 test ecx, ecx
004012FC |. 74 71 je short 0040136F ; 长度是0,失败!
004012FE |. 49 dec ecx
004012FF |. 8BF1 mov esi, ecx ; length-1送入esi,esi是最后一个字符的下标
00401301 |. BF 53234000 mov edi, 00402353
00401306 |. BB 4E4D4144 mov ebx, 44414D4E ; 初始化ebx为44414D4E
0040130B |. 33D2 xor edx, edx
0040130D |. 8BCA mov ecx, edx ; 这两步清零ecx,edx
0040130F |> 33C0 /xor eax, eax ; 这里开始遍历name串,先清零eax
00401311 |. 8A040F |mov al, byte ptr [edi+ecx] ; 当前字符送入al
00401314 |. 03D0 |add edx, eax ; 累加到edx(从这里可以看出edx是计算所有字符的ASIC码之和)
00401316 |. D1CB |ror ebx, 1
00401318 |. D3CB |ror ebx, cl ; ebx循环右移,再右移
0040131A |. 33DA |xor ebx, edx ; 然后,与edx异或
0040131C |. 3BCE |cmp ecx, esi ; 是否是最后一个字符?
0040131E |. 74 03 |je short 00401323 ; 是,遍历结束
00401320 |. 41 |inc ecx ; 不是,下一个字符
00401321 |.^ EB EC \jmp short 0040130F
00401323 |> 81CB 10101010 or ebx, 10101010 ; 遍历结束后,ebx与10101010或运算
00401329 |. 87DA xchg edx, ebx ; 交换ebx,edx。edx存着一个关键的值用于校验Key
0040132B |. BF 21234000 mov edi, 00402321
00401330 |. 8B0D 8D234000 mov ecx, dword ptr [40238D] ; Key串长度送入ecx
00401336 |. 83F9 08 cmp ecx, 8
00401339 |. 75 34 jnz short 0040136F ; 这两步可以看出Key长度必须是8,否则失败!
0040133B |. 33C9 xor ecx, ecx ; 清零ecx
0040133D |> 33C0 /xor eax, eax ; 又是一个循环,校验Key值
0040133F |. C1C2 08 |rol edx, 8 ; edx循环右移8位(为什么是8位?这样edx的高8位到了低8位,即dl中)
00401342 |. 8AC2 |mov al, dl
00401344 |. 8AD8 |mov bl, al ; dl值存入al,bl
00401346 |. 24 0F |and al, 0F ; 这一步al保存dl的低4位
00401348 |. C0EB 04 |shr bl, 4
0040134B |. 80E3 0F |and bl, 0F ; 这两步,bl保存dl的高4位
0040134E |. 3C 0A |cmp al, 0A
00401350 |. 1C 69 |sbb al, 69
00401352 |. 2F |das ; 这三步就是把数值转换为字符,说白了就是01h=>'1',0Ah=>'A'
00401353 |. 38444F 01 |cmp byte ptr [edi+ecx*2+1], al ; Key[1,3,5]必须等于al转换后的字符,也就是原来edx的每隔8位的后4位
00401357 |. 75 16 |jnz short 0040136F ; 不等则完蛋!
00401359 |. 8AC3 |mov al, bl
0040135B |. 3C 0A |cmp al, 0A
0040135D |. 1C 69 |sbb al, 69
0040135F |. 2F |das ; 同样的,数值转换为字符。
00401360 |. 38044F |cmp byte ptr [edi+ecx*2], al ; Key[0,2,4,6]必须等于bl转换后的字符,也就是edx的每隔8位的前4位
00401363 |. 75 0A |jnz short 0040136F ; 不等则完蛋!
00401365 |. 41 |inc ecx ; ecx自增
00401366 |. 83F9 04 |cmp ecx, 4
00401369 |.^ 75 D2 \jnz short 0040133D ; ecx等于4结束循环,一次比较两个,正好4次
0040136B |. 33C0 xor eax, eax ; 总结一下,校验的过程其实就是把原来edx的值转成十六进制的字符串,也就是说如果edx=7653ED5A,Key串就是“7653ED5A”
0040136D |. 40 inc eax ; 返回1,用于EnableWindow(TRUE)
0040136E |. C3 retn
0040136F |> 33C0 xor eax, eax
00401371 \. C3 retn
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课