吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12451|回复: 14
收起左侧

[Android 原创] 记一次FGO逆向过程 chapter2

  [复制链接]
ss22219 发表于 2018-2-9 11:12
本帖最后由 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的过程
9.png


在dlopen中下断点
10.png

运行
adb shell am start -D  com.bilibili.fatego/jp.delightworks.Fgo.player.AndroidPlugin
Android Studio中在loadLibraryStatic处下断点
11.png

现在,我在java层加载so前下了断点,触发java层断点后附加IDA进行native层调试
这个时候so还没执行,可以跟踪到so的加载过程

Android Studio远程调试附加到8700端口
这个时候就马上命中java断点了


然后打开ida,远程附加到游戏进程
然后ida中让游戏继续运行,切换回到AndroidStudio,让游戏继续运行

这个时候命中了我们ida中dlopen的断点
然后eax就是soinfo的返回值
12.png


这篇文章讲述了如何从一个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的调用
17.png


跟踪到_mono_image_open_from_data_with_name
发现只有一条jmp指令,查看引用

18.png


发现这个地址也不正确,不过意外解析出来了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

16.png






这个章节费了不少时间,但总算达到预期效果
休息一下,还有后续

下一章:
https://www.52pojie.cn/thread-698450-1-1.html

上一章:
https://www.52pojie.cn/thread-697357-1-1.html

免费评分

参与人数 10吾爱币 +9 热心值 +10 收起 理由
yzh88 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
906790185 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qzr + 1 + 1 用心讨论,共获提升!
mincai + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dwq308 + 1 + 1 我很赞同!
寒蝉鸣泣之时 + 1 + 1 谢谢@Thanks!
lin_xop + 1 热心回复!
wuyuwuyu吴玉 + 1 + 1 热心回复!
MaxMadcc + 1 + 1 谢谢@Thanks!
nekous + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

608岁的老头 发表于 2019-9-11 22:54
楼主我想问一下com.unity3d.player.NativeLoader.load代码中libmono和libunity的加载是怎么看到的?里面的a方法值只返回了真假值 L(~W335J]QQHR6%LE`ARY0N.png
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 来自手机
很好的教程
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-18 18:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表