破解练习-CRACKME003
003-去掉nag
和注册算法分析
一、工具和调试环境
- 动态调试工具:
x64dbg
- 系统环境:
win10 1909
二、去掉nag
程序运行先会出现一个nag
窗口,如下图所示。几秒之后才会出现真正的交互界面
要去掉这个nag
窗口,首先想到的是找到其创建nag
窗口的位置,然后使其不执行就可以了,给创建窗口的API
(CreateWindowExA
和CreateWindowExW
)下断点,然后通过栈回溯找到创建nag
窗口的位置,直接跳过此处创建窗口后面会报错说类不存在。
此时要么仔细分析是哪里导致的报错,或者继续向上回溯,找到一个跳过能正常接着运行的位置。如下图所示
经过反复测试验证,只要第一次不执行msvbvm50.740E6DB8
函数就行,该函数有两个参数,所以需要跳过0x740E8F8D - 0x740E8F93
三条指令。现在nag
弹窗是没有了,可是还是要等待几秒之后才会出现交互界面。
那么下面就是去掉等待时间,依旧是给API
下断点,SetTimer
下断点,然后栈回溯定位到其超时值(也就是定时器设定的触发时间)。
最终定位到来自于0x224A66C + 0xC0
的位置,而0x224A66C
是堆空间,所以需要继续跟踪,给0x224A72C
下一个硬件写入断点
最后定位到上图的位置0x7410BFC8
处edi
就是超时值,可以看出edi
是传进来的第三个参数,继续向上追溯,最终定位到超时值是存放在0x00406775
处
直接将此处修改为0x1
然后打补丁即可。
到此就搞一段落,没有达到原本想的直接打补丁跳过创建nag
窗口。后面在网上搜到了C4
大法,原来还可以通过修改启动顺序来跳过。C4
大法就不说了,链接奉上
逆向破解之160个CrackMe —— 003 - 自己的小白 - 博客园 (cnblogs.com)
003-学习要学“张无忌” 装X可选“鸠摩智”(模拟初遇VB反汇编来钻研4C法) --重在逆向思维 (qq.com)
三、分析Serial/name
的算法
这次就不能使用默认提示字符串验证了,会报错。随便输入一对name和Serial
(Serial
必须是数字,否则就会报错)
老套路,x64dbg
重新加载,搜索字符串Try Again
定位到关键点,然后不断回溯找到算法位置,下面是算法的部分
第一部分,获取name
长度,其结果乘以0x15B38
再加上name
第一个字符的ascii
码值
第二部分,double
运算,第一部分的结果 + 2.0
第三部分,依然是double
运算,第二部分的结果乘以3.0
,然后结果减去2.0
第四部分,依然是double
运算,第三部分的结果加上15.0
第五部分,依然是double
运算,第四部分的结果除以Serial
等于1.0
就成功,也就是第四部分的结果就是正确的Serial
,因为会使用__vbaR8Str
转换Serial
,所以Serial
只能输入数字,否则会导致报错。
最后,总结的算法就是:(strlen(name) * 0x15B38 + name[0] + 2.0) * 3.0 - 2.0 + 15.0
四、算法核心代码模拟
char* GetSerial3(char* szName)
{
static char szSerial[60] = {};
int key = (strlen(szName) * 0x15B38 + szName[0] + 2.0) * 3.0 + 13.0;
sprintf(szSerial, "%d", key);
return szSerial;
}