(160CrackMe)003_Afkayas.2

(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窗口就没有机会弹出来。

猜你喜欢

转载自blog.csdn.net/github_36788573/article/details/79911264