Windows逆向(四)逆向AfKayAs【*】

实例来自于“吾爱破解”网站《160个CrackMe》系列,与(三)中的例子相比多了KeyGen的编写,也就是要求对加密算法进行逆向。

老规矩,先根据错误提示找定位关键点。

断点调试一次,确认是此处,向上查找跳转点。

明显地,jmp以下到最后一个call是错误调用的提示框,在4025e5处查找地址引用,只有一处:

这个je明显就是跳转验证的,修改为jne即可通过校验。

提示KeyGen。

那么就需要对加密算法进行梳理了,查看堆栈,没看到明显的调用层级,代码继续往上看,发现明显的一些字符串操作,包括比较、释放等过程。

而且明显地,该过程大部分都是通过msvbm50库进行处理的,通过分析和右侧注释提示,可以在该库最开始引用处开始下断点,一步步往下调试,进行代码分析。

当不太熟悉汇编时,不容易分析出函数功能,此时可以直接向下一直单步调试,直到寄存器中出现自己输入的名称类字样的时候,再结合上下文进行分析。

比如说我输入的是“test”:

由此步开始,逐步分析汇编操作,同时也可以借助右侧注释直接查阅相关函数功能进行辅助梳理:

1)取输入名称长度:

2)长度乘以固定值0x17cfb:

3)取输入名称首字母ASCLL码:

4)数值转字符串:

5)字符串拼接:

6)比较:

得到整体伪代码:

string name = inputname();
string serial = inputserial();
int namelen = sizeof(name);
int a1 = namelen * 0x17cfb;
int nameAsc = asc(name);
al += nameAsc;
string serialDst = tostring(a1);
serialDst = “AKA-” + serialDst;

简单的注册机源码(C++):


#include <iostream>
#include <string>

int main()
{
    unsigned int cc = 0x17cfb;


    std::string name;
    std::cout << "input name:\n";
    std::cin >> name ;
    int len = name.length();
    int ulTmp = len * cc;
    ulTmp += name.c_str()[0];


    std::string serial = "AKA-";
    serial += std::to_string(ulTmp);

    std::cout << serial;
}

目标达成。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注