012-ACG-crcme1 的 write up
- 程序执行加查壳
输入name和注册码,然后弹出错误信息,视为关键提示字符串,Info查看软件相关信息。无壳。
2. 分析
拖入OD,然后搜索字符串如下图:
跟踪进去如下图:
显然,第一个提示框应该就是成功提示框了,在他之前的跳转一定就是关键跳转。
然后我们看如下的关键函数部分了:
解释:第一个GetDlgItemTextA是获取输入的name长度到eax,内容保存到00402106,第二个是读取输入的注册码内容存入0040212E。然后就是有关name的计算处理。
还有有关注册码的计算方式如下图:
但是后面我发现,前面的分析好像错了,主要是我猜错了成功提示。主要还是看到info,有关文件的信息,如下图:
解释:可以看到有很多的乱码,所以这并不是一格正规的英文程序,所以包括我前面找的字符串也是很多乱码,并不正确。在这里我们还是能看到有一个关键的提示“KEY-FILE”
而且在退出程序的时候出现烦人的NAG,这个就是很多收费软件都会有的弹窗,如下图:所以接下来我们先来学习如何破解NAG:
首先在OD中智能搜索字符串如下图,选择最后一个跟踪:
下断点后只执行到这,如下图:
!
image-20221015151203987
在堆栈中右键——>反汇编窗口中跟随:
然后我们就可以看到他调用函数得地方:
最后我们要破解这个弹窗不让他显示的话就可以修改cmp对比的数字,或者jnz指令。
后面我们在来进行算法的分析
IDA查找字符串如下图:
解释:我们可以在最下面看到一个类似key文件的文件名。跟踪
然后就可以看到关键的算法如下:
解释:从40106E开始后面都是注册码区文件内容的单个字符的异或运算了。rol为左移运算
最后异或的结果要等于0,否则就会跳转。
然后依次得到12个密钥是:【0x168,0x160,0x170,0x0EC,0x13C,0x1CC,0x1F8,0x0EC,0x164,0x1F8,0x1A0,0x1BC】
3. 注册机的编写
#include <stdio.h> #include <string.h> int main() { int serial[12] = { 0 }; int arr[12] = {0x168,0x160,0x170,0x0EC,0x13C,0x1CC,0x1F8,0x0EC,0x164,0x1F8,0x1A0,0x1BC }; char key[13] = { 0 }; for (int i = 0; i < 12; i++) { serial[i] = arr[i] ^ 0; serial[i] >>= 2; serial[i] = serial[i] ^ 0x1B; key[i] = serial[i]; } printf("serial: %s\n",key); system("pause"); }