Nag
启动的窗口去除很简单
在 VBExplorer 里把 Timer1 的 Interval 改成1就可以了
KeyGen
涉及到一些 VB 函数
__vbar8Str
将一个字符串转为双精度单精度浮点型(8个字节)的数值形式
还有一些浮点相关的汇编语句:
fld dword ptr ds:[0x401008]
将[0x401008]的值以浮点型放进ST0里面fdiv dword ptr ds:[0x40100C]
ST0中的浮点数除以[0x40100C]的值fstsw
(store status register) 把状态寄存器取出并存入内存变量中fstp qword ptr ss:[esp]
将ST0里面的浮点值,放到esp指向的堆栈里面,同时清空ST0
分析过程:
依然是搜索字符串下断点,单步分析,过程比较长,分多步进行计算
第一步计算方法和 002 Afkayas #1 一模一样
只不过把数换成了 0x15B38 而已
第二步:
第三步:
第四步:
四步运算之后就可以得到注册码了
总结一下:
注册码为:(用户名长度*0x15B38+用户名第一个字符的ASCII码值)整体+2,得到的结果*3,再减去2,最后加上15
C语言注册机:
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char username[200];
int u1,u0;
int id;
scanf("%s",username);
//第一步
id=0x15B38*strlen(username);
id+=username[0];
//第二步
id+=2;
//第三步
id*=3;
id-=2;
//第四步
id+=15;
printf("%d",id);
return 0;
}
注册效果:
中文处理方式同 Afkayas #1
C语言中文注册机:
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char username[200];
int u1,u0;
int id;
scanf("%s",username);
//第一步
id=0x15B38*(strlen(username)/2);
id+=(0xFFFF<<16)+(username[0]<<8)+username[1];
//第二步
id+=2;
//第三步
id*=3;
id-=2;
//第四步
id+=15;
printf("%d",id);
return 0;
}
注册效果: