ss22219 发表于 2018-2-9 09:23

记一次FGO逆向过程 chapter1

本帖最后由 ss22219 于 2018-3-5 16:44 编辑

首先百度搜索fgo,发现是bilibili代{过}{滤}理的一款游戏,直接下载apk包,版本是1.17.1

安装jdk 1.8,mumu模拟器,NET.Reflector, ida pro

改变格式为zip,查看到lib目录内有libmono,旧版unity3d无误
直接解压Assembly-CSharp.dll出来,用Reflector打开不了,估计是加密过了






解压libmono出来,用ida打开,发现是加了壳


为了验证是不是所有so都加壳了,并由某个so来解壳,打开看上去名字很叼的libfunnykey
打开来看没加壳,里面有一个有深意的函数,先记下来:



int GetFunnyKey()
{
return (int)"loe7vGe2wMU/h8Ik/XdS86QHavZ75uiqI6skBH3mo0KeOim6GbMbFQ==";
}

对于libmono解密dll,这篇文章说得比较详细,介绍了好几种思路
https://www.52pojie.cn/thread-401702-1-1.html
里面提到几种libmono脱壳方法,打算选用动态调试来解析



打开libunity,在libunity中找到了mono_image_open_from_data_with_name方法的导入


猜想是libmono自己脱壳

调试环境选的是mumu模拟器,模拟器附带有adb工具,地址是
C:\Program Files (x86)\Nemu\vmonitor\bin\adb_server.exe


把C:\Program Files (x86)\Nemu\vmonitor\bin添加到Path环境变量中,并复制adb_server.exe到adb.exe
adb connect 127.0.0.1:7555

Ida调试服务端
C:\Program Files (x86)\IDA 6.6\dbgsrv\linux_server
adb push "C:\Program Files (x86)\IDA 6.6\dbgsrv\linux_server" /data/data/linux_server
adb shell
chmod 755 /data/data/linux_server
/data/data/linux_server
结果运行不了
换了android_server和linux_serverx64都不行





猜想是ida版本的问题,换了IDA Pro v7.0
打开目录IDA_Pro_v7.0_Portable\dbgsrv
发现里面有一个叫android_x86_server,这个是6.6里面没有的
adb push android_x86_server /data/data/
adb shell
chmod 755 /data/data/android_x86_server
/data/data/android_x86_server
成功运行起来了



新打开一个cmd窗口
adb forward tcp:23946 tcp:23946
把端口暴露出来

直接打开ida7.0,打开libmono,神奇的发现居然解析出来了,不过是加过壳的,看不出来内容


选择remote linux调试器,设置ip地址为127.0.0.1
选择attach,发现找不到程序,原来游戏我还打开。。。
打开后cancel重新attach,选择 com.bilibili.fatego 这个进程
提示你找到libmono,与本地的相同不相同,我直接点same
然后一直抛异常,直接设置不处理,然后就卡死了,关掉ida,重新打开,不打开文件直接附加
直接就退出来了,应该是有反调试处理,这。。。这就涉及到我的知识盲区了,这个系列就到此为止吧!

怎么能就这样放弃!
https://github.com/iSECPartners/Android-OpenDebug
下载Android-OpenDebug,让模拟器直接打开所有程序的debug开关,无需改apk即可调试
安装好后重启模拟器

然后看看手头要准备的工具:android sdk

以前下载好的一个旧版本r24.3.4,解压出来打开tools\ddms.bat

发现能用,恩。。还行,打开游戏,然后在ddms窗口中选中进程

ddms没有任何数据,嗯。。重新运行下adb connect 127.0.0.1:7555



运行一条指令以debug模式启动游戏:

adb shell am start -Dcom.bilibili.fatego/jp.delightworks.Fgo.player.AndroidPlugin

后面的包名是用apktool解包出来看到的

运行一条调试器附加命令

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

提示jdb找不到,垃圾java!

设置Path C:\Program Files\Java\jdk1.8.0_131\bin

重新打开cmd窗口,运行,成功附加进去了,游戏运行成功,目测没有java层反调试

总算有点希望了,先休息一下

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

toshman 发表于 2018-2-9 11:15

1.17.1版本以前mono是不加壳的,52也有很多修改,听说有人用ILSPY直接引出三个类CryptData、ResponseData、NetworkManager的IL替换掉之前的修改版就成功了。不过动态调试脱壳就不清楚了,祝楼主玩的开心。

夏雨微凉 发表于 2018-2-9 09:36

加油楼主

z529943198 发表于 2018-2-9 09:48

本帖最后由 z529943198 于 2018-2-9 10:58 编辑

支持下楼主 !!

狼来了呀 发表于 2018-2-9 09:54

加油加油^0^~

梦他梦她 发表于 2018-2-9 10:00


加油楼主

LightingZero 发表于 2018-2-9 10:20

前排加油!期待下面的过程!

一喵惊人 发表于 2018-2-9 10:44

mark,学习学习

akria00 发表于 2018-2-9 11:11

然而楼主so解密出来了吗?期待你的更新 ~

热乎雪糕 发表于 2018-2-9 17:20

求楼主py码
页: [1] 2 3 4 5 6 7 8
查看完整版本: 记一次FGO逆向过程 chapter1