ss22219 发表于 2018-2-9 11:12

记一次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

608岁的老头 发表于 2019-9-11 22:54

楼主我想问一下com.unity3d.player.NativeLoader.load代码中libmono和libunity的加载是怎么看到的?里面的a方法值只返回了真假值

w3245698 发表于 2018-2-9 11:31

谢谢分享,学习一下

为乐当及时~ 发表于 2018-2-9 11:38

学习一下

文真则 发表于 2018-2-9 11:45

学习一下,谢谢楼主

a470110893 发表于 2018-2-9 12:13

看不懂,好像好厉害的样子

houlinan 发表于 2018-2-9 13:39

感谢分享,谢谢

knva 发表于 2018-2-9 17:50

这还能分两章写的,加油吧.

ss22219 发表于 2018-2-9 19:04

knva 发表于 2018-2-9 17:50
这还能分两章写的,加油吧.
是边弄边写边发,第二章之后会继续补充

nohack 发表于 2018-2-9 19:18

支持一波,坐等后续

wabanana 发表于 2018-2-10 19:04

很好的教程
页: [1] 2
查看完整版本: 记一次FGO逆向过程 chapter2