北京道路建设在什么网站查询,免费网站自己做,苏州网站建设开发,移动端适配 wordpress这节坑比较多~ 差点没把我给整死#xff01;#xff01;#xff01;
环境介绍
首先我调试都是root过的真机#xff0c;但是生产环境都是没有Root的云机#xff0c;属于自己改的Rom框架也不是XP或LSP 是技术人员利用Xposed源码改的框架
问题解决
模块源码更改
这…这节坑比较多~ 差点没把我给整死
环境介绍
首先我调试都是root过的真机但是生产环境都是没有Root的云机属于自己改的Rom框架也不是XP或LSP 是技术人员利用Xposed源码改的框架
问题解决
模块源码更改
这个比较简单 就是把对应的Xposed关键字 替换一下 云机上的框架就可以识别了
Xposed多进程通讯
Sekiro需要自定义ip 这样就需要传递给微信 然后让微信去连接Sekiro服务 一开始询问同事 他们说用的是socket 通讯 这我感觉就有点大材小用~
广播
于是我想到了是广播 可以进程通讯嘛 在微信启动界面开启一个广播 这样我们就可以向微信发送广播消息 然后接收到消息 ip等地址 就可以动态的用Sekiro Client去连接 Sekiro Server
创建广播
发送广播 接收广播 这样两个进程的通讯就已经搭好了 真机测试没问题 完美执行 然后 云机傻眼了通过adb locat 查看日志 发现并没有什么错误 广播也是创建了成功 但是就是接收不到广播消息 通过adb 发送广播也收不到~ 所以怀疑可能是rom问题 对广播可能做了不友好的支持 那既然这样广播这条路就行不通了
AIDL
偶然翻到自己以前的帖子 通过AIDL去注册服务通讯 https://blog.csdn.net/u014431237/article/details/87743606 但是当时年少 不知道怎么去弄AIDL 就留了个记录 最后用netty通讯完成了 但是现在 4年多了 该给当初自己的一个交代了 Xposed 是 Android 平台上一个著名的框架。基于这个框架我们可以在不需要 root 的情况下修改hook任何系统和 App的类和方法正如作者介绍的那样 modify your ROM - without modifying any APK (developers) or flashing (users)! Xposed 可以 hook 任何类的任何方法但是仅限于在方法执行前和执行后加入钩子hook而并不能修改方法原有的代码。这在大多是情况是够用的但是当涉及到多进程时就不行了。举个例子你hook 了微信获取到了微信昵称想将昵称显示在 QQ 中如果你想简单的通过一个变量来传值是行不通的因为微信和 QQ运行在不同的进程中在 QQ 进程中获取到的还是变量的初始值。 广播Broadcast是解决该问题的一种方法。但是广播的缺点是1.不能确定什么时候能够收到 2.创建广播和广播接收者都需要用到Context 而在 hook 的类里并不总是有 Context。 最好的方法就是添加一个自定义的系统服务来进行进程间的数据共享。系统服务的优点有1.服务从开机就启动了并且一直存活到关机2.可以简单的通过ServiceManager.getService()来调用。 在正常情况下是不能添加这样的系统服务的但是我们可以借助 Xposed 来实现。实现进程间通信的服务需要用到 AIDLAndroid Interface Definition Language我们的服务也不例外。 代码编写
首先编写一个 ICustomService.aidl
interface ICustomService {String getClientId();String getServerIp();void setClientId(String clientid);void setServerIp(String serverip);
}如何向 Android 系统注册我们的服务则是用到了 android.os.ServiceManager 的 addService 方法在不同 Android 版本中的实现略有区别。addService 方法使用 private 修饰所以需要使用反射来调用。这里我们使用 Xposed 调用。
Android 的系统服务都是在 com.android.server.SystemServer 中注册的。在 5.0 之前SystemServer 的 SystemContext 是由 ActivityManagerService 的 main 方法返回的而之后是由 createSystemContext 方法生成并最终传递给了 ActivityManagerService 的构造方法通过 ActivityManagerService.Lifecycle 和 SystemServiceManager。
需要注意的一个地方是 5.0 以后的版本中因为 selinux 的原因服务名称需要加 user. 前缀否则会抛出 java.lang.SecurityException 错误。
因为 CustomService 注册时其他服务并没有初始化完成所以需要找到其他的 hook 入口来完成 CustomService 的最终初始化ActivityManagerService 的 systemReady 方法会在其他所有服务初始化完毕后调用正是我们需要的。
我们需要 SystemContext 来对 CustomService 进行一些初始化所以分别 hook ActivityManagerService 的 main 方法和构造方法来获取 SystemContext并注册 CustomService。具体实现如下
public class CustomService extends ICustomService.Stub {private static final String SERVICE_NAME custom.service;private static CustomService mCustomService;private static ICustomService mClient;private static Context mContext;public CustomService(Context context) {mContext context;}public static ICustomService getClient() {if (mClient null) {try {Class? ServiceManager Class.forName(android.os.ServiceManager);Method getService ServiceManager.getDeclaredMethod(getService, String.class);IBinder binder (IBinder) getService.invoke(null, getServiceName());mClient ICustomService.Stub.asInterface(binder);} catch (Throwable t) {Log.w(WXTAG, AIDL服务对象失败: t.toString() );mClient null;}}return mClient;}public static String getServiceName() {return Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP ? user. SERVICE_NAME : SERVICE_NAME;}//注册系统服务public static void register(final ClassLoader classLoader) {Class? ActivityManagerService GomenHelpers.findClass(com.android.server.am.ActivityManagerService, classLoader);if (Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP) {GomenBridge.hookAllConstructors(ActivityManagerService, new HZ_MethodHook() {Overrideprotected void afterHookedMethod(HZ_MethodHook.MethodHookParam param) throws Throwable {register(classLoader, (Context) GomenHelpers.getObjectField(param.thisObject, mContext));}});} else {GomenBridge.hookAllMethods(ActivityManagerService, main, new HZ_MethodHook() {Overrideprotected void afterHookedMethod(HZ_MethodHook.MethodHookParam param) throws Throwable {register(classLoader, (Context) param.getResult());}});}GomenBridge.hookAllMethods(ActivityManagerService, systemReady, new HZ_MethodHook() {Overrideprotected void afterHookedMethod(HZ_MethodHook.MethodHookParam param) throws Throwable {mCustomService.systemReady();}});}private static void register(final ClassLoader classLoader, Context context) {mCustomService new CustomService(context);Class? ServiceManager GomenHelpers.findClass(android.os.ServiceManager, classLoader);if (Build.VERSION.SDK_INT Build.VERSION_CODES.JELLY_BEAN) {GomenHelpers.callStaticMethod(ServiceManager,addService,getServiceName(),mCustomService,true);} else {GomenHelpers.callStaticMethod(ServiceManager,addService,getServiceName(),mCustomService);}Log.i(WXTAG, register: 系统服务完成);}private void systemReady() {// Make initialization hereLog.i(WXTAG, 注册服务完成。系统初始化....);}private String clientId 客户端id;private String serverIp 127.0.0.1;//重写方法Overridepublic String getClientId() throws RemoteException {return clientId;}Overridepublic String getServerIp() throws RemoteException {return serverIp;}Overridepublic void setClientId(String clientid) throws RemoteException {this.clientId clientid;}Overridepublic void setServerIp(String serverip) throws RemoteException {this.serverIp serverip;}
}然后创建一个 Xposed 模块用于注册服务
public class XposedMod implements IXposedHookLoadPackage {Overridepublic void handleLoadPackage(LoadPackageParam loadPackageParam) throws Throwable {if (android.equals(loadPackageParam.packageName)) {CustomService.register(loadPackageParam.classLoader);}}
}调用服务 //获取AIDL服务ICustomService mService CustomService.getClient();if(mServicenull){Log.w(WXTAG, 获取系统服务 实例为null.);return;}Log.i(WXTAG, 获取ip: mService.getServerIp());Log.i(WXTAG, 获取id: mService.getClientId());mService.setServerIp(tempServerIp);mService.setClientId(tempetSekiroId);至此服务编写完毕 真机没问题 开始跑云机 但是问题 就是出现在 云机获取服务一直为null 通过命令 adb shell service list 可以查到服务确实创建成功 开始说了云机是没有root权限的 用adb logcat 1.log 查看日志 发现错误如下
E SELinux : avc: denied { find } for serviceuser.custom.service pid31544 uid10123 scontextu:r:untrusted_app:s0:c123,c256,c512,c768 tcontextu:object_r:default_android_service:s0 tclassservice_manager permissive0这边翻译一下就是 很明显 在云机上 untrusted_app 没有访问 service的权限
用户自行开发的app需要访问底层serial port。我们开发的app在SELinux(或SEAndroid)中分为主要三种类型(根据user不同也有其他的domain类型)1)untrusted_app 第三方app没有Android平台签名没有system权限
2)platform_app 有android平台签名没有system权限
3)system_app 有android平台签名和system权限
从上面划分权限等级理论上untrusted_app platform_app system_app根据这篇帖子可以看到临时关闭SELinux权限的方法 Android——SELinux 权限简介 由于rom是自定义的 只需要在rom开发人员提供的app 执行一下 setenforce 0 指令即可
然后成功 可以通过AIDL交互了
对接ROM
总不可能每次启动App还得去手动执行一下 setenforce 0 指令吧 所以对接rom的SDK 还好也是AIDL 然后我用过按钮点击 执行测试一下 一直报错 systemService 永远都是返回null 按理说bindService 之后调用重写函数就可以自动赋值 但是 永远都没有触发Override请朋友看了半天都说代码问题呀 然后… 没错 这个主线程不能调用bindService 搞了我一下午 真是菜呀
关于微信
Tinker热加载
基础须知
热加载是可以让安卓App不重新安装但是又能改机运行逻辑的技术腾讯系软件使用自家的热加载系统Tinker。应用程序会从清单的appliction name开始进行运行, 一把程序加壳多dex热加载都在这里做工作这是应用程序自己的代码能被最早执行的地方。热加载分成总体分资源so, dex热加载业务逻辑代码绝大部分在dex, 所以一般关注dex热加载比较多。系统会先执行Application里面的生命周期函数attachBaseContext比我们熟悉的onCreate更早。
为什么说这个呢 因为hook微信的过程中 他会修复classloader 这样你XP所有hook 方法都会失效 首先查看微信入口类 可以看到他有个父类TinkerApplication 点进去 类初始化之后就会由系统调用生命周期函数 attachBaseContext 跟一下Tinker加载流程 找到 com.tencent.tinker.loader.TinkerLoader 的 tryLoad 方法 可以看到在tryLoadPatchFilesInternal 中比较重要的是loadTinkerJars 继续跟踪 loadTinkerJars 找到 SystemClassLoaderAdder.installDexes 进入installDexes根据不同的系统环境 安装热更新
创建了一个新的Classloader 替换线程上下文和LoadedApk的classloader 检查一下 isPatch 值 如果load 成功 就会用tinker_xxx.dex等的类 所以 wx没替换classloader我们就不替换xp的classloader wx替换了classloader我们跟着替换xp的classloader。
Xposed 代码 // 这个时候wx未修改classloader保持xp的不变XposedBridge.hookAllMethods(findClass(com.tencent.tinker.loader.app.TinkerApplication, lpparam.classLoader), onBaseContextAttached, new XC_MethodHook() {Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {// 后面所有查找类加载类使用这个类加载器。不要再使用xp回调传过来的。或者使用TinkerClassLoader.findClass。HookWX.wxClassLoader (ClassLoader) XposedHelpers.callMethod(param.thisObject, getClassLoader);log(TinkerApplication 热加载完成~);// 下面开始调用注入逻辑TinkerLoadWx();}});这样就解决了微信Tinker 改变了classloader 使插件失效的问题了
其他
组包解包都在这个类 com.tencent.mm.protocal.MMProtocalJni 每个业务请求都是异步 基本都会有dosence 和 NetEnd 一个执行一个响应只要用ddms或者frida堆栈打印 定位到主要的业务包 写hook 是非常容易的 在我同一个号频繁切换手机和网络的过程中 居然封我号说我网络行为或使用异常~
后记
云机视频号这个项目也可以成功跑了 这也算是完成了四年前的坑了吧 写了一个XPosed的项目 基本上对Xposed的方方面面也算了解了一下 对微信的业务设计也是明白了一些~ 还稍微学习一些安卓正向开发~ 加油咯 以梦为马不负韶华