首页
社区
课程
招聘
[求助]安卓端 手游变速器,类似光环助手的实现方式是怎样的?
发表于: 2018-8-23 18:23 34756

[求助]安卓端 手游变速器,类似光环助手的实现方式是怎样的?

2018-8-23 18:23
34756

最近公司运营看到一款软件  叫  光环助手,上面有很多游戏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 被到底打哪个龙编辑 ,原因: 结贴,功能已实现
收藏
免费 0
支持
分享
最新回复 (34)
雪    币: 27
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
求各路大佬解救!
2018-8-23 18:32
0
雪    币: 2335
活跃值: (1319)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
你是用的模拟器?has unexpected e_machine: 40 这个错误通常是ELF程序和处理器型号不一致导致的
2018-8-24 09:34
0
雪    币: 27
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
FraMeQ 你是用的模拟器?has unexpected e_machine: 40 这个错误通常是ELF程序和处理器型号不一致导致的
是的用的模拟器,但是打出来的so确实是armeabi的,难道是64位和32位的区别?
2018-8-24 09:44
0
雪    币: 27
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
FraMeQ 你是用的模拟器?has unexpected e_machine: 40 这个错误通常是ELF程序和处理器型号不一致导致的
早上在华为手机上Process: com.jzyx.dyqlb.xmw, PID: 6137
    java.lang.UnsatisfiedLinkError: dlopen failed: library "libdvm.so" not found
报了这个错,是因为5.0以上系统不使用dvm虚拟机了,可是这个第三方的so应用的,但是怎么去掉呢...
最后于 2018-8-24 10:15 被到底打哪个龙编辑 ,原因: 确实信息
2018-8-24 10:02
0
雪    币: 27
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
没有大佬么。。。
这个需求做不动啊
2018-8-24 16:11
0
雪    币: 259
活跃值: (3623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
把libc和时间相关的函数拦截改一遍看
2018-8-25 14:15
0
雪    币: 27
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
蟑螂一号 把libc和时间相关的函数拦截改一遍看
大佬,怎么拦截,hook不就是拦截的么,我在想是不是我静态注入so的问题,下一篇求助贴也试了cocos2d的so的所有setTime相关方法,全是
MSGetImageByName("/system/lib/xxx.so");这个对象获取不到,所以根本就hook不到方法
2018-8-27 09:26
0
雪    币: 259
活跃值: (3623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
到底打哪个龙 大佬,怎么拦截,hook不就是拦截的么,我在想是不是我静态注入so的问题,下一篇求助贴也试了cocos2d的so的所有setTime相关方法,全是 MSGetImageByName("/s ...
substrate试一下  应该是你的hook方式不对哦
2018-8-29 09:21
0
雪    币: 27
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
蟑螂一号 substrate试一下 应该是你的hook方式不对哦
就是用的substrate,方式也没有问题,但是不知道为何hook不到,后来github上找了类似的项目,发现它在image为空时通过dlopen去找so,加上后就能hook到了
另外,夜神模拟器,MSGetImageByName方法会100%得不到so对象,必须dlopen去拿,真机有的拿得到,有的拿不到,也需要dlopen去弥补取不到的情况
2018-8-29 14:43
0
雪    币: 15
活跃值: (256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个so easy 好吗,我已经实现了和光环一模一样的
2019-1-4 15:52
0
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
j可以给大家分享下。
2019-1-5 18:38
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
4年前仿XX助手实现过这个,很简单的,
2019-1-7 10:42
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习一下,~~
2019-1-29 11:11
0
雪    币: 1
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
从csdn的帖子过来,最近项目也有这个需求.因为我还不会编写jni.所以思路是从光环助手上下载对应的加速包.然后提取光环的注入的代码.修改成自己游戏的,但是遇到了反编译后重新编译,执行Plugin.init后 游戏会退出,猜测应该是光环的so文件里对签名进行了校验.
2019-2-25 21:32
0
雪    币: 1
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
bluth 4年前仿XX助手实现过这个,很简单的,
请问,您是使用哪种方法实现的呢.想学习一下
2019-2-25 21:33
0
雪    币: 1250
活跃值: (2158)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
17
cocos2d 一般是 cocos2d::Scheduler::update(),战斗加速甚至需要hook lua,根据具体游戏
U3D 一般是UnityEngine.Time::set_timeScale(),
少数游戏可以hook gettimeofday实现
2019-2-26 11:51
1
雪    币: 1
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
茅山小僧 cocos2d 一般是 cocos2d::Scheduler::update(),战斗加速甚至需要hook lua,根据具体游戏 U3D 一般是UnityEngine.Time::set_timeS ...
学习了,请教下有些游戏hook了,只能看到游戏内部时间加快了,战斗和进度条还是正常的,这种是需要hook lua吗
2019-2-28 09:47
0
雪    币: 1250
活跃值: (2158)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
19
北方的季风 学习了,请教下有些游戏hook了,只能看到游戏内部时间加快了,战斗和进度条还是正常的,这种是需要hook lua吗
有几款cocos2d的游戏是这样,需要具体分析源码好hook lua,u3D一般hook set_timeScale就可以
2019-2-28 09:58
0
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
茅山小僧 有几款cocos2d的游戏是这样,需要具体分析源码好hook lua,u3D一般hook set_timeScale就可以
请教一下,hook set_timeScale是如何实现的?我在IDA中分析libunity.so许久,没有找到set_timeScale函数的实体。查阅网上资料,发现有人说用mono_class_from_name找出set_timeScale函数 和 mono_runtime_invoke实现set_timeScale,但是这里出了个问题,在mono_runtime_invoke中实现mono_class_from_name找出的函数会出现卡住的现象。然后我下载了几个别人实现加速插件功能的,IDA分析了一下,是直接hookset_timeScale实现功能的。望前辈指教一下,谢谢
2019-3-14 15:18
0
雪    币: 1250
活跃值: (2158)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
21
PenguinAndy 请教一下,hook set_timeScale是如何实现的?我在IDA中分析libunity.so许久,没有找到set_timeScale函数的实体。查阅网上资料,发现有人说用mono_class_f ...
一般都是直接hook so里面的set_timeScale,有些so里面做了处理函数符号不导出,这就需要你自己把它找出来,根据函数特征之类的,这个需要一定功夫,你可以找个set_timeScale 符号导出的so看一下函数特征和上下文调用,按特征在你需要hook的so里找
2019-3-14 16:49
0
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22

在IDA中找到的是这个,然后不知道怎么走了。。X的话提示没有地方引用到,G在上面两个
2019-3-14 17:01
0
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
在IDA中找到的是上面的两张截图,然后不知道下一步该怎么弄,直接hook这个“set_timeScale”貌似没有效果,主动调用会闪退
2019-3-14 17:04
0
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
北方的季风 学习了,请教下有些游戏hook了,只能看到游戏内部时间加快了,战斗和进度条还是正常的,这种是需要hook lua吗
成功找出汇编真实函数的偏移地址,实现了unity3d的加速了,好玩,谢谢“茅山小僧”大大的指点。谢谢。
2019-3-15 15:14
0
雪    币: 210
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
茅山小僧 有几款cocos2d的游戏是这样,需要具体分析源码好hook lua,u3D一般hook set_timeScale就可以
成功找出汇编真实函数的偏移地址,实现了unity3d的加速了,好玩,谢谢“茅山小僧”大大的指点。谢谢。
2019-3-15 15:14
0
游客
登录 | 注册 方可回帖
返回
//