吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 56395|回复: 109
收起左侧

[Android 原创] 【Xposed模块开发入门】真·第一课

    [复制链接]
MingKing 发表于 2018-1-18 03:41
本帖最后由 MingKing 于 2018-1-18 14:59 编辑

【Xposed模块开发入门】真·第一课

之前按网上的教程来,遇到各种问题,所幸问题一一得到解决,下面整理一篇详细的入门教程,细节地方皆详细说明(如有不懂的地方,评论区问我,以便我稍加修改)


本次在android studio上进行讲解,因为感觉现在用这个的人比较多,问题也多

【开始前的准备】

1.掌握基本的android开发知识,搭建好android开发环境(环境怎么搭啥的也有一堆蛋疼问题,这里就不说了,改天我仔细探索整理一下)
2.有xposed框架作为环境(真机或者模拟器,我下面直接真机调试)
3.Xposed框架API(网上各种坑爹教程附各种不知啥时候会挂掉,资源老,老子可能要账号才能下载的坑爹链接,也不给个官网地址,所以)
   由于它是不断更新的,请大家直接到官网页面进行下载:https://jcenter.bintray.com/de/robv/android/xposed/api/


下载如下两个文件:api-82-sources.jar   
                                api-82.jar

下方括号中是使用eclipse要注意的,android studio不用管
(在Eclipse中,你必须从这里手动下载jar:https : //jcenter.bintray.com/de/robv/android/xposed/api/我建议将这些文件放到一个名为的子目录中lib。不要把它们放到libs子目录中!Jar文件libs将自动使Eclipse将API类编译到您的APK中,但它们只能被引用(参见上文)。现在右键单击该api-XX.jar文件并选择Build Path -> Add to Build Path。您还可以添加一个源api-XX-sources.jar文件(在文件中),以便在Eclipse中直接查看文档。)(懒得打了,直接官网copy)


【环境的搭建】
就是将Xposed框架API引用到项目中,这样就能进行Xposed模块的开发了

1.使用android studio构建一个项目


(小提示,注意设置为project查看,这样项目结构看得更加清楚)


LYZS9ZAV~W1)G2Z(QZ[F.png

下方修改处皆在上图中用箭头指出(build.gradle是app文件夹中的,注意不要搞错


1.将下载下来的两个文件复制到文件夹libs中


2.在build.gradle中将添加图中两句
~GL7N`5D@S1_O}C_HLN4OKM.png

[Java] 纯文本查看 复制代码
provided 'de.robv.android.xposed:api:82'
provided 'de.robv.android.xposed:api:82:sources'


有人说
provided 'de.robv.android.xposed:api:82:sources'
这句不是必要的,确实,它里面存放了javadoc,方便Ctrl+Q快速查阅,反正也是一堆英文看着晕,不写这句也行

作用:将libs中的Xposed框架API引用到项目中(构建依赖)

可能会遇到的问题:

1.这两句报错!?
provided 'de.robv.android.xposed:api:82'
provided 'de.robv.android.xposed:api:82:sources'

异常:
[Asm] 纯文本查看 复制代码
Error:A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugApkCopy'.
   > Could not resolve com.squareup.okhttp3:okhttp:3.5.0.
     Required by:
         retrofit-rxjava-okhttp:app:unspecified > com.squareup.retrofit2:retrofit:2.1.0
      > No cached version of com.squareup.okhttp3:okhttp:3.5.0 available for offline mode.


这个问题是因为之前我android环境没有搭建好,改动了一些配置导致,大家通常应该不会遇到这个问题

解决方法:
Settings-Build.Execution,Deployment-Gradle–取消勾选的Offline Work,重新编译即可
EQ_[E]U}7LI2WIAW]9H(S.png


2.使用compile fileTree(dir: 'libs', include: ['*.jar'])导致出错


一定要使用 provided ,不要使用 compile! compile 会将整个 API 类 编译进你的apk中而导致出问题。provided 则只是提供了API 类的引用,
API 类真正的实现则在 Xposed FramWork中。 在大多数情况下,repositories已经存在,并且已经有一些依赖,所以只需要将provided 这一
行添加到存在的dependcies模块中即可。


(之前我使用provided失败,就转而使用compile,结果还是失败,真的无语了,大家要注意)


3.在AndroidManifest.xml将自己标识为一个Xposed模块,语句添加在如下位置
J6(CD33S@XQDQ``NMQ5D_AJ.png

[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" />


作用:
xposedmodule:value为true,表示自己是一个xposed模块
xposeddescriptionvalue中的文字就是对模块的描述,这些能够在手机上的Xposed框架中看到,举个栗子
Screenshot_2018-01-18-01-05-00.png
情迁抢包是项目名,后面一堆文字描述就是在xposeddescription的value中标注的(这个抢红包贼稳)

xposedminversionxposed最低版本,这些应该都是向下兼容的吧?所以直接填最低版本好了

4.下面就可以开车啦


【第一个Xposed模块的编写】
直接输出日志什么的太low了,找其他软件hook我怕被举报(放屁,其实是我特么也还不会),所以就自己写个类来hook练练手吧!


我们先写一个MainActivity类输出一个Toast提示,然后再写一个HookToast类作为Xposed模块来hook它,实现修改


0.在界面中添加一个可爱的小button
@_E8N[]@2]]Q`CASW8%([60.png

1.代码逻辑如下:

[Java] 纯文本查看 复制代码
public class MainActivity extends AppCompatActivity {
    private Button button;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    public String toastMessage() {
        return "我未被劫持";
    }

}


比较容易理解,这个类的功能是,点击按钮,弹出一个toast提示,内容由toastMessage()方法提供,而toastMessage()的返回值为“我未被劫持


下面我们正式开始写我们的xposed模块,来hook我们的MainActivity,修改toastMessage()方法的返回值为“你已被劫持


2.我们新建一个HookToast类

[Java] 纯文本查看 复制代码
public class HookToast implements IXposedHookLoadPackage {

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

        if (loadPackageParam.packageName.equals("com.example.mingking.xposedtest")) {
            
            Class clazz = loadPackageParam.classLoader.loadClass("com.example.mingking.xposedtest.MainActivity");
            
            XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                }
                
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.setResult("你已被劫持");
                }
            });
        }
    }
}


