surge 发表于 2007-3-30 19:34:51

代码本地校验软件A Real Validator算法分析

软件没有加壳,明码比较,很容易找到关键处,

0040F970/$53            push    ebx                              ;算法CALL开始
0040F971|.55            push    ebp
0040F972|.56            push    esi
0040F973|.57            push    edi
0040F974|.BF 54C64100   mov   edi, 0041C654                  ;ASCII "@!SDVXFGUHbvnc908 *&)5 fjd095j90kcf ja%JKeSFAKDJSLJgJDF 2k34lsdjfkldjf jdsklfjadskgl;jafdkl;gjasdkl;r568r;jvggfl;kd4ui12098vlkjfdlk;sfjgklfdgjlejt03456erjgrj"
0040F979|.83C9 FF       or      ecx, FFFFFFFF
0040F97C|.33C0          xor   eax, eax
0040F97E|.F2:AE         repne   scas byte ptr es:
0040F980|.F7D1          not   ecx
0040F982|.49            dec   ecx
0040F983|.8BF8          mov   edi, eax
0040F985|.8BF0          mov   esi, eax
0040F987|.74 26         je      short 0040F9AF
0040F989|.8D99 53C64100 lea   ebx,
0040F98F|>0FBE86 54C641>/movsx   eax, byte ptr       ;取密串中的开始一个字符
0040F996|.0FBE13      |movsx   edx, byte ptr              ;取密串结尾一个字符
0040F999|.0FAFC2      |imul    eax, edx                        ;两个相乘放EAX
0040F99C|.03C7          |add   eax, edi                        ;加上EDI
0040F99E|.33D2          |xor   edx, edx                        ;EDX清零,准备放/结果
0040F9A0|.BF 00286BEE   |mov   edi, EE6B2800                   ;EDI赋值ee6b2800
0040F9A5|.F7F7          |div   edi                           ;eax/edi,改变edx
0040F9A7|.46            |inc   esi                           ;向前移动开始指针指向下一个
0040F9A8|.4B            |dec   ebx                           ;向后移动结尾指针,指向上一个
0040F9A9|.3BF1          |cmp   esi, ecx                        ;比较是否移动完
0040F9AB|.8BFA          |mov   edi, edx                        ;edi保存最终计算结果
0040F9AD|.^ 72 E0         \jb      short 0040F98F                  ;edi==0011C198
0040F9AF|>8B4424 14   mov   eax,
0040F9B3|.33F6          xor   esi, esi
0040F9B5|.8B18          mov   ebx,                      ;用户名地址放ebx
0040F9B7|.8B6B F8       mov   ebp,                      ;用户名长度放ebp
0040F9BA|.85ED          test    ebp, ebp                         ;测试是否输入了用户名
0040F9BC|.7E 26         jle   short 0040F9E4
0040F9BE|>8BC6          /mov   eax, esi
0040F9C0|.33D2          |xor   edx, edx
0040F9C2|.F7F1          |div   ecx                           ;ecx是上面加密串的长度
0040F9C4|.0FBE82 54C641>|movsx   eax, byte ptr       ;取加密串开始的一个字符到eax
0040F9CB|.0FBE1433      |movsx   edx, byte ptr          ;取用户名的一个字符到edx
0040F9CF|.0FAFC2      |imul    eax, edx                        ;两个相乘放eax
0040F9D2|.03C7          |add   eax, edi                        ;eax再加上上面循环计算的结果
0040F9D4|.33D2          |xor   edx, edx                        ;清除edx
0040F9D6|.BF 00286BEE   |mov   edi, EE6B2800
0040F9DB|.F7F7          |div   edi                           ;除Edi结果在edx:eax
0040F9DD|.46            |inc   esi
0040F9DE|.3BF5          |cmp   esi, ebp                        ;和用户名长度比较
0040F9E0|.8BFA          |mov   edi, edx                        ;edi放最张结果
0040F9E2|.^ 7C DA         \jl      short 0040F9BE
0040F9E4|>8BC7          mov   eax, edi                         ;edi是最后结果,通过EAX返回
0040F9E6|.5F            pop   edi
0040F9E7|.5E            pop   esi
0040F9E8|.5D            pop   ebp
0040F9E9|.5B            pop   ebx
0040F9EA\.C3            retn



/****
* 代码本地校验软件A Real Validator
*http://arealvalidator.com/download/arv112.msi
    * 软件名称:A Real Validator
    * 开发者主页:www.arealvalidator.com
    * 软件大小:2.28MB
    * 安装环境:Microsoft Windows 95/98/Me/NT4/2000/xp ;IE 4.0 以上浏览器
    * 版本:1.12(30天试用版)
* 软件说明
* 我们在制作符合web标准网站的过程中,
* 总要不断的到W3C网站来校验自己制作的页面是否符合XHTML 1.0,这样比较麻烦。
* A Real Validator就是一款本地校验软件,允许你在本机直接校验页面而不需要再联网校验,
* 它校验的结果与W3C完全一致。
*/
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char * about = "\
***************************************\n\
A Real Validator V1.12\n\
代码本地校验软件注册机\n\
作者: surge\n\
***************************************\n";
char * key = "@!SDVXFGUHbvnc908 *&)5 fjd095j90kcf ja%JKeSFAKDJSLJgJDF 2k34lsdjfkldjf jdsklfjadskgl;jafdkl;gjasdkl;r568r;jvggfl;kd4ui12098vlkjfdlk;sfjgklfdgjlejt03456erjgrj";
int i=0;
int j=0;
int num=0;
int k=0;
int z=0;
char username;

printf(about);
memset(username,0,sizeof(username));
printf("输入用户名:");
gets(username);
num =strlen(key)-1;
for(i=0,j=num; i<=num; i++,j--){
    z = (key*key)+k;
    k = 0xee6b2800;
    k = z%k;
}
for(i=0; i<strlen(username); i++){
    z = key*username+k;
    k = 0xee6b2800;
    k = z%k;
}
printf("注册码是: %d\n",k);
getchar();
return 0;
}

surge 发表于 2007-3-30 19:39:08

Windows Registry Editor Version 5.00


"Name"="surge"
"RegKey"=dword:0012cf3f

wan 发表于 2007-3-31 10:08:26

喜欢这类文章,支持!

hjwenhai 发表于 2007-12-26 08:21:57

厉害,学习了。
我是新手,感谢你的文章。

dzswvip 发表于 2010-5-29 02:28:10

本帖最后由 dzswvip 于 2010-5-29 02:30 编辑

真牛 中国有你 我什么时候才可以有浏览权限呀

fghtiger 发表于 2010-5-29 10:12:38

不错,学习了。。。
页: [1]
查看完整版本: 代码本地校验软件A Real Validator算法分析