记一次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 1.17.1版本以前mono是不加壳的,52也有很多修改,听说有人用ILSPY直接引出三个类CryptData、ResponseData、NetworkManager的IL替换掉之前的修改版就成功了。不过动态调试脱壳就不清楚了,祝楼主玩的开心。 加油楼主 本帖最后由 z529943198 于 2018-2-9 10:58 编辑
支持下楼主 !! 加油加油^0^~
加油楼主 前排加油!期待下面的过程! mark,学习学习 然而楼主so解密出来了吗?期待你的更新 ~ 求楼主py码