-
-
[原创]TX2017游戏安全知识竞赛第二轮第二题
-
发表于:
2017-7-28 10:50
8220
-
TX2017游戏安全知识竞赛第二轮第二题
一、整体轮廓
IDA载入,发现了TLS和CreateThread反调试,直接nop掉即可。程序流程很清晰,但其中调用了mono生成的dll,且程序中自己实现了donet虚拟机(简单修改了msil指令集),导致dump出的encrypt.dll无法分析,也无法找出其中的函数。
二、encrypt.dll处理
找到关键位置,发现明显的PE文件特征,dump大小为0x1200。
该dll文件进行了人为修改,导致PE编辑工具无法识别。结合PE格式手工识别,容易发现下图红线处应该为0。
修改后PE编辑工具可识别,但其中的donet元数据识别不准确,元数据信息也被修改。
对照donet元数据格式,修改文件中下图标红出(自己生成一个donet的Dll文件,对照看更佳,本人就是用这种办法),第二条红线处改为‘s’,另外三条红线处清0(具体请参考doNet格式)。
对照修改,直到能识别所有元数据,修改完成后如下图所示。
此时可以用Reflector载入,但Refector只能识别类结构和函数名,却无法准确识别函数结构体,函数的实现看不到。实际上程序中用mono实现了一个本地.net运行时,经过分析发现,程序中实现的doNet虚拟机指令即在标准指令操作码的基础上加了0x0f,故只要找到函数体位置,手工或者自动实现将操作码数值减去0x0f(0xD0以上操作码不变),而操作数不变,即可还原。此处可以用IDA识别MSIL,依次手动修改操作码。
还原后,用Reflector载入,可以看到函数已经正确识别。
本人是对照IDA手工修改的。
可能是由于手工修改有差错,导致ConvertUIntToBytes和EncryptDataFile两个函数没有反编译,但这两个函数比较简单,不影响分析。
二、主要算法
(1)ConvertBytesToUInt,将4字节转化为32位无符号整数。
(2)ConvertUIntToBytes,将32位无符号整数转化为4字节。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)