本帖最后由 xiaoyu2032 于 2022-4-21 23:06 编辑
爆破: 爆破很简单,搜索关键字,找到关键跳转,je改jne即可。
也可以在在4085CE地址,将送如eax的数据地址由ebp-0x18改为ebp-0x1C;
爆破后运行结果如下:
追码: 利用特征码816C24找到按钮事件,F8跟踪,可以找到多处疑似注册码位置,最后一个才是,可利用keymake2.0制作内存注册机,中断地址00408501。
异常:注册码输入非数字符号,程序会异常退出。异常退出在004085D2,字符串转双精度浮点数,此处转换函数不允许输入非数字字符,否则会异常退出。
算法: 第一次尝试逆向算法,花了很长时间。 步骤1:计算输入的字符串长度,乘以88888(0x15b38),然后加上字符串首字母的ASCII码(rtcAnsiValueBstr等于函数 Asc(string),计算字符串首字母的ASCII码),然后转换成字符串;
步骤2:浮点计算10.0/5.0,得到结果2.0,将字符串转换成浮点数,然后加上2.0,最后转成字符串。
步骤3:将字符串转成成浮点数,然后乘以3.0,再减去2.0,最后转换成字符串;
步骤4: 将字符串转成成浮点数,然后减去-15.0,最后转换成字符串;
判断:计算码除以输入码,然后判断结果是否等于1.0.
注册码计算程序:
[C++] 纯文本查看 复制代码 #include "stdafx.h"
#include <Windows.h>
#include<stdio.h>
int main()
{
char str1[30];
printf("请输入字符串:");
scanf_s("%s",str1,30);
int a=strlen(str1);
long b=a*88888;
int k=str1[0];
b=b+k;
b=(b+2)*3-2+15;
printf("注册码为\n");
printf("%d \n",b);
system("pause");
return 0;
}
去除NGA:
用VBDecompiler反汇编后,可以得到窗口以及函数信息,其中SMSplash就是NGA窗口,查看属性可以发现其中有个定时器,其中有个7000的参数,就是等待7000ms。
7000换成16进制就是1B58,在代码区搜索58 1B(注意要反一下),可以找到406775,将其改为01 00,即为等待1ms。
还有一个方法就是4C法,详细可以看这篇个帖子https://www.52pojie.cn/thread-882601-1-1.html
此外,VB程序还可以用Form窗口的特征码来找,但是这里只能找到主程序窗口,NGA窗口的找不到,因此这里不能用。
=====================================
吐槽一下,论坛的编辑器的图文混编体验很糟糕啊,每次在编辑状态看起来都没问题的,提交后就发现好多地方图片没换行。再编辑加几个回车,结果发现有些改好了,有些没改好,再编辑,发现改好了的又变成不好了。。。。。。 |