[160CrackMe]Afkayas.1
作者:互联网
是个VB写的程序,输入错误的时候会显示You Get Wrong. Try Again
OD中打开,字符串没有被隐藏,双击跟踪you get it
双击跟踪之后向上翻,有个jge
条件跳转(ZF=1
),上面那个test
修改标志位,说明si
里面的值是关键,si
里面的值不能是0
。
向上翻,看看esi里面的值被修改的地方,找到几处,发现了一个_vbaStrCmp
字符串比较函数,返回值放到esi
里面,然后先用neg
取相反数,然后自增,再取相反数。
继续向上翻,对VB
的API
不是很熟悉,没找到文本框输入函数在哪里,直接下断点调试了。
输入测试数据之后让程序断在如下所示的位置(多次调试可以发现输入文本在此处第一次开始被处理),接着看看它做了什么,
用_vbaLenBstr
函数获取了输入的用户名的长度,然后把这个长度乘上了常数0x17CFB
,然后加上第一个字符的ASCII值,这个ASCII值是用的rtcAnsiValueBstr
得到的。
加好后数据转成对应字符(例如 1
→
\rightarrow
→’1’)。
紧接着是一些无关紧要的实例化对象,释放内存等等,直到下图所示的地方,"AKA-"
跟那个字符串拼接成了一个新的字符,与我们输入的序列号用_vbaStrCmp
函数做对比。
分析结束,可以写注册机了
#define _CRT_SECURE_NO_WARNINGS
#include<string>
#include<iostream>
using namespace std;
int main()
{
int temp;
string name;
cout << "请输入你的用户名:";
cin>>name;
temp = name.size()*0x17CFB+name[0];
cout<<"your serial is \"AKA-"<<temp<<"\""<<endl;
return 0;
}
验证一下
标签:Afkayas.1,字符,name,160CrackMe,字符串,相反数,输入,函数 来源: https://blog.csdn.net/m0_46296905/article/details/118709772