这个类实现IXposedHookLoadPackage接口,并实现IXposedHookLoadPackage接口中的handleLoadPackage方法


代码中,hook的包名记得改成自己的

在handleLoadPackage方法中先筛选到我们本程序的包名,然后用XposedHelpers里的findAndHookMethod方法对
MainActivity中的toastMessage方法进行劫持,在其Hook的回调中的beforeHookedMethod或afterHookedMethod
方法里进行劫持操作


afterHookedMethod方法中,我们修改了toastMessage()方法的返回值为你已被劫持


beforeHookedMethod方法中,我们什么也不用做,当然,我们也可以在xposed日志中输出一点调试信息玩耍一下,
方法中添加语句:


[Java] 纯文本查看 复制代码
XposedBridge.log("别看了,老子已经成功Hook");



到此,所有代码已经写完,之前在AndroidManifest.xml中标识了我们的项目是一个Xposed模块,可是我们可能会有许多Activity,
它怎么才能知道模块的入口在哪呢?


所以,下面要告诉Xposed框架,我们的应用中,Xposed模块的入口到底在哪。

3.标注Xposed模块入口

右键点击 main , 选择new --> Folder -->Assets Folder,然后确认即可。

(UK}2HD9{FCNCII(2VPW%6J.png

在assets中new一个file,文件名为xposed_init(文件类型选text),并在其中写上入口类的完整路径(下面是我的类路径,你们填自己的,就是activity中packege后面的包名)
PPRN$HA)@FFH){]7SH`(1.png

9{RONL$EJARI0VC6I9[2TI5.png


这样,xposed框架就能够读取xposed_init中的信息来找到模块的入口

4.Run

请确保禁用Instant RunFile -> Settings -> Build, Execution, Deployment -> Instant Run),否则您的类不会直接包含在APK中,导致HOOK失败!!!

43L@1D}VJ]QN)KL%P7LDC5G.png

以上是来自官方的警告,一定要注意,之前我死活hook不了,日志也输出不了,就是因为这个!!!

如果你不这样做,你会惊喜地发现发现xposed日志反复给你抛出类似这样一个错误:
xposed didn't find class on dexpathlist:……(省略一长串)
而这个错误是你百度到死(google也没用)也不一定查的到解决方案的(这个故事提醒我们要仔细阅读官方文档)

Run成功后……

可以发现,xposed模块里出现了我们的模块
XposedTest是应用名
后面的文字注释正是我们之前在AndroidManifest.xml中的xposeddescription里所标注的信息
Screenshot_2018-01-18-01-41-13.png

xposed模块生效前
Screenshot_2018-01-18-01-41-23.png

勾选并重启
Screenshot_2018-01-18-01-46-27.png


啦啦啦,成功!!!


再让我们看看xposed框架里的日志

Screenshot_2018-01-18-01-54-29.png


完全没毛病!!!(hook的是toastMessage()方法,它每次被调用都会在hook之前输出日志,hook之后修改返回值,我之前点击了三次,所以输出了三条


到此,你就算是入坑xposed了,当然,上面的例程比较简单,实际的应用要复杂得多,大家可以到github找些开源项目学习一下,不懂的地方多多参照官方API文档:
http://api.xposed.info/reference/packages.html


【参考资料】
1.http://blog.csdn.net/mrglaucusss/article/details/50963542
2.https://www.52pojie.cn/thread-533120-1-1.html
3.https://www.cnblogs.com/dacainiao/p/6002609.html
4.https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
5.https://github.com/rovo89/Xposed ... posed-Framework-API
6.http://blog.csdn.net/w958796636/article/details/52919582
7.http://blog.csdn.net/aa464971/article/details/68948650

后续暂时没有时间深入学习,如果有,我再分享新的教程,当然,我可能在那之前你们可能已经更牛了,当然也欢迎你们分享学习成果

如果大家遇到什么新的问题,可以在评论区反馈,以便我及时更新整理完善,帮助后来之人

免费评分

参与人数 68威望 +1 吾爱币 +73 热心值 +65 收起 理由
ovwane + 1 + 1 谢谢@Thanks!
LoveXinel + 1 + 1 热心回复!
丶咖啡猫丶 + 1 + 1 我很赞同!
b_night + 1 + 1 谢谢@Thanks!
穿透骨頭撫摸妳 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
我爱杨欣 + 1 + 1 用心讨论,共获提升!
依然小圣 + 1 + 1 libs里可以不放jar的,都用gradle管理即可
七情哥哥 + 1 + 1 我很赞同!
hotwater10 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yaont + 1 + 1 谢谢@Thanks!
Ganlv + 1 用心讨论,共获提升!
iso9001 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
一大碗饭 + 1 + 1 热心回复!
woaishamao + 1 谢谢@Thanks!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hackerchen + 1 + 1 谢谢@Thanks!
破解project + 1 这个教程已经发了很多次,也看不出比之前的xposed教程帖有什么出众的地方,.
yuanmengxiaozi + 1 + 1 用心讨论,共获提升!
至尊舞帝 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
2585281523 + 1 + 1 我很赞同!
tetora + 1 + 1 按教程做了一遍还是未被劫持。。。。。。大佬留个联系方式,好让我问下
海盗小K + 1 + 1 我很赞同!
wy0515 + 1 + 1 用心讨论,共获提升!
wtzql + 1 + 1 谢谢@Thanks!
w731883875 + 1 + 1 完全看不懂
talentmu + 1 我很赞同!
samohyes + 1 + 1 我很赞同!
迷失丶泪 + 1 + 1 不错的教程,后续教教我们如何反编译软件哈。
zuohaoda + 1 + 1 热心回复!
玩世不攻 + 1 + 1 谢谢@Thanks!
有刁民想害宝宝 + 1 + 1 支持!
Eternity-Myth + 1 + 1 谢谢@Thanks!
duanjia0912 + 1 + 1 感谢,,希望继续续写下去。。
gunxsword + 1 + 1 必需评分啊,这是看过的最详细的讲解,虽然很多地方不会,不过能学到好多了已.
AnkhSpirit + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dwq308 + 1 + 1 我很赞同!
夜曲 + 1 + 1 我很赞同!
益达min + 1 + 1 谢谢@Thanks!
hgd_icbc + 1 用心讨论,共获提升!
360573078 + 1 + 1 谢谢楼主,希望多出一些这样的教程!
Night_月殇 + 1 + 1 热心回复!
tanghengvip + 1 + 1 真正的干货来啦
帅的谁爱 + 2 + 1 哈哈,我写了一个一键配置所有hook环境的模板,studio
hdc8899 + 1 + 1 早就想学习了。终于遇见你
z5948850 + 1 + 1 谢谢@Thanks!
plasd + 1 + 1 谢谢@Thanks!
mz135135 + 1 + 1 用心讨论,共获提升!
龙不死 + 1 我很赞同!
帅哥没人陪 + 1 + 1 我很赞同!
栀蓝 + 1 + 1 谢谢@Thanks!
Jamesstrange + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
joseph + 1 + 1 我很赞同!
qq272285154 + 1 + 1 用心讨论,共获提升!
forgiveboo + 1 + 1 谢谢@Thanks!
yzw1130 + 1 我很赞同!
164738777 + 1 + 1 热心回复!
dimo + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wi5101 + 1 + 1 用心讨论,共获提升!
skdxg + 1 + 1 我很赞同!
131415 + 1 + 1 有没有专门学习这个的地方或书籍?
hihi9992010 + 1 + 1 支持框架
夏雨微凉 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
chentianlong + 1 + 1 我很赞同!
挥洒灵魂 + 1 + 1 谢谢@Thanks!
白水饮 + 1 用心讨论,共获提升!
凯林哥与你同在 + 1 + 1 我很赞同!
冷火凉烟 + 1 + 1 我很赞同!
txzh + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

默默伤心 发表于 2019-8-22 11:49
本帖最后由 默默伤心 于 2019-8-22 11:50 编辑

我编写完成后 点击button 为什么显示未被劫持呢
[Java] 纯文本查看 复制代码
package com.xposed.examcool.hook;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class HookToast implements IXposedHookLoadPackage {

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        XposedBridge.log("别看了,老子已经成功Hook");
        if (loadPackageParam.packageName.equals("com.xposed.examcool")) {

            Class clazz = loadPackageParam.classLoader.loadClass("com.xposed.examcool.activity.MainActivity");

            XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                }

                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.setResult("你已被劫持");
                }
            });
        }
    }
}
xwzj20170829 发表于 2018-1-20 00:27
本帖最后由 xwzj20170829 于 2018-2-25 01:02 编辑

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class HookToast implements IXposedHookLoadPackage {

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

        if (loadPackageParam.packageName.equals("xp001.hook001")) {

            Class clazz = loadPackageParam.classLoader.loadClass("xp001.hook001.MainActivity");

            XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                }

                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.setResult("你已被劫持");

public class HookToast implements IXposedHookLoadPackage 我的这句话的HookToast下面有红色波浪线  丢失包的声明什么的  不会是模拟器用不了吧

我成功了    之前只显示"我未被劫持"    看了这篇文章后修改成功了https://www.52pojie.cn/thread-682743-1-1.html
qianeymax6274 发表于 2018-1-18 04:28
ljm115 发表于 2018-1-18 07:16 来自手机
非常好的教程,给力
debug_cat 发表于 2018-1-18 07:24 来自手机
如果一个actvity中有一个handler,如何hook这个handler的,handler message方法的返回值msg呢
psp7456 发表于 2018-1-18 07:31 来自手机
不错,正需要这方面的资料,学习了!
凯林哥与你同在 发表于 2018-1-18 07:54
非常感谢分享    很有帮助   
挥洒灵魂 发表于 2018-1-18 08:31
楼主666啊,这么好的帖子竟然没人看。嘿嘿,心中窃喜,得到宝贝一样哭晕
yxjoe 发表于 2018-1-18 08:35
教程挺不错的,感谢楼主分享
打卤楠楠 发表于 2018-1-18 08:37
谢谢楼主分享,学习学习
夏雨微凉 发表于 2018-1-18 08:41
好贴!跟着楼主来一遍
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 11:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表