第一部分
在libmono.so的mono_image_open_from_data_with_name
顺藤摸瓜找到 mono_image_open_from_data_with_name_0
把 mono_image_open_from_data_with_name_0第一条指令,改成无限循环(用winhex)
003DE1F8 F0 47 2D E9 --> FEFFFFEA
并在IDA中事先下好如上图中一样的断点,
然后运行游戏,用IDA挂在目标,
并按F9运行
之后打开断点列表,
双击断点,这样就能快速来到函数 mono_image_open_from_data_with_name_0处
来到 mono_image_open_from_data_with_name_0(003DE1F8 )第二条指令,无限循环处,,
在IDA中修改内存,
把mono_image_open_from_data_with_name_0第一条指令的无限循环 还原回去,
003DE1F8 FE FF FF EA --> F0 47 2D E9
之后,反复多次的按F9运行,
mono_image_open_from_data_with_name_0的第一个参数的r0,代表着目标buffer,第二个参数r1代表着buffer的大小
在第一次断点触发暂停后,程序停在了mono_image_open_from_data_with_name_0的第二条指令,跟人r0所指向的内存,如果是MZ开头的,
那么就不用关心本次解密,
如果不是MZ开头的,再按一下F9,程序会在第二个断点处断下,此时解密完成,
用ida脚本dump下来,即可
第二部分
dump下来之后还需要完成修复
其实就是IMAGE_DATA_DIRECTORY MetaData;
中的第一个字段lSignature结构不是'BSJB'造成的
-----------------------------------------------------------
快速定位:
把目标dll拖入LoadPE
记录下MetaData的数值
MetaData 0x001A7558 0x001C752C
0x001A7m
0x001C752C是MetaData结构的大小
点击“区段”记录下pe的区段信息
.text
00002000
0036CA84
00000200
0036CC00
发现MetaData在内存中的RVA(0x001A7558)落在.text段
根据.text段信息计算,MetaData数据在文件中的偏移: 001A7558-00002000+00000200=1A5758
用winhex打开目标dll
来到1A5758偏移处,修改数据为:'BSJB'
如下图
保存后,IDA已经识别。
|