013-Acid burn 的 write up
我是原站作者
1. 程序的执行
打开程序首先出现的是烦人的NAG弹窗:
然后有金典的两种注册方式:
一种是serial/nam形式:
还一种就是serial模式:
以上都是不成功的提示。出现了很多的提示字符串。
2. 查壳
无壳
3. 分析
-
首先我们先来破解这个烦人的Nag弹窗,首先将软件拖入OD,然后借助插件插件智能搜索字符串,找到Nag弹框的提示字符串,然后就可以跟踪进入如下图:在这个函数体内的头部下断点,运行到这来停下:
然后看到堆栈,在栈顶右键——>反汇编窗口中跟随
这样就可以来到调用这个函数call的地方,如下图:
如果要破解的话,我们可以直接修改cmp需要对比的立即数,也可以修改je跳转。还有一种方式就是在函数内部的头处直接retn出来,也就是函数刚执行就retn了。
然后在汇编代码区选中刚才更改的指令,右键——>复制到可执行文件,然后再右键——>保存文件,就可以获得一个没有Nag弹框的可执行程序。
-
分析第一种验证方式,serial模式,首先将程序组拖入32位IDA,然后查找字符串,跟踪第一个Try Again!!,如下图:
然后就可以看到很多的字符串,如下图:
我们可以随便跟踪一个就来到了函数体部分,通过分析得出注册码是Hello Dude! 如下图:
3 . 分析第二种验证方式,serial/name模式。这次具有算法,我们在OD中跟踪分析,首先跟踪第二个Try Again!!字符串,然后就来到了函数的主体部分如下图:
然后就是很多的拼接字符串和对比字符串,如下图:
观察堆栈如下图:
可以知道,字符串serial拼接的规则是CW-数字-CRACKED
数字的计算规则是:取用户名的第一个字符,乘以0x29,再乘以2,最后将得到的十六进制数转化为十进制数。
4. 注册机的编写
#include<stdio.h>
#include<string.h>
int main()
{
static char name[] = { 0 };
static char str2[] = { 0 };
int length = 0;
int key = 0;
char serial[100] = { 0 };
char str1[] = "CW-";
char str3[] = "-CRACKED";
loop:
printf("Please input you name: ");
scanf("%s", name);
length = strlen(name);
if (length<4)
{
printf("The user name must be four characters greater than or equal to it!\n");
goto loop;
}
key = name[0] * 0x29 * 2;
printf("key=:%d\ninput key:",key);
scanf("%s", str2);
strcat(serial , str1);
strcat(serial, str2);
strcat(serial, str3);
printf("serial= %s\n",serial);
system("pause");
return 0;
}
执行效果演示: