003/160 CrackMe Afkayas #2

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;
}

注册效果:
在这里插入图片描述

发布了32 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csg999/article/details/104050697