最近公司运营看到一款软件 叫 光环助手,上面有很多游戏app,各个渠道的,他们平台先去各大平台下载游戏对应的apk包,然后反编译的方式注入他们自己的代码
在samli的com.gh.xxx下,然后在游戏的初始化activity里调用他们Plugin中的init方法
由于混下了代码,大概看下了,监听了网络改变通知,初始化后做了下载操作,下载到data/data/包名/file/gh目录下
其中主要的就是2个so和一个apk,大致原理也差不多知道,hook到游戏调用的时间心跳方法(公司ios小哥已实现,hook gettimeofday方法,将返回值乘以倍数,注入ipa,即可,u3d需要另外操作)
安卓端cocos2d游戏应该也是类似ios hook gettimeofday,这边用Cydia Substrate框架写了个jni
根据游戏打成对应的armeabi下的so(这中间还有个坑,NDK升级太高了,ABI设置为armeabi时还无法编译,提示要写armeabi-v7a,降到16才能打armeabi的so)
然后丢到游戏反编译的项目lib对应文件夹下,准备偷懒使用System.loadLibrary(“native-lib.cy”);静态给注入,然后打包,报错了
08-23 09:53:33.952: E/art(4043): dlopen("/data/app/com.xxx/lib/arm/libnative-lib.cy.so", RTLD_LAZY) failed: dlopen failed: "/data/app/com.xxx/lib/arm/libnative-lib.cy.so" has unexpected e_machine: 40
搜了下是这个so还引用了其他第三方so,这些第三方的so也需要静态注入
然后也给加上了,其中一个so报错了libsubstrate-dvm.so也是和刚native-lib报的一样的错
08-23 09:57:37.393: E/art(4250): dlopen("/data/app/com.xxx/lib/arm/libsubstrate-dvm.so", RTLD_LAZY) failed: dlopen failed: "/data/app/com.xxx/lib/arm/libsubstrate-dvm.so" has unexpected e_machine: 40
下了IDA工具,查看了这个第三方的so调用了
除了第一个调用的so是第三方的(已静态引入),其他的so应该是linux系统自带的,第一个也导入了,但是还是提示报错(个人怀疑是libstdc++.so的问题,但是查了下是linux自带的so啊...)
这三个so,只引入substrate和native-lib.cy又会报和只引入native-lib.cy一个一样的错
三个so静态引入代码 如下,在app的mainactivity的oncreate方法里引入
到此无法测试是否实现了修改成功,并且看网上说 Cydia Substrate框架好像是需要root才能使用,而且只支持4.4以下系统,这就很尴尬了,光环助手是都可以用,不论是root还是非root,是4.4还是5.0
各位大牛看有不有好的解决方案或者demo给小弟测试下
最后附上光环助手修改的游戏改速截图
PS:好像 gettimeofday是安卓端用来检测反编译的东西,还不知道这个方向是否正确,网上看了一些技术帖子,有针对u3d的游戏加速是hook u3d引擎的settime方法,好迷茫,这个游戏cocos2d,不知道该怎样做,而且这个光环助手的加速不需要root,也不分5.0以上还是一下系统
续:今天来继续分了下光环助手游戏启动后下载的东西
首先上图
下载了一个zip,2个so文件和一个apk,先看zip,里面是些悬浮窗上用到的图片
再来看两个so文件
libdyqlb_v1d3_0108.so,根据游戏命名的so
这三个函数是对游戏包内的光环sdk的java类的jni实现函数,其中maxSpeed应该是用来传递悬浮窗上传递的speed值,这个so没有hook代码
再来看libgh_safety.so
找到了正主,从MSxxx前缀看的出来,这个so使用Cydia Substrate框架进行了底层函数的hook,具体是hook了什么函数还我还不会看...但是大体方向没错,等会得先去研究下IDA的使用和看法
最后来看下plugin_v1d3_v5.apk,反编译后
只有这么点东西
清单文件没啥,发现并没有添加Cydia Substrate官网上说的
<uses-permission android:/>权限
再看smali
里面也只有一个包名,内容倒是不少,又混淆了,只能慢慢看...
求大牛解救,怎么弄这个需求
-----更新----8.24
用真机试了下,报了错,找不到libdvm.so,是因为5.0以上安卓不支持dvm虚拟机了,想办法拿掉了xx-dvm.so,重新生成了不需要它的新hook的so
还是静态注入,真机模拟器均没有报错了,但是没有任何效果....游戏并没有加速,不知道哪里有问题,我再加个打印试试,看是否hook到了....
打印了对应的log,但是... 对象是个空的。。。 所以相当于没有走我的逻辑,是因为静态注入so的原因么,动态注入好像很复杂,看了些技术贴都是讲的云里雾里的,有没对应的教程帖子推荐
----------------------更新--------------------
零零碎碎,历时2天,完成了这个需求
原理是gettimeofday函数的hook
具体实现
https://blog.csdn.net/qq_26763799/article/details/82146582 我写在这里了,有完全的jni,直接拿去打成so即可使用
MSImageRef image;
image = MSGetImageByName("/system/lib/libc.so");
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-8-29 14:45
被到底打哪个龙编辑
,原因: 结贴,功能已实现