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; }
执行效果演示: