反作弊游戏如何破解,看看《黑色沙漠》逆向分析过程:使用 IDAPython 和 FLIRT 签名恢复 IAT

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
00000001419FB018  00007FFC8F3C2F60  advapi32.CryptAcquireContextWStub
00000001419FB020  00007FFC8F3C2F80  advapi32.RegQueryValueExAStub
00000001419FB028  00007FFC8F3C2EA0  advapi32.RegOpenKeyExAStub
00000001419FB030  00007FFC8F3C3320  advapi32.CryptAcquireContextAStub
00000001419FB038  00007FFC8F3C7140  advapi32.RegDeleteValueWStub
00000001419FB040  00007FFC8F3C2A10  advapi32.RegCreateKeyExWStub
...
...
00000001419FB308  00007FFC8FE40D30  kernel32.FindFirstFileA
00000001419FB310  00007FFC8FE40DA0  kernel32.FindNextFileA
00000001419FB318  00007FFC8FE3FB30  kernel32.MoveFileExW
00000001419FB320  00007FFC8FE41050  kernel32.RemoveDirectoryW
00000001419FB328  00007FFC8FE41080  kernel32.SetFileAttributesW
00000001419FB330  00007FFC8FE40E20  kernel32.GetDiskFreeSpaceExW
虽然有三列,但我们只对第一列和最后一列感兴趣。为什么?因为第二列仅包含每个函数的动态地址,所以在使用IDA静态逆向分析时我们并不在乎,因为这些模块的地址不在转储中。如果我们可以使用方法名称重命名每个指针名称,则IDA将自动从Windows API中识别大多数函数,并动态更新转储中的参数和类型。
为了自动执行此操作,IDA向我们提供了一个名为IDAPython的API。这样,我们可以编写一个小的脚本,该脚本基本上可以获取IAT的每一行,搜索转储中的每个内存地址,并使用方法的真实名称重命名函数名称。
结果如下所示:
import idaapi
import idautils
import idc
if __name__ == '__main__':
    file = open( 'IAT.txt', 'r')
    for line in file:
        columns = line.split('  ')
        address = columns[0]
        fnName = columns[2].replace('/r', '').replace('/n', '')
        if '.' in fnName:
            fnName = fnName.split('.')[1]
        print address   ' '   fnName
        idc.MakeNameEx(int(address, 16), fnName, idc.SN_NOWARN)
    file.close()
该脚本将遍历来自IAT的每一行,并将把每个内存地址的正确名称放在转储中。

修复了IAT在转储里面的问题,IDA将自动识别某些方法,并将适当的参数和函数信息添加到每个条目中。
你还记得有关反作弊初始化的图像吗?现在的情况是这样的:

现在我们已经向转储IAT导入了将近1000种方法,这些方法将在整个二进制文件中发挥作用。
FLIRT签名
我喜欢做的第二件事是使用快速的库标识和识别技术(FLIRT)签名,特别是对于简化的二进制文件。这允许IDA通过分析反汇编程序的每个字节来从二进制文件内的多个库中搜索函数,以便确定其是否对应于已知库函数的开头。
标识每个函数所需的这些信息存储在包含每个函数的所有模式的文件中,要在IDA中使用此函数,你只需要打开“签名”子视图并执行“右键单击->应用新签名”即可:

菜单选择要应用的签名,选择每个签名将取决于我们确定相关库的标准。应用它们之后,你将看到类似以下内容:

总结
在进行反向分析之前,花一些时间来解析和改进二进制文件中可用的信息确实非常重要,这对于那些难以逆向分析的程序(比如反作弊程序)来说是一个很好的开始。IDA有多个像ClassInformer这样的插件,这些插件使得逆向分析c++程序更加容易。
 

上一页  [1] [2]