记一次FGO逆向过程 chapter2
本帖最后由 ss22219 于 2018-3-5 16:44 编辑接下来是java调试环境的设置
首先下载Android Studio启动后下载sdk,之前我有一个旧的sdk,用着没什么问题,所以就不覆盖重新选一个目录安装
下载smailidea
具体操作http://blog.csdn.net/linchaolong/article/details/51146492
需要说明的是 baksmali 使用的是java1.8才能运行
在生成的smali项目中直接搜索LoadLibrary
分析了一下,发现只有一处LoadLibrary调用
Lcom/unity3d/player/UnityPlayer;->loadLibraryStatic
加载libmain.so ->
分析了一下libmain.so中 JNI_Onload 给com.unity3d.player.NativeLoader 提供了so加载的native实现
com.unity3d.player.NativeLoader.load实际上就是Unity3d引擎的加载
在com.unity3d.player.NativeLoader.load实现代码中看到了libmono和libunity的加载
在这里下断点,跟进
sub_78B08350实际上就是dlopen的过程
在dlopen中下断点
运行
adb shell am start -Dcom.bilibili.fatego/jp.delightworks.Fgo.player.AndroidPlugin
Android Studio中在loadLibraryStatic处下断点
现在,我在java层加载so前下了断点,触发java层断点后附加ida进行native层调试
这个时候so还没执行,可以跟踪到so的加载过程
Android Studio远程调试附加到8700端口
这个时候就马上命中java断点了
然后打开ida,远程附加到游戏进程
然后ida中让游戏继续运行,切换回到AndroidStudio,让游戏继续运行
这个时候命中了我们ida中dlopen的断点
然后eax就是soinfo的返回值
这篇文章讲述了如何从一个dlopen返回值中dump so的数据
https://bbs.pediy.com/thread-194053.htm
但是没给出源码
================================================
一些libmono的分析与猜测
ida中按下shift+f7,找到init_array段,点开发现有好几个函数地址
跟踪第三个地址发现是解密so的方法,方法体有点复杂,看得有点头晕
JNI_load中并没有解密操作,所以dlopen后即可获取到正确的导入导出表
然后找到mono_image_open_from_data_with_name方法即可获取到dll解密算法
=================================================
尝试了udog还原elf plt表,但是效果不行,自己编写了一个程序加载libmono.so,使用dlsym获取不到函数地址
但是没加壳的libunity却能正确获取导入地址?
于是换个思路,既然libunity已经成功获取到了函数地址,那么直接跟踪调用不就可以了吗
打开游戏,这次正常打开,不附加java调速器运行
因为libmono中有反调试处理,还没执行到mono_image_open_from_data_with_name就退出了
所以直接等游戏运行加载画面出来后再用ida附加
用ida打开libunity,附加游戏
右击分析libmono,ida会根据libunity的导入来找到对应的函数地址
找到_mono_image_open_from_data_with_name的调用
跟踪到_mono_image_open_from_data_with_name
发现只有一条jmp指令,查看引用
发现这个地址也不正确,不过意外解析出来了mono_image_close的地址
事情就好办了
找到阅读mono源码,发现mono_image_close位于mono_image_open_from_data_with_name下面,猜想编译也会编译到下面
往上翻,发现一条字符串
Bad call to mono_mutex_unlock result
运气不错,可以对照源码了
找到这个字符串定义在LeaveCriticalSection宏中
看到register_image方法使用了两次这个宏,一下子就找到了register_image方法位置
看到register_image有两个引用,应该是比较近那个,导航过去,果然是mono_image_open_from_data_with_name
这个章节费了不少时间,但总算达到预期效果
休息一下,还有后续
下一章:
https://www.52pojie.cn/thread-698450-1-1.html
上一章:
https://www.52pojie.cn/thread-697357-1-1.html
楼主我想问一下com.unity3d.player.NativeLoader.load代码中libmono和libunity的加载是怎么看到的?里面的a方法值只返回了真假值 谢谢分享,学习一下 学习一下 学习一下,谢谢楼主 看不懂,好像好厉害的样子 感谢分享,谢谢 这还能分两章写的,加油吧. knva 发表于 2018-2-9 17:50
这还能分两章写的,加油吧.
是边弄边写边发,第二章之后会继续补充 支持一波,坐等后续 很好的教程
页:
[1]
2