-
-
[原创]c32asm注册分析
-
发表于:
2019-12-19 17:42
8407
-
https://bbs.pediy.com/thread-128926.htm
一开始拿到很常规的思路,找注册成功或失败的提升字符串。字符串可以在0x4e2780这个函数中找到,这个函数也就是消息的处理函数。接下来就是跟踪收到的注册结果的消息,可以发现消息是在0x4e2cb0中利用PostMessage发送的。继续跟踪PostMessage的调用栈,就会进入4e3a00这个“巨无霸”函数。
0x4e3a00是分析的重头戏。一开始简单看了一下它的执行逻辑,有许多位操作,怀疑可能是mfc生成的对消息、事件的解析处理模块。于是开始尝试其它思路,比如找有意义的函数名,找常见的字符串比较函数,找加密函数,这些都没有成功。
后来发现有人用ResourceHacker来分析MFC程序的资源,于是也拿来用一下。果然发现了一下有价值的东西,0x4e3a00这个函数执行的流程由程序中包含的二进制资源决定。二进制资源好像一种特殊的机器语言,由0x4e3a00函数解析执行。由此可以确定这个巨大的函数是由作者编写,不是编译器生成。也就可以放心分析,虽然很大,逻辑很复杂。这个函数由一个循环组成,相比它整体的复杂,一次循环的执行流程并不复杂。每次循环读入一个两字节的“指令”,这些指令可能会有紧随其后的操作数,一般也是两字节。
过了一段时间后,开始尝试从输入的用户名,序列号字符串入手。在这两个字符串上下内存读断点。用户名字符串的每个字符被多次访问,没办法识别到有意义的行为。开始分析序列号的字符串,要判断输入的字符串是否正确,就一定会由字符串的比较。在分析访问序列号的字符串的过程中,在0x664f06发现了一个可打印的字符,有感觉它可能会有问题,就拿去试了一下。果然把这个位置的字符放在序列号的第一个字符的位置,就可以发生输入的序列号字符串第二个字符的访问。然后就这样在输入的序列号字符串每个字符上依次下断,就可以得到用户名对应的序列号。由此可以得出正确的序列号是一个一个生成的(或者保存在某个我还不知道的位置),当前字符正确了才会进行下一次比较,否则就会退出比较。
在分析的过程中得出一些“指令”:0x4b7f把输入的序列号字符串中的一个字符拷贝到0x664f08;0x9e4f把0x664f06的字符同0x664f08的字符进行比较,比较的流程没有使用简单的比较指令,而是把其中一个取反,然后两个数作和,判断是否发生进位且低位为零(描述的可能不严谨,详见代码0x4e6340),相应的把0x664eee置位;0x2403根据0x664eee中各个位的情况决定是“跳转”。
接下来就是定位0x664f06位置的字符是如何生成的。通过网上公布的序列号生成算法可以看到序列号生成使用了sha1算法,这也能通过结果的固定长度推断出,这说明正确结果一定是一起出来的。
通过查看0x664f06位置字符的生成过程,可以看到是指令为0x507e时0x664f06的值加0x37(0x507e的操作数)。
未完待续
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)