(160CrackMe)003_Afkayas.2
运行程序看看有什么功能。首先跳出一个window,然后过几秒钟才出来输入name/serial的窗口。
第二个窗口上面写着我们的任务,第一个去除nag,应该是说把第一个窗口给kill掉,第二个依旧是找注册码的任务。
首先来做注册码的任务吧~用OD打开,进到程序领空,搜索字符串,找到关键跳转。
依旧关键的注册算法应该就在附近,向上找呗,找到读取name的地方,开始的逻辑和002很像
再一步一步地往下跟,注意到有一些浮点操作,时刻关注寄存器,会发现在将之前算出来的十进制整数进行了一些浮点运算,运算并不集中,所以要耐心的跟下去。
但其实都是一些简单的加减乘除操作。来到最后的比较。
程序将用户输入的serial也转换为浮点数,之后和算出来的结果进行除法操作。如果结果是1,即两者相等,则验证成功。于是写得注册机 。
1 #include "bits/stdc++.h"
2 using namespace std;
3 int main(void){
4 string name;
5 cout<<"Please input your name"<<endl;
6 cin>>name;
7 cout<<"Serial:"<<(name.size()*0x15B38+name[0]+2)*3-2+15<<endl;
8 return 0;
9 }
接下来就是去除nag,由于是vb程序,尝试4C法,首先找到程序入口点,vb程序都是push和call组成。
在数据窗口中查看push的地址,找到vb头部。
接下来将该首地址+0x4c定位 。
看到内存地址406820处的数据是406868,定位到该处。
可以发现两个相似的数据块,每块50(十六进制)个字节的长度,每块数据的第24(十六进制)个字节处都有一个标志。该标志指定了每块代码出现的顺序。我们可以看到第一块的中标志是00,表示该部分代码将首先执行,而第二块中的01表示随后才会执行,所以这里我们将各两个标志的值颠倒一下。
这样首先弹出的就是主窗口了。然后才是NAG窗口,其实NAG窗口根本不会弹出来,因为主窗口关闭后,应用程序就退出了,NAG窗口就没有机会弹出来。