3 | Afkayas | ★★ | Nag,Name/Serial(VB5) |
VB程序逆向反汇编常见的函数http://www.cnblogs.com/bbdxf/p/3780187.html
VB程序逆向反汇编常见的函数(下断用)http://blog.sina.com.cn/s/blog_80deaf0c0102vnxr.html
查壳无壳
程序的nag,说实话,挺丑的
1.去nag
刚才提到这个crackme是VB写的,破解这个nag我想了挺久的,后来在吾爱破解找到了资源,有教程已经总结了如何破解VB程序的nag窗口,链接: https://pa n.baidu.com/s/1mkqYZt2 密码: q9e7
在窗口定位到入口处push的地址,可以看到字符串VB5,应该是VB5写的
教程用到的方法叫4C法,重新定位到004067D4+4C,可以看到一个地址,再重新定位到新的地址00406868
可以看到有两块数据很像,根据教程将黄色圈的数字交换一下,在保存数据,打开保存的exe没有弹出nag窗口了,根据教程的说法是将主程序和nag窗口弹出的顺讯交换了,所以先显示主程序,而一关闭主程序,应用程序就退出了,nag窗口根本没机会显示
(有时间我会自己尝试一下破解nag窗口)
2.name/serial
name/serial的破解方法和Afkayas1很像,我这里就不赘述了,稍微提一下不同的地方。首先是尝试输入name和serial时,发现使用默认值会弹出不一样的报错窗口
尝试其他的输入发现,serial只能输入数字和部分字符,所以只要把serial改成数字就可以用Afkayas1的破解手法来做了,这里附上链接http://blog.csdn.net/abc_670/article/details/79221079
下面说下不一样的地方,乘以的数字不一样了
这个跟Afkayas1不一样的地方就是多了浮点运算,我还是第一次接触浮点运算指令,如果解释不当的地方还请见谅,转载一篇讲浮点指令的博客,不懂的可以看他的,汇编语言浮点数指令集http://blog.csdn.net/whatday/article/details/7219014
下面这个是进行第二次计算的过程,
里面还涉及到标志寄存器,FSTSW ax,将状态寄存器赋值给ax。状态寄存器是只读的,因此与它有关的指令只有一条(但有同步和不同步两个版本,参见8.3节),即FSTSW。这条指令将状态寄存器中的内容传送至AX寄存器,位次序不变。由于状态寄存器共16位,因此正好填满AX。通过检测AX的对应位,即可得到状态控制器的相关信息
test eax, 100b; b后缀意为二进制
jnz ******; 如果eax右数第三个位为1,jnz将会跳转
jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.
下面是第三次计算的过程,
第四次计算过程,
到这里,注册算法已经知道了,写的注册机如下:
#include <iostream>
using namespace std;
int main()
{
cout<< "please input your name:";
string name;
getline(cin,name);
int x = name.length() * 0x15B38 + name[0];
float num[20];
int i=0;
while(x != 0)
{
num[i] = x%10;
x /= 10;
i++;
}
int m = i-1;
int Num = 0;
for(i = m; i >= 0; i--)
{
Num = Num * 10 + num[i];
}
Num = (Num + 2) * 3 - 2 + 15;
cout << "serial:" << Num << endl;
return 0;
}
破解成功!!!!
再看一下它的验证算法,也是用了浮点数运算,用我们输入的serial除以正确的serial,如果比值为1,则表示serial是正确的,紧跟着就是条件跳转,通过改变esi的值来做一个桥梁,让后面可以通过esi的值来选择是正确还是错误,这个比较隐蔽,跟上次那个一样!也可以利用这一点爆破