精华内容
下载资源
问答
  • 一.xposed工具简介: 1.它部署在ROOT后的安卓手机上,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik...

    一.xposed工具简介

    1.它部署在ROOT后的安卓手机上,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。可以让我们在不修改APK源码的情况下,通过自己编写的模块来影响程序运行的框架服务,实现类似于自动抢红包、微信消息自动回复等功能。

    2.从本质讲xposed模块也是安卓程序,要想让写出的Andriod程序成为一个xposed模块,要完成以下四个硬件任务:

    
     1. 让手机的xposed框架会知道我们安装的这个程序是个xposed模块
     2. 模块里要包含xposed的API的jar包,以实现下一步的hook模块
     3. 这个模块里面要有目标程序进行hook操作的方法
     4. 要让手机上的xposed框架知道,我们编写的sposed模块中, 哪一个方法实现hook的操作
    
    

    即::::对应四大件(与以上四个任务一一对应)

    
     1. AndroidManifest.xml
     2. XposeBridgeApi-xx.jar与build.gradle
     3. 实现hook操作的代码
     4. xposed_init<添加入口>
    
    

    二.创建项目

    1.root的手机(或模拟器)上安装Xposed Installe

    2.打开andriod studio 编辑器,创建空白项目

    3.将项目查看方式设置Project模式,在"项目名/app/main/"的目录下找到
    AndroidManifest.xml文件,并在如下位置插入以下代码:

    <meta-data
    android:name="xposedmodule"
    
    android:value="true" />
    
    <meta-data
    
        android:name="xposeddescription"
    
        android:value="这是一个Xposed例程" />
    
    <meta-data
    
        android:name="xposedminversion"
    
        android:value="53" />
    

    位置如下图:

    在这里插入图片描述
    4.导入XposedBridgeApi.jar包
    方法一:自动导包
    在"项目名/app/"目录下找到build.gradle文件,在图示的位置加代码如下:

    repositories {
    
        jcenter()
    
    }
    
    compileOnly 'de.robv.android.xposed:api:82'
    
    compileOnly 'de.robv.android.xposed:api:82:sources'
    

    这句代码告诉android studio使用jcenter作为代码仓库,从这个仓库里面远程寻找

    具体位置如下图:
    在这里插入图片描述
    方法二:手动导包
    1.将下载的的.jar包复制到"项目名/app/libs"下
    2.选中要导入的包 鼠标右击 点击Add As Library…

    5.开始编写hook代码
    1.在"项目/app/src/mainjava/包名"写代码

    代码略

    6.添加入口
    1.在"项目名/app/src/main"目录先创建assets文件夹在该文件夹中创建名为xposed_init文件,文件中内容为 包名.写的hook类名
    注:文件中的内容一定没有"package"这个单词
    创建assets文件的方法如图
    在这里插入图片描述
    复制xposed_init的内容如下:

    选中写的hook类的文件,鼠标右击,点击Copy Reference然后直接粘贴到xposed_init文件中即可
    

    小知识:
    在build.gradle文件中compile和provide的区别:

    compile汇编
    	compile 把jar在项目运行的时候, 编译并且程序在打包为apk的时候也发布到apk里面去
    	provided提供,假设,
    	项目在编译或者运行的时候,会调用其描述的jarapi但是项目被发布为apk的时候,不会打包到apk中
    

    文件打成.jar命令:

    jar -cvf *****.jar 需要打包的文件
    

    运行.jar包:

    在这里插入代码片

    java -jar myjar.jar
    

    给jar包添加main class入口:

    java -cp myjar.jar com.example.MainClass
    
    展开全文
  • xposed编写hook模块

    千次阅读 2019-06-20 10:52:52
    首先按照网上教程,编写最简单的load包名模块。 首先添加依赖,不用下载jar包,直接在app的build.gradle的dependence中添加 compileOnly 'de.robv.android.xposed:api:82' compileOnly 'de.robv.android.xposed:api:...

    参考

    一.首先按照网上教程,编写最简单的load包名模块。

    首先添加依赖,不用下载jar包,直接在app的build.gradle的dependence中添加
    compileOnly 'de.robv.android.xposed:api:82'
    compileOnly 'de.robv.android.xposed:api:82:sources'
    然后同步一下,没有报错就可以了,之前一直下载jar包然后添加库,结果虽然没报错但xposed日志里一直是"can not load module"。
    然后修改AndroidManifest,添加meta标签,结构应如下,添加了三个标签:

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            
            <meta-data
            	android:name="xposedmodule"
            	android:value="true" />
            <meta-data
                android:name="xposeddescription"
                android:value="Easy example which makes the status bar clock red and adds a smiley" />
            <meta-data
                android:name="xposedminversion"
                android:value="53" />
        </application>
    

    接着新建一个类aa,代码如下:

    public class aa implements IXposedHookLoadPackage {
        public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
            XposedBridge.log("Loaded app: " + lpparam.packageName);
        }
    }
    

    接下来告诉xposed此模块的入口点,新建assets文件夹,在assets文件夹下创建一个名叫xposed_init的text文件。在该文件中写下我们hook类的全名。它是:包名.aa
    至此完成,但运行会提示找不到入口activity,修改run/debug configuration,将launch options改为nothing,运行,然后激活并重启模块。之后可以在日志中看到load的app名。
    在这里插入图片描述

    二.替换源程序的方法

    编写一个简单app,单击按键会toast。我们想要替换toast的字符串为“22222”。

    //将替换的app。
    package example.com.jnitest;
    
    public class MainActivity extends Activity {
    
        Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            button=findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        public String toastMessage() {
            return "我未被劫持";
        }
    

    在刚才的模块工程中新建一个类bb,

    public class bb implements IXposedHookLoadPackage {
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
            if (loadPackageParam.packageName.equals("example.com.jnitest")) {		//要hook的包名
            
                Class clazz = loadPackageParam.classLoader.loadClass(
                        "example.com.jnitest.MainActivity");			//要hook的函数所在的activity
                        
                XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {		//要hook的函数名
                
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    }
                    
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        param.setResult("你已被劫持");			//想替换的返回值
                    }
                });
            }
        }
    }
    

    在xposed_init下新添加一行:包名.bb,运行激活重启。
    在这里插入图片描述
    除此之外可以将一些参数打印到控制台中,不用打印到xposed日志中,这样比较方便看。其他功能还没深入了解,待解决:native方法的hook。

    ###################
    XC_MethodHook中定义了回调方法:

    1.beforeHookedMethod(MethodHookParam param):被hook方法调用前执行,调用param.setResult可以跳过被hook的方法。

    2.afterHookedMethod(MethodHookParam param) : 被hook方法调用后执行,调用param.setResult更改被hook方法的执行结果。

    public class XposedHook implements IXposedHookLoadPackage {
        public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {	//包加载时会调用
            XposedBridge.log("Loaded app: " + lpparam.packageName);
    
            if (!lpparam.packageName.equals("com.bingghost.simplehelloworld"))
            {
                return;
            }
    
            findAndHookMethod("com.bingghost.simplehelloworld.MainActivity", lpparam.classLoader, "sayhello", int.class, int.class, new XC_MethodHook() {
    
                protected void beforeHookedMethod(MethodHookParam param) {
                    param.setResult("i am new result! before");  //
                    Integer  para1 =  (Integer) param.args[0];   //获取参数1
                    Integer para2 = (Integer) param.args[1];     //获取参数2
                    String s1 = Integer.toString(para1);
                    String s2 = Integer.toString(para2);
                    Log.v("hook before param1:", s1);
                    Log.v("hook before param2:", s2);
    
                    param.args[0] = 100;  //设置参数1
                    param.args[1] = 200;  //设置参数2
    
                    Log.v("hook", "before hook!");
                }
    
    			protected void afterHookedMethod(MethodHookParam param) {
                    String str = (String) param.getResult();
                    Log.v("hook after result :", str);
                    Integer  para1 =  (Integer) param.args[0];   //获取参数1
                    Integer para2 = (Integer) param.args[1];     //获取参数2
                    String s1 = Integer.toString(para1);
                    String s2 = Integer.toString(para2);
                    param.setResult("i am new result! after");   //设置返回值
    
                    Log.v("hook param1:", s1);
                    Log.v("hook param2:", s2);
                    Log.v("hook result:", "i am new result! after");
                }
            });
        }
    }
    
    
    
    展开全文
  • 瘦蛟舞 · 2015/08/03 10:30官方教程:github.com/rovo89/Xpos…官网:repo.xposed.info/module/de.r…apk:dl-xda.xposed.info/modules/de.…源码:github.com/rovo89/Xpos…模块基本开发流程1.创建工程android4.0.3...

    瘦蛟舞 · 2015/08/03 10:30

    官方教程:github.com/rovo89/Xpos…

    官网:repo.xposed.info/module/de.r…

    apk:dl-xda.xposed.info/modules/de.…

    源码:github.com/rovo89/Xpos…

    模块基本开发流程


    1.创建工程android4.0.3(api15,测试发现其他版本也可以),可以不用activity

    2.修改AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="de.robv.android.xposed.mods.tutorial"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk android:minSdkVersion="15" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <meta-data
                android:name="xposedmodule"
                android:value="true" />
            <meta-data
                android:name="xposeddescription"
                android:value="Easy example" />
            <meta-data
                android:name="xposedminversion"
                android:value="54" />
        </application>
    </manifest>
    复制代码

    3.在工程目录下新建一个lib文件夹,将下载好的XposedBridgeApi-54.jar包放入其中.

    eclipse 在工程里 选中XposedBridgeApi-54.jar 右键–Build Path–Add to Build Path.

    IDEA 鼠标右键点击工程,选择Open Module Settings,在弹出的窗口中打开Dependencies选项卡.把XposedBridgeApi这个jar包后面的Scope属性改成provided.

    4.模块实现接口

    #!java
    package de.robv.android.xposed.mods.tutorial;
    
    import de.robv.android.xposed.IXposedHookLoadPackage;
    import de.robv.android.xposed.XposedBridge;
    import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
    
    public class Tutorial implements IXposedHookLoadPackage {
        public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
            XposedBridge.log("Loaded app: " + lpparam.packageName);
        }
    }
    复制代码

    5.入口assets/xposed_init配置,声明需要加载到 XposedInstaller 的入口类:

    #!java
    de.robv.android.xposed.mods.tutorial.Tutorial  //完整类名:包名+类名
    复制代码

    6.定位要hook的api

    • 反编译目标程序,查看Smali代码
    • 直接在AOSP(android源码)中查看

    7.XposedBridge to hook it

    • 指定要 hook 的包名
    • 判断当前加载的包是否是指定的包
    • 指定要 hook 的方法名
    • 实现beforeHookedMethod方法和afterHookedMethod方法

    示例如下:

    #!java
    package de.robv.android.xposed.mods.tutorial;
    
    import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC\_MethodHook; import de.robv.android.xposed.callbacks.XC\_LoadPackage.LoadPackageParam;
    
    public class Tutorial implements IXposedHookLoadPackage { public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { if (!lpparam.packageName.equals("com.android.systemui")) return;
    
            findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    // this will be called before the clock was updated by the original method
                }
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    // this will be called after the clock was updated by the original method
                }
        });
        }
    
    
    }
    复制代码

    重写XC_MethodHook的两个方法beforeHookedMethod和afterHookedMethod,这两个方法会在原始的方法的之前和之后执行.您可以使用beforeHookedMethod 方法来打印/篡改方法调用的参数(通过param.args) ,甚至阻止调用原来的方法(发送自己的结果).afterHookedMethod 方法可以用来做基于原始方法的结果的事情.您还可以用它来操纵结果 .当然,你可以添加自己的代码,它将会准确地在原始方法的前或后执行.

    关键API

    IXposedHookLoadPackage

    handleLoadPackage : 这个方法用于在加载应用程序的包的时候执行用户的操作

    调用示例

    #!java
    public class XposedInterface implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
    XposedBridge.log("Kevin-Loaded app: " + lpparam.packageName); }
    }
    复制代码

    参数说明|final LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息。

    XposedHelpers

    findAndHookMethod ;这是一个辅助方法,可以通过如下方式静态导入:

    #!java
    import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
    复制代码

    使用示例

    #!java
    findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "handleUpdateClock", new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
    // this will be called before the clock was updated by the original method }
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    // this will be called after the clock was updated by the original method }
    });
    复制代码

    参数说明

    findAndHookMethod(Class<?>clazz, //需要Hook的类名
    ClassLoader, //类加载器,可以设置为 null 
    String methodName, //需要 Hook 的方法名 
    Object... parameterTypesAndCallback
    复制代码

    该函数的最后一个参数集,包含了:

    (1)Hook 的目标方法的参数,譬如:

    "com.android.internal.policy.impl.PhoneWindow.DecorView"
    复制代码

    是方法的参数的类。

    (2)回调方法:

    a.XC_MethodHook 
    b.XC_MethodReplacement
    复制代码

    模块开发中的一些细节


    1.Dalvik 孵化器 Zygote (Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育/fork出来的)进程对应的程序是/system/bin/app_process. Xposed 框架中真正起作用的是对方法的 hook。

    #!java
    
    因为 Xposed 工作原理是在/system/bin 目录下替换文件,在 install 的时候需要 root 权限,但是运行时不需要 root 权限。
    复制代码

    2.log 统一管理,tag 显示包名

    #!java
    
        Log.d(MYTAG+lpparam.packageName, "hello" + lpparam.packageName);
    复制代码

    3.植入广播接收器,动态执行指令

    #!java
    
            findAndHookMethod("android.app.Application", lpparam.classLoader, "onCreate", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
    
                    Context context = (Context) param.thisObject;
                    IntentFilter filter = new IntentFilter(myCast.myAction);
                    filter.addAction(myCast.myCmd);
                    context.registerReceiver(new myCast(), filter);
    
                }
    
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                }
            });
    复制代码

    4.context 获取

    #!java
    
        fristApplication = (Application) param.thisObject;
    复制代码

    5.注入点选择 application oncreate 程序真正启动函数而是 MainActivity 的 onCreate (该类有可能被重写,所以通过反射得到 oncreate 方法)

    #!java
    
        String appClassName = this.getAppInfo().className;
                if (appClassName == null) {
                    Method hookOncreateMethod = null;
                    try {
                        hookOncreateMethod = Application.class.getDeclaredMethod("onCreate", new Class[] {});
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    }
                    hookhelper.hookMethod(hookOncreateMethod, new ApplicationOnCreateHook());
    复制代码

    6.排除系统 app,排除自身,确定主线程

    #!java
    
        if(lpparam.appInfo == null || 
                        (lpparam.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){
                    return;
                }else if(lpparam.isFirstApplication && !ZJDROID_PACKAGENAME.equals(lpparam.packageName)){
    复制代码

    7.hook method

    #!java
    
        Only methods and constructors can be hooked,Cannot hook interfaces,Cannot hook abstract methods
        只能 hook 方法和构造方法,不能 hook 接口和抽象方法
        抽象类中的非抽象方法是可以 hook的, 接口中的方法不能 hook (接口中的method默认是public abstract 抽象的.field 必须是public static final)
    复制代码

    8.参数中有 自定义类

    #!java
    
        public void myMethod (String a, MyClass b) 
    
    
    通过反射得到自定义类,也可以用[xposedhelpers](https://github.com/rovo89/XposedBridge/wiki/Helpers#class-xposedhelpers)封装好的方法findMethod/findConstructor/callStaticMethod....
    复制代码

    9.注入后反射自定义类

    #!java
    
        Class<?> hookMessageListenerClass = null;
    
        hookMessageListenerClass = lpparam.classLoader.loadClass("org.jivesoftware.smack.MessageListener");
    
        findAndHookMethod("org.jivesoftware.smack.ChatManager", lpparam.classLoader, "createChat", String.class , hookMessageListenerClass ,new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
    
                String sendTo = (String) param.args[0];
                Log.i(tag , "sendTo : + " + sendTo );
    
            }
    
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
            }
        });
    复制代码

    10.hook 一个类的方法,该类是子类并且没有重写父类的方法,此时应该 hook 父类还是子类.(hook 父类方法后,子类若没重写,一样生效.子类重写方法需要另外 hook) (如果子类重写父类方法时候加上 spuer ,hook 父类依旧有效)

    例如 java.net.HttpURLConnection extends URLConnection ,
    复制代码

    方法在父类

    #!java
    
        public OutputStream getOutputStream() throws IOException {
               throw new UnknownServiceException("protocol doesn't support output");
           }
    
    
    org.apache.http.impl.client.AbstractHttpClient extends CloseableHttpClient ,
    复制代码

    方法在父类(注意,android的继承的 AbstractHttpClient implements org.apache.http.client.HttpClient)

    #!java
    
        public CloseableHttpResponse execute(
                final HttpHost target,
                final HttpRequest request,
                final HttpContext context) throws IOException, ClientProtocolException {
            return doExecute(target, request, context);
        }
    
    
    android.async.http复写HttpGet导致zjdroid hook org.apache.http.impl.client.AbstractHttpClient execute 无法获取到请求 url和method
    复制代码

    11.hook 构造方法

    #!java
    
        public static XC_MethodHook.Unhook findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {
            return findAndHookConstructor(findClass(className, classLoader), parameterTypesAndCallback);
        }
    复制代码

    12.承接4,application 的onCreate 方法被重写,例如阿里的壳,重写为原生 native 方法.

    解1:通过反射到 application 类重写后的 onCreate 方法再对该方法进行hook

    解2:hook 构造方法(构造方法被重写,继续解1)

    13.native 方法可以 hook,不过是在 java 层调用时hook而不是 hook 动态链接库.

    实战Hook android 中可能的出现 HTTP 请求


    首先确定http 请求的 api,大致分为:

    • apache 提供的 HttpClient
      • 1) 创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest等对象;
      • 2) 设置连接参数;
      • 3) 执行 HTTP 操作;
      • 4) 处理服务器返回结果.
    • java 提供的 HttpURLConnection
      • 1) 创建 URL 以及 URLConnection / HttpURLConnection 对象
      • 2) 设置连接参数
      • 3) 连接到服务器
      • 4) 向服务器写数据
      • 5) 从服务器读取数据
    • android 提供的 webview
    • 第三方库:volley/android-async-http/xutils (本质是对前两种的方式的延伸,方法的重写可能对接下来的 hook 产生影响)

    不太了解 java 的 hook 前可以先看下基础的代码HttpClient以及HttpURLConnection的基本使用

    对 HttpClient的 hook 可以参考 贾志军大牛的Zjdroid

    #!java
        Method executeRequest = RefInvoke.findMethodExact("org.apache.http.impl.client.AbstractHttpClient", ClassLoader.getSystemClassLoader(),
                "execute", HttpHost.class, HttpRequest.class, HttpContext.class);
    
        hookhelper.hookMethod(executeRequest, new AbstractBahaviorHookCallBack() {
            @Override
            public void descParam(HookParam param) {
                // TODO Auto-generated method stub
                Logger.log_behavior("Apache Connect to URL ->");
                HttpHost host = (HttpHost) param.args[0];
    
                HttpRequest request = (HttpRequest) param.args[1];
                if (request instanceof org.apache.http.client.methods.HttpGet) {
                    org.apache.http.client.methods.HttpGet httpGet = (org.apache.http.client.methods.HttpGet) request;
                    Logger.log_behavior("HTTP Method : " + httpGet.getMethod());
                    Logger.log_behavior("HTTP GET URL : " + httpGet.getURI().toString());
                    Header[] headers = request.getAllHeaders();
                    if (headers != null) {
                        for (int i = 0; i < headers.length; i++) {
                            Logger.log_behavior(headers[i].getName() + ":" + headers[i].getName());
                        }
                    }
                } else if (request instanceof HttpPost) {
                    HttpPost httpPost = (HttpPost) request;
                    Logger.log_behavior("HTTP Method : " + httpPost.getMethod());
                    Logger.log_behavior("HTTP URL : " + httpPost.getURI().toString());
                    Header[] headers = request.getAllHeaders();
                    if (headers != null) {
                        for (int i = 0; i < headers.length; i++) {
                            Logger.log_behavior(headers[i].getName() + ":" + headers[i].getValue());
                        }
                    }
                    HttpEntity entity = httpPost.getEntity();
                    String contentType = null;
                    if (entity.getContentType() != null) {
                        contentType = entity.getContentType().getValue();
                        if (URLEncodedUtils.CONTENT_TYPE.equals(contentType)) {
    
                            try {
                                byte[] data = new byte[(int) entity.getContentLength()];
                                entity.getContent().read(data);
                                String content = new String(data, HTTP.DEFAULT_CONTENT_CHARSET);
                                Logger.log_behavior("HTTP POST Content : " + content);
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
    
                        } else if (contentType.startsWith(HTTP.DEFAULT_CONTENT_TYPE)) {
                            try {
                                byte[] data = new byte[(int) entity.getContentLength()];
                                entity.getContent().read(data);
                                String content = new String(data, contentType.substring(contentType.lastIndexOf("=") + 1));
                                Logger.log_behavior("HTTP POST Content : " + content);
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
    
                        }
                    }else{
                        byte[] data = new byte[(int) entity.getContentLength()];
                        try {
                            entity.getContent().read(data);
                            String content = new String(data, HTTP.DEFAULT_CONTENT_CHARSET);
                            Logger.log_behavior("HTTP POST Content : " + content);
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
    
                    }
    
                }
            }
    
            @Override
            public void afterHookedMethod(HookParam param) {
                // TODO Auto-generated method stub
                super.afterHookedMethod(param);
                HttpResponse resp = (HttpResponse) param.getResult();
                if (resp != null) {
                    Logger.log_behavior("Status Code = " + resp.getStatusLine().getStatusCode());
                    Header[] headers = resp.getAllHeaders();
                    if (headers != null) {
                        for (int i = 0; i < headers.length; i++) {
                            Logger.log_behavior(headers[i].getName() + ":" + headers[i].getValue());
                        }
                    }
    
                }
            }
        });
    复制代码

    对 HttpURLConnection 的 hook Zjdroid 未能提供完美的解决方案,想要取得除了 URL 之外的 data 字段必须对I/O流操作.

    #!java
        Method openConnectionMethod = RefInvoke.findMethodExact("java.net.URL", ClassLoader.getSystemClassLoader(), "openConnection");
        hookhelper.hookMethod(openConnectionMethod, new AbstractBahaviorHookCallBack() {
            @Override
            public void descParam(HookParam param) {
                // TODO Auto-generated method stub
                URL url = (URL) param.thisObject;
                Logger.log_behavior("Connect to URL ->");
                Logger.log_behavior("The URL = " + url.toString());
            }
        });
    复制代码

    我采取的临时解决方法是对I/O 进行正则匹配,类似 url 的 data 字段就打印出来,代码如下(这段代码只能解决前文 HttpUtils而且会有误报,大家有啥好想法欢迎指点一二)

    #!java
        findAndHookMethod("java.io.PrintWriter", lpparam.classLoader, "print",String.class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                String print = (String) param.args[0];
                Pattern pattern = Pattern.compile("(\\w+=.*)");
                Matcher matcher = pattern.matcher(print);
                if (matcher.matches())
                    Log.i(tag+lpparam.packageName,"data : " + print);
                //Log.d(tag,"A :" + print);
            }
    
        });
    复制代码

    因为Android-async-http重写了 HttpGet 导致 Zjdroidhook 失败(未进入 HttpGet 和 HttpPost 的判读),加入一个else 语句就可以解决这个问题

    #!java
    else {
                        HttpEntityEnclosingRequestBase httpGet = (HttpEntityEnclosingRequestBase) request;
                        HttpEntity entity = httpGet.getEntity();
                        Logger.log_behavior("HttpRequestBase URL : " + httpGet.getURI().toString());
                        Header[] headers = request.getAllHeaders();
                        if (headers != null) {
                            for (int i = 0; i < headers.length; i++) {
                                Logger.log_behavior(headers[i].getName() + ":" + headers[i].getName());
                            }
                        }
    
                        if(entity!= null){
                                    try {
                                        String content = EntityUtils
                                                .toString(entity);
                                        Logger.log_behavior("HTTP entity Content : "
                                                + content);
                                    } catch (IllegalStateException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                        }
    
                        }
    复制代码

    一些常用工具


    • zjdroid:脱壳/api监控
    • justTrustMe:忽略证书效验
    • IntentMonitor:可以监控显/隐意图 intent
    • Xinstaller:设置应用/设备属性...
    • XPrivacy:权限管理

    展开全文
  • 本帖最后由 世事繁华皆成空 于 2015-8-6 10:05 编辑模块基本开发流程1.创建工程android4.0.3(api15,测试发现其他版本也可以),可以不用activity2.修改AndroidManifest.xmlJavapackage="de.robv.android.xposed.mods....

    本帖最后由 世事繁华皆成空 于 2015-8-6 10:05 编辑

    模块基本开发流程

    1.创建工程android4.0.3(api15,测试发现其他版本也可以),可以不用activity

    2.修改AndroidManifest.xml

    Java

    package="de.robv.android.xposed.mods.tutorial"

    android:versionCode="1"

    android:versionName="1.0" >

    android:icon="@drawable/ic_launcher"

    android:label="@string/app_name" >

    android:name="xposedmodule"

    android:value="true" />

    android:name="xposeddescription"

    android:value="Easy example" />

    android:name="xposedminversion"

    android:value="54" />

    3.在工程目录下新建一个lib文件夹,将下载好的XposedBridgeApi-54.jar包放入其中.eclipse 在工程里 选中XposedBridgeApi-54.jar右键–Build Path–Add to Build Path.IDEA 鼠标右键点击工程,选择Open ModuleSettings,在弹出的窗口中打开Dependencies选项卡.把XposedBridgeApi这个jar包后面的Scope属性改成provided.

    4.模块实现接口

    packagede.robv.android.xposed.mods.tutorial;

    importde.robv.android.xposed.IXposedHookLoadPackage;

    importde.robv.android.xposed.XposedBridge;

    importde.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

    publicclassTutorial implementsIXposedHookLoadPackage{

    publicvoidhandleLoadPackage(finalLoadPackageParam lpparam)throwsThrowable {

    XposedBridge.log("Loaded app: "+ lpparam.packageName);

    }

    }

    5.入口assets/xposed_init配置,声明需要加载到XposedInstaller 的入口类:

    de.robv.android.xposed.mods.tutorial.Tutorial  //完整类名:包名+类名

    6.定位要hook的api ,反编译目标程序,查看Smali代码 ,直接在AOSP(android源码)中查看

    7.XposedBridge to hook it,指定要 hook 的包名,判断当前加载的包是否是指定的包,指定要 hook 的方法名,实现beforeHookedMethod方法和afterHookedMethod方法

    示例如下:

    packagede.robv.android.xposed.mods.tutorial;

    importstaticde.robv.android.xposed.XposedHelpers.findAndHookMethod;importde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XC\_MethodHook;importde.robv.android.xposed.callbacks.XC\_LoadPackage.LoadPackageParam;

    publicclassTutorialimplementsIXposedHookLoadPackage {publicvoidhandleLoadPackage(finalLoadPackageParam lpparam) throwsThrowable {if(!lpparam.packageName.equals("com.android.systemui")) return;

    findAndHookMethod("com.android.systemui.statusbar.policy.Clock",lpparam.classLoader, "updateClock", newXC_MethodHook() {

    @Override

    protectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {

    // this will be called beforethe clock was updated by the original method

    }

    @Override

    protectedvoIDAfterHookedMethod(MethodHookParam param) throwsThrowable {

    // this will be called afterthe clock was updated by the original method

    }

    });

    }

    }

    重写XC_MethodHook的两个方法beforeHookedMethod和afterHookedMethod,这两个方法会在原始的方法的之前和之后执行.您可以使用beforeHookedMethod 方法来打印/篡改方法调用的参数(通过param.args) ,甚至阻止调用原来的方法(发送自己的结果).afterHookedMethod 方法可以用来做基于原始方法的结果的事情.您还可以用它来操纵结果 .当然,你可以添加自己的代码,它将会准确地在原始方法的前或后执行.

    关键API

    IXposedHookLoadPackage

    handleLoadPackage : 这个方法用于在加载应用程序的包的时候执行用户的操作

    调用示例

    publicclassXposedInterfaceimplementsIXposedHookLoadPackage {

    publicvoidhandleLoadPackage(finalLoadPackageParamlpparam) throwsThrowable {

    XposedBridge.log("Kevin-Loaded app:"+ lpparam.packageName); }

    }

    参数说明|final LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息。

    XposedHelpers

    findAndHookMethod ;这是一个辅助方法,可以通过如下方式静态导入:

    importstaticde.robv.android.xposed.XposedHelpers.findAndHookMethod;

    使用示例

    findAndHookMethod("com.android.systemui.statusbar.policy.Clock",lpparam.classLoader, "handleUpdateClock", newXC_MethodHook() {

    @Override

    protectedvoidbeforeHookedMethod(MethodHookParamparam) throwsThrowable {

    // this will be called before the clock wasupdated by the original method }

    @Override

    protectedvoidafterHookedMethod(MethodHookParamparam) throwsThrowable {

    // this will be called after the clock wasupdated by the original method }

    });

    参数说明

    findAndHookMethod(Class>clazz, //需要Hook的类名

    ClassLoader, //类加载器,可以设置为 null

    String methodName, //需要 Hook 的方法名

    Object... parameterTypesAndCallback

    该函数的最后一个参数集,包含了:

    (1)Hook 的目标方法的参数,譬如:

    "com.android.internal.policy.impl.PhoneWindow.DecorView"

    是方法的参数的类。

    (2)回调方法:

    a.XC_MethodHook

    b.XC_MethodReplacement

    模块开发中的一些细节

    1.Dalvik 孵化器 Zygote (Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育/fork出来的)进程对应的程序是/system/bin/app_process. Xposed 框架中真正起作用的是对方法的 hook。

    因为 Xposed 工作原理是在/system/bin 目录下替换文件,在 install 的时候需要 root 权限,但是运行时不需要 root 权限。

    2.log 统一管理,tag 显示包名

    Log.d(MYTAG+lpparam.packageName,"hello"+ lpparam.packageName);

    3.植入广播接收器,动态执行指令

    findAndHookMethod("android.app.Application",lpparam.classLoader, "onCreate", newXC_MethodHook() {

    @Override

    protectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {

    Context context = (Context) param.thisObject;

    IntentFilter filter = newIntentFilter(myCast.myAction);

    filter.addAction(myCast.myCmd);

    context.registerReceiver(newmyCast(), filter);

    }

    @Override

    protectedvoidafterHookedMethod(MethodHookParam param) throwsThrowable {

    super.afterHookedMethod(param);

    }

    });

    4.context 获取

    fristApplication = (Application)param.thisObject;

    5.注入点选择 applicationoncreate 程序真正启动函数而是 MainActivity 的 onCreate (该类有可能被重写,所以通过反射得到 oncreate 方法)

    String appClassName = this.getAppInfo().className;

    if(appClassName == null) {

    Method hookOncreateMethod = null;

    try{

    hookOncreateMethod =Application.class.getDeclaredMethod("onCreate", newClass[] {});

    } catch(NoSuchMethodException e) {

    e.printStackTrace();

    }

    hookhelper.hookMethod(hookOncreateMethod, newApplicationOnCreateHook());

    6.排除系统 app,排除自身,确定主线程

    if(lpparam.appInfo == null||

    (lpparam.appInfo.flags &(ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){

    return;

    }elseif(lpparam.isFirstApplication &&!ZJDROID_PACKAGENAME.equals(lpparam.packageName)){

    7.hook method

    Only methods and constructors can behooked,Cannot hook interfaces,Cannot hook abstractmethods

    只能 hook 方法和构造方法,不能 hook 接口和抽象方法

    抽象类中的非抽象方法是可以 hook的, 接口中的方法不能 hook (接口中的method默认是publicabstract抽象的.field 必须是publicstaticfinal)

    8.参数中有 自定义类

    publicvoidmyMethod(String a, MyClass b)

    通过反射得到自定义类,也可以用[xposedhelpers](https://github.com/rovo89/Xposed ... class-xposedhelpers)封装好的方法findMethod/findConstructor/callStaticMethod....

    9.注入后反射自定义类

    Class> hookMessageListenerClass =null;

    hookMessageListenerClass =lpparam.classLoader.loadClass("org.jivesoftware.smack.MessageListener");

    findAndHookMethod("org.jivesoftware.smack.ChatManager",lpparam.classLoader, "createChat", String.class, hookMessageListenerClass,newXC_MethodHook() {

    @Override

    protectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {

    String sendTo = (String) param.args[0];

    Log.i(tag , "sendTo : + "+ sendTo );

    }

    @Override

    protectedvoidafterHookedMethod(MethodHookParam param) throwsThrowable {

    super.afterHookedMethod(param);

    }

    });

    10.hook 一个类的方法,该类是子类并且没有重写父类的方法,此时应该 hook 父类还是子类.(hook 父类方法后,子类若没重写,一样生效.子类重写方法需要另外 hook) (如果子类重写父类方法时候加上 spuer ,hook 父类依旧有效)

    例如 java.net.HttpURLConnection extends URLConnection ,

    方法在父类

    publicOutputStream getOutputStream() throwsIOException {

    thrownewUnknownServiceException("protocol doesn't supportoutput");

    }

    org.apache.http.impl.client.AbstractHttpClientextendsCloseableHttpClient ,

    方法在父类(注意,android的继承的 AbstractHttpClient implements org.apache.http.client.HttpClient)

    publicCloseableHttpResponse execute(

    finalHttpHost target,

    finalHttpRequest request,

    finalHttpContext context) throwsIOException, ClientProtocolException {

    returndoExecute(target, request, context);

    }

    android.async.http复写HttpGet导致zjdroidhook org.apache.http.impl.client.AbstractHttpClient execute 无法获取到请求 url和method

    11.hook 构造方法

    publicstaticXC_MethodHook.UnhookfindAndHookConstructor(String className, ClassLoader classLoader, Object...parameterTypesAndCallback) {

    returnfindAndHookConstructor(findClass(className, classLoader),parameterTypesAndCallback);

    }

    12.承接4,application 的onCreate 方法被重写,例如阿里的壳,重写为原生 native 方法.

    解1:通过反射到 application 类重写后的 onCreate 方法再对该方法进行hook

    解2:hook 构造方法(构造方法被重写,继续解1)

    13.native 方法可以 hook,不过是在 java 层调用时hook而不是 hook 动态链接库.

    实战Hook Android 中可能的出现 HTTP 请求

    首先确定http 请求的 api,大致分为:

    apache 提供的 HttpClient

    1) 创建 HttpClient 以及 GetMethod/ PostMethod, HttpRequest等对象;

    2) 设置连接参数;

    3) 执行 HTTP 操作;

    4) 处理服务器返回结果.

    java 提供的 HttpURLConnection

    1) 创建 URL 以及URLConnection / HttpURLConnection 对象

    2) 设置连接参数

    3) 连接到服务器

    4) 向服务器写数据

    5) 从服务器读取数据

    android 提供的 webview

    第三方库:volley/android-async-http/xutils (本质是对前两种的方式的延伸,方法的重写可能对接下来的hook 产生影响)

    不太了解 java 的 hook 前可以先看下基础的代码HttpClient以及HttpURLConnection的基本使用

    对 HttpClient的 hook 可以参考贾志军大牛的Zjdroid

    Method executeRequest =RefInvoke.findMethodExact("org.apache.http.impl.client.AbstractHttpClient",ClassLoader.getSystemClassLoader(),

    "execute", HttpHost.class, HttpRequest.class,HttpContext.class);

    hookhelper.hookMethod(executeRequest, newAbstractBahaviorHookCallBack(){

    @Override

    publicvoiddescParam(HookParam param) {

    // TODO Auto-generated method stub

    Logger.log_behavior("Apache Connect to URL ->");

    HttpHost host = (HttpHost) param.args[0];

    HttpRequest request = (HttpRequest) param.args[1];

    if(request instanceoforg.apache.http.client.methods.HttpGet) {

    org.apache.http.client.methods.HttpGet httpGet =(org.apache.http.client.methods.HttpGet) request;

    Logger.log_behavior("HTTP Method : "+ httpGet.getMethod());

    Logger.log_behavior("HTTP GET URL : "+httpGet.getURI().toString());

    Header[] headers = request.getAllHeaders();

    if(headers != null) {

    for(inti = 0; i < headers.length;i++) {

    Logger.log_behavior(headers.getName() + ":"+headers.getName());

    }

    }

    } elseif(request instanceofHttpPost) {

    HttpPost httpPost = (HttpPost) request;

    Logger.log_behavior("HTTP Method : "+ httpPost.getMethod());

    Logger.log_behavior("HTTP URL : "+httpPost.getURI().toString());

    Header[] headers = request.getAllHeaders();

    if(headers != null) {

    for(inti = 0; i

    Logger.log_behavior(headers.getName() + ":"+headers.getValue());

    }

    }

    HttpEntity entity = httpPost.getEntity();

    String contentType = null;

    if(entity.getContentType() != null) {

    contentType =entity.getContentType().getValue();

    if(URLEncodedUtils.CONTENT_TYPE.equals(contentType)) {

    try{

    byte[] data =newbyte[(int) entity.getContentLength()];

    entity.getContent().read(data);

    String content =newString(data, HTTP.DEFAULT_CONTENT_CHARSET);

    Logger.log_behavior("HTTP POST Content : "+ content);

    }catch(IllegalStateException e) {

    // TODO Auto-generatedcatch block

    e.printStackTrace();

    } catch(IOException e) {

    // TODO Auto-generatedcatch block

    e.printStackTrace();

    }

    }elseif(contentType.startsWith(HTTP.DEFAULT_CONTENT_TYPE)) {

    try{

    byte[] data =newbyte[(int) entity.getContentLength()];

    entity.getContent().read(data);

    String content =newString(data, contentType.substring(contentType.lastIndexOf("=") +1));

    Logger.log_behavior("HTTP POST Content : "+ content);

    }catch(IllegalStateException e) {

    // TODO Auto-generatedcatch block

    e.printStackTrace();

    } catch(IOException e) {

    // TODO Auto-generatedcatch block

    e.printStackTrace();

    }

    }

    }else{

    byte[] data = newbyte[(int)entity.getContentLength()];

    try{

    entity.getContent().read(data);

    String content =newString(data, HTTP.DEFAULT_CONTENT_CHARSET);

    Logger.log_behavior("HTTP POST Content : "+ content);

    } catch(IllegalStateException e){

    // TODO Auto-generatedcatch block

    e.printStackTrace();

    } catch(IOException e) {

    // TODO Auto-generatedcatch block

    e.printStackTrace();

    }

    }

    }

    }

    @Override

    publicvoidafterHookedMethod(HookParam param) {

    // TODO Auto-generated method stub

    super.afterHookedMethod(param);

    HttpResponse resp = (HttpResponse) param.getResult();

    if(resp != null) {

    Logger.log_behavior("Status Code = "+resp.getStatusLine().getStatusCode());

    Header[] headers = resp.getAllHeaders();

    if(headers != null) {

    for(inti = 0; i

    Logger.log_behavior(headers.getName() + ":"+headers.getValue());

    }

    }

    }

    }

    });

    对 HttpURLConnection 的 hook Zjdroid 未能提供完美的解决方案,想要取得除了 URL 之外的 data 字段必须对I/O流操作.

    Method openConnectionMethod =RefInvoke.findMethodExact("java.net.URL",ClassLoader.getSystemClassLoader(), "openConnection");

    hookhelper.hookMethod(openConnectionMethod,newAbstractBahaviorHookCallBack() {

    @Override

    publicvoiddescParam(HookParam param) {

    // TODO Auto-generated method stub

    URL url = (URL) param.thisObject;

    Logger.log_behavior("Connect to URL ->");

    Logger.log_behavior("The URL = "+ url.toString());

    }

    });

    我采取的临时解决方法是对I/O 进行正则匹配,类似 url 的 data 字段就打印出来,代码如下(这段代码只能解决前文 HttpUtils而且会有误报,大家有啥好想法欢迎指点一二)

    findAndHookMethod("java.io.PrintWriter",lpparam.classLoader, "print",String.class, newXC_MethodHook() {

    @Override

    protectedvoidbeforeHookedMethod(MethodHookParam param) throwsThrowable {

    String print = (String) param.args[0];

    Pattern pattern = Pattern.compile("(\\w+=.*)");

    Matcher matcher = pattern.matcher(print);

    if(matcher.matches())

    Log.i(tag+lpparam.packageName,"data : "+ print);

    //Log.d(tag,"A :" + print);

    }

    });

    因为Android-async-http重写了 HttpGet 导致 Zjdroidhook 失败(未进入 HttpGet 和 HttpPost 的判读),加入一个else 语句就可以解决这个问题

    else{

    HttpEntityEnclosingRequestBase httpGet =(HttpEntityEnclosingRequestBase) request;

    HttpEntity entity =httpGet.getEntity();

    Logger.log_behavior("HttpRequestBase URL : "+httpGet.getURI().toString());

    Header[] headers =request.getAllHeaders();

    if(headers != null) {

    for(inti = 0; i

    Logger.log_behavior(headers.getName() + ":"+headers.getName());

    }

    }

    if(entity!= null){

    try{

    String content = EntityUtils

    .toString(entity);

    Logger.log_behavior("HTTP entity Content : "

    +content);

    }catch(IllegalStateException e) {

    // TODOAuto-generated catch block

    e.printStackTrace();

    }catch(IOException e) {

    // TODO Auto-generated catchblock

    e.printStackTrace();

    }

    }

    展开全文
  • 用Android Studio编写Xposed hook模块

    千次阅读 2019-06-02 18:21:02
    过去用Eclipse写过很多Xposed hook模块,并有一定的封装,这几天临时用到Android Studio编写Xposed模块遇到一些坑,现在做一个笔记。 二.Android Studio编写Xposede的步骤 书写过程中,没有特定的步骤,只是按照个人...
  • 我正在尝试制作一个Xposed模块.我首先阅读了一个教程,其中包含了操作时钟的指令.代码如下:package de.robv.android.xposed.mods.tutorial;import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;...
  • 原标题:Art 模式 实现Xposed Native注入前言...安卓目前沙盒注入 方式应该就两种Ptrace 和 Zygote,各有各的优点和短板 ,曾经Hook之王 Xposed 在 Native层显得比较无力,也就导致市场上很多模块都不能进行Nativ...
  • 1.私自收集IMEI //私自收集IMEI XposedHelpers.findAndHookMethod( android.telephony.TelephonyManager.class.getName(), //需要hook的类名 lpparam.classLoader, //类加载器 ...
  • Xposed Hook专题

    2020-09-24 15:54:39
    Xposed Hook模块开发教程,从Xposed框架安装,到Xposed模块开发,详细讲解Xposed中使用到的类与方法,以及实战案例分析。
  • 自己写的hook方法,某些函数似乎都hook不成功甚至会导致其它hook失效。 ``` XposedHelpers.findAndHookMethod("java.io",loadPackageParam.classLoader,"File", new XC_MethodHook() { @Override protected void...
  • 摘要:Xposed是一款可以在不修改APK的情况下影响程序运行的框架服务,基于Xposed能够制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在本文中,作者详细介绍了Xposed的操作步骤以及登陆劫持实战演练。...
  • start:2020年8月27日 一、前言: 最近在分析某看点App的网络协议,通过...Hook框架:Xposed 二、第一步:创建项目 根据自己的需求选择项目模块,然后填入项目名、项目路径即可。(截图只做参考) 三...
  • 由于某些课程实验的要求,需要通过xposed框架对某应用进行hook操作,笔者选用了开源且免费的xposed框架进行实现。虽然网上存在一些利用xposed实现特定功能的文章资源,但大多均将xposed模块的构建作为一个小节内容...
  • <div><p>新建文本文档 (2)....华为畅玩8C Android8.1上测试 使用Xposed模块, 打开微信7.0.3过几秒直接闪退, log在附件, 麻烦看下什么原因,谢谢. </p><p>该提问来源于开源项目:ganyao114/SandVXposed</p></div>
  • 众所周知,Xposed 是一个系统级别的软件框架,它与 Cydia Substrate 不同,Xposed 仅可 hook app_process 中的 java 函数,不过对于大部分的 Android 应用来说已经足够了;它所提供的 API 可以供模块开发者在不修改...
  • 摘要:Xposed是一款可以在不修改APK的情况下影响程序运行的框架服务,基于Xposed能够制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在本文中,作者详细介绍了Xposed的操作步骤以及登陆劫持实战演练。 ...
  • “前言:初学逆向 请多多指教”学习到的内容—1、编写Xposed模块实现对java层的加密库进行hookXposed API介绍—什么是自吐算法模块?1、对jdk自带的加密类的包中的类的构造函数进行hook2、对jdk自带的加密类的包中的...
  • Xposed 模块 Nnnen助手[Soul 抖音 皮皮虾Hook]Soul App抖音 App皮皮虾 App Soul App 图片去水印(支持瞬间,广场,聊天图片) 视频去水印(支持瞬间,广场,聊天图片) 聊天消息防止撤回 抖音 App 视频去水印 皮皮虾 App...
  • xposed逆向安全环境搭建 包括: xposed环境搭建 + xposed简单hook实例 + 编译 hookdemo apk frida环境搭建包括: python + frida最新版+ nodejs+ vscode + 简单frida代码hook实例 需要远程搭建调试 请点击 进入
  • 9.来到app/src/main/Assets,右键Assets选择NEW,创建一个File,命名为xposed_init 里面的内容是hook模块的入口点,本例中的包名以及入口点是com.xiaolajiao.myhook.Test所以这个文件里就写了这个,具体你们的包名是...
  • xposed开发过程中遇到了直接使用模块内置资源失效的问题,而且这个问题很诡异,有时候失效,有时候有效果,没效果的时候一般是显示一把叉叉 在上网搜索后发现,hook函数是在被hook应用内部执行的,环境不一样,...
  • 1. Xpatch概述Xpatch是一款利用重打包的方式,使得被处理的Apk启动时自动加载Xposed模块,来实现应用内Hook的工具。项目地址:https://github.com/WindySha/Xpatch2. Xpatch处理apk分析Xpatch修改apk,主要有三个...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 194
精华内容 77
热门标签
关键字:

hook模块xposed