本文作者:七少月
作者:七少月 Unity3d动态调式,一般而言可知,U3D最重要是dll,我们分两种情况: 一、DLL有加密壳: 动态调式其实最精髓的用法就是在静态分析不容易或无法静态分析时,也就是脱壳。现今,我认为有以下几种方法可以解决DLL被加密壳加密的情况: 1. 直接使用IDA反编译libmono.so,寻找关键函数处的解密代码,这样办法类似于静态分析,其实libmono.so中确实存在着DLL的加密和解密算法,但如果加密太难静态分析,还是要用动态调式这个so。如果so无法附加怎么办?就按照我给的解决办法,开两个IDA,一个下断,一个附加,具体可以自己实现; 2. 使用gdb附加,gcore,在core文件中寻找相关MZ头和尾巴original filename:assembly-csharp.dll,掐头去尾。标准的GDB动态调式,IDA中也有GDB调式的功能,也可以单独去使用GDB工具。 3. 对libmono.so的关键函数进行hook。JAVA可以HOOK,签名也可以HOOK,SO肯定也能HOOK。关键是借助libsubtrate.so或者subtrate这个HOOK工具; 4. 利用IDA对DLL进行动态脱壳。这和IDA动态脱SO壳类似,既然可以脱SO壳,肯定也能脱DLL壳,实际上,DLL脱壳还出现更早。只要把握住地址和大小,脱壳就可以成功,这里可以借助自动IDADUMP插件。如下图:
5. HOOK DLL,我们知道可以HOOK JAVA、SO、签名、函数等等,为何不能挂钩C#,勾住DLL,或者挂钩在调用该DLL之前的JAVA代码里,HOOK DLL应该可行,先写一个hook.dll,然后让APK调用这个hook.dll; 二、DLL没有加密,可以打开的动态下断调式 我们可以类比,假如你觉得一个函数是关键,可以用reflector插件对DLL添加上一句messagebox,当是下断,这也是一种很清晰的动态调式。
|