首页
社区
课程
招聘
[原创]TX2017游戏安全知识竞赛第二轮第二题
发表于: 2017-7-28 10:50 8220

[原创]TX2017游戏安全知识竞赛第二轮第二题

loudy 活跃值
10
2017-7-28 10:50
8220

TX2017游戏安全知识竞赛第二轮第二题

 

一、整体轮廓

IDA载入,发现了TLSCreateThread反调试,直接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,故只要找到函数体位置,手工或者自动实现将操作码数值减去0x0f0xD0以上操作码不变),而操作数不变,即可还原。此处可以用IDA识别MSIL,依次手动修改操作码。

还原后,用Reflector载入,可以看到函数已经正确识别。

本人是对照IDA手工修改的。


可能是由于手工修改有差错,导致ConvertUIntToBytesEncryptDataFile两个函数没有反编译,但这两个函数比较简单,不影响分析。

二、主要算法

1ConvertBytesToUInt,将4字节转化为32位无符号整数。

2ConvertUIntToBytes,将32位无符号整数转化为4字节。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  orz1ruo   +2.00 2017/07/28
最新回复 (2)
雪    币: 73
活跃值: (319)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
感谢分享,虽然看的不太明白
2021-1-30 11:02
0
雪    币: 1258
活跃值: (598)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
GG有意思, 哈哈哈
2021-3-8 11:15
0
游客
登录 | 注册 方可回帖
返回
//