转载自:http://blog.csdn.net/qq_18870023/article/details/51753587

Android逆向工程里常用到的工具除了的dex2jar,jd-gui,  Apktool之外还有一个Xposed。

这个工具是一个在不修改APK的情况下,影响其运行过程的服务框架。可以根据自己的需求编写模块,让模块控制目标应用的运行。

因为本人也是新手,对于Xposed用法还有很多的不熟悉,所以只对其hook技术进行简单的介绍,并让hook技术应用到以后的逆向分析工程中。

至于什么是hook,不了解的话就先去百度一下,这里基于菜鸟有限的经验,我只能说是一种函数拦截技术~

首先,下载Xposed框架,我这里就不提供下载了,然后手机必须得先root,不然是无法安装Xposed框架的,毕竟hook技术已经是个系统级的过程,所以你懂的~

这只是一个框架而已,并没有什么功能,为了实现个人需求,我们还需要自己编写模块,让这个框架去加载你的模块。

举个栗子,你要去知道手机某个应用包中的某个类中的某个方法中的某个参数,那么你的模块就要指明那个包,哪个类,哪个方法,当系统重启时加载目标应用包时,加载了你的模块的Xposed框架会识别到,接下来,如果你指明的应用中的某一方法被系统执行了,那么Xposed也会识别到,然后让你的模块去Hook(顾名思义,就是就是钩子,陷阱的意思;也可以说是拦截)这个方法,并可以利用模块的接口让方法的参数和返回结果暴露出来。

在本次的博客中,只是结合例子简单的介绍Xposed的hook,实际上Xposed的功能貌似不止于此~

框架弄好了,接下来就可以根据需求编写模块了,不过,再此之前先明确一下需求,我们可以用一个简单的登录系统APP进行测试。

先贴个简单的代码出来先:

[java] view plaincopy
  1. public class LoginActivity extends Activity {
  2. private final String ACCOUNT="samuel";
  3. private final String PASSWORD="123456";
  4. private EditText etAccount, etPassword;
  5. private Button btnLogin;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_login);
  10. etAccount=(EditText)findViewById(R.id.et_account);
  11. etPassword=(EditText)findViewById(R.id.et_password);
  12. btnLogin=(Button)findViewById(R.id.btn_login);
  13. btnLogin.setOnClickListener(new View.OnClickListener() {
  14. @Override
  15. public void onClick(View v) {
  16. if (isOK(etAccount.getText().toString(), etPassword.getText().toString())) {
  17. Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
  18. } else {
  19. Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
  20. }
  21. }
  22. });
  23. }
  24. private boolean isOK(String account, String password){
  25. return account.equals(ACCOUNT) && password.equals(PASSWORD);
  26. }

很简单的一个登录页面,其中的关键函数isOk(String, String)是用来验证账号密码是否正确的,其中我已定死为账号:samuel,密码:123456,也就是说我必须输入以上两个字符串,才能完成验证。

那么,重点就来了,我们就可以利用Xposed的模块hook到isOK(String, String)这个函数,并拦截到账号和密码,甚至可以修改账号和密码!!!

So,需求明确了,那么我们就可以针对性编写模块了。

编写模块步骤:

1、先新建一个Android Project,这个工程不需要界面,所以在工程创建导向时不需要添加MainActivity和layout_main.xml,就一个Empty工程即可;

2、在空工程的java文件夹中新建一个类,该类就是一个模块类,这里命名为“Module”,接下来就要配置一下AndaroidManfest.xml和添加xposed_init文件,如下图;

3、配置AndroidManifest.xml,其中的meta-data内容要照搬,反正我之前没照搬说明上的demo,结果出错了,所以那三个meta-data最好是照着写。

[html] view plaincopy
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.samuelzhan.xposehook">
  3. <application android:allowBackup="true" android:label="@string/app_name"
  4. android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
  5. <meta-data
  6. android:name="xposedmodule"
  7. android:value="true"/>
  8. <meta-data
  9. android:name="xposeddescription"
  10. android:value="Hook Test!"/>
  11. <meta-data
  12. android:name="xposedminversion"
  13. android:value="54"/>
  14. </application>
  15. </manifest>

4、在main文件夹下创建一个assets文件夹,并在里面创建一个普通的文件,命名为“xposed_init”,然后打开文件,在里面添加一句字符串,即   包名+模块类名。

5、新建一个文件夹,命名为“lib”或者“jar”,然后放进一个XposedBridgeApi.jar包,如上图,并在该jar包上右键Add as Library。这里必须注意两点细节,一是,放jar包的文件夹名字一定是“lib”或“jar”,亲测放到“libs”里没用;二是,需要在build.gradle里的dependencies将compile改为provided,不然会报错。听说是系统里已有该jar包内容,再次打包进去会冲突,所以改为provided,不要管那条红色波浪线,无碍~

6、编写模块类Module:

[java] view plaincopy
  1. public class Module implements IXposedHookLoadPackage {
  2. @Override
  3. public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
  4. if (loadPackageParam.packageName.equals("com.samuelzhan.logintest")) {
  5. XposedHelpers.findAndHookMethod("com.samuelzhan.logintest.LoginActivity",
  6. loadPackageParam.classLoader,
  7. "isOK",
  8. String.class,
  9. String.class,
  10. new XC_MethodHook() {
  11. @Override
  12. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  13. }
  14. @Override
  15. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  16. }
  17. });
  18. }
  19. }
  20. }

说明:

Module继承了IXposedHookLoadPackage接口,当系统加载应用包的时候回回调 handleLoadPackage;

XposedHelpers的静态方法 findAndHookMethod就是hook函数的的方法,其参数对应为   类名+loadPackageParam.classLoader(照写)+方法名+参数类型(根据所hook方法的参数的类型,即有多少个写多少个,加上.class)+XC_MethodHook回调接口;

这里的第一个参数类名必须要有包名前缀,即“packageName+className”,还有一点,如果代码被混淆过,即使你明知道代码中要hook的类名和方法名,但都不一定能用,必须以smali中的名字为准,比如:isOk()混淆之后在smali中的函数名为a,那么hook的时候就必须写a,而不是isOK,第一个参数类名同理!

参数里有一个监听类XC_MethodHook,该类在hook前后回调,通过回调方法的MethodHookParam可以拦截到函数参数。

Xposed除了hook目标应用的函数之外,还可以hook某些类的构造方法,对应的方法为XposedHelpers.findAndHookConstructor()。

至此,一个模块基本已完成,接下来将其打包 Build->Generate Signed APK...生成一个APK,并安装在手机上。因为没有MainActivity,所以安装后不会弹出任何界面,但若果此时手机已安装了Xposed,那么Xposed会在消息栏弹一个消息,通知你“模块已更新”,此时可以选择Xposed菜单中的 “框架”->"软重启",重启手机(软重启不会断电,相当于电脑的重启,比硬重启要快)。

到这里,已经可以hook函数了。

现在,试着去拦截isOK(String, String)函数中的账号密码,先在回调函数中添加日记打印代码将其账号密码参数暴露出来,顺便把返回结果也显示一下:

[java] view plaincopy
  1. new XC_MethodHook() {
  2. @Override
  3. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  4. XposedBridge.log("账号:"+(String)param.args[0]+"   密码:"+(String)param.args[1]);
  5. Log.d("zz","账号:"+(String)param.args[0]+"   密码:"+(String)param.args[1]);
  6. }
  7. @Override
  8. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  9. Log.d("zz", param.getResult().toString());
  10. }
  11. });

我在beforeHookedMethod中写了两种方法日志,第一个是XposedBridge的静态log,这个日志会显示在Xposed的日志选项里,个人不喜欢这种方法,因为每次运行你要hook的程序,又必须切换页面到Xposed查看日志,太麻烦了,但它有个优点,相比Android中的Log.d(), 它能显示抛出的异常 ,而Android Log不可以。第二个Android Log就不用说了,这里我两种都用了。

编写完后,我们重新打包这个模块,并安装到手机上,然后让手机软重启,每次更新安装模块都必须得重启才生效。

好,重启后,我们运行一下目标应用,输入账号密码~

然后看看Android Studio中的Logcat和 Xposed中的日志选项:

可以看到,两者都可以看到拦截到的密码账号。因为正确的账号密码为samuel  123456,这里只是随便输入zzz   aaa,所以返回的结果是false,当然也在回调函数afterHookedMethod中可以捕获得到,这里显示false,说明登陆验证失败。

除了能读取参数之外,hook技术还可以修改函数参数。

比如,接下来我修改模块,让其无论输入什么,我都实现登陆,那我先在hook中把账号密码修改成samuel  123456,也就是说,通过hook技术,我怎样输入都能成功登陆。

[java] view plaincopy
  1. new XC_MethodHook() {
  2. @Override
  3. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  4. //修改参数
  5. param.args[0]="samuel";
  6. param.args[1]="123456";
  7. }
  8. @Override
  9. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  10. Log.d("zz", param.getResult().toString());
  11. }
  12. });

然后重新打包,安装,重启手机,再次运行登陆页面的程序,再次输入zzz   aaa看看:

不错,显示登陆成功,说明修改参数成功。

其实Xposed貌似还有其他更强大的功能,这里只用了冰山一角进行逆向分析而已~

Android逆向分析之Xposed的hook技术相关推荐

  1. xposed安装,与android逆向工程之xposed的hook

    Xposed installer安卓安装和使用 文章目录 Xposed installer安卓安装和使用 (一)Xposed installer安卓安装 0.百度网盘-我所用的apk(3.1.5)和z ...

  2. Android 逆向分析大全

    转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...

  3. android逆向分析概述_Android存储概述

    android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...

  4. android逆向分析之从smali到java

    通过上一篇 android逆向分析之反编译,在dex2jar的前提下,我们获取到了源码,在apktool的前提下,我们可以获取到资源和smali文件,本篇主要讲述smali几个最基本的知识和smali ...

  5. Android逆向分析案例——某点评APP登陆请求数据解密

    今天,七夕,单身23载的程序汪,默默地写着博客~ 上一次的逆向分析案例中讲了如何去分析某酒店的APP登陆请求,为了进一步学习如何逆向分析以及学习其他公司的网络传输加解密,本次案例将继续就登陆请求的数据 ...

  6. Android逆向分析之Cydia

    最近开始使用Cydia Substrate框架进行逆向分析. Cydia是什么东东我就不多说了,自行百度,听说它可以越狱什么的,修改手机配置什么的,但这里只是通过一个例子,介绍如何使用Cydia Su ...

  7. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

  8. Android逆向分析(一) - 反编译看看手Q口令红包的实现原理

    原文:http://blog.zhaiyifan.cn/2016/02/09/android-reverse-1/ 本系列文章是<Android软件安全与逆向分析>的实践笔记(一些工具的版 ...

  9. Android逆向分析(1) 反编译看看手Q口令红包的实现原理

    前言 本篇文章是作者MarkZhai的逆向分析系列的第一篇,已授权发布,并计划之后该系列的更新会第一时间发布在本公号上,敬请关注! 原文 本系列文章是<Android软件安全与逆向分析>的 ...

最新文章

  1. sparkSQL1.1入门之二:sparkSQL执行架构
  2. SaaS颠覆传统软件到底是不是个伪命题?
  3. 大批物联网设备扎堆CES 物联网产业化提速
  4. IDEA 一直不停的scanning files to index解决办法
  5. 三维重建:闭环检测-相机闭环
  6. java反射基本使用,反射泛型参数类型获取
  7. MATLAB矩阵添加新元素
  8. c语言编程有限次数猜数游戏,用c语言编程猜数字
  9. ubuntu下载对应版本的linux内核源码
  10. Cp与Cpk了解与计算
  11. 2021新手、小白快速安装KALI教程
  12. 《C++ Primer 第5版》-12.1动态内存与智能指针-康奈尔笔记
  13. centos7离线安装wget
  14. Ext中TextField的 label和feild的间距的设定
  15. Linux CFS调度算法核心解析
  16. U大师U盘装系统——启动U盘制作(V1.2.0版)
  17. 搜狗收录怎么增加-搜狗站长推送工具
  18. 艺赛旗(RPA)word 文本差异比较
  19. 【原创】怎样关联多个 Excel 档工作表(Sheet)中的数据
  20. 据说程序员写完代码是这个样子,99%的人都中枪了

热门文章

  1. Matlab显示图像三维信息
  2. 【PTA-训练day6】L2-016 愿天下有情人都是失散多年的兄妹+ L1-011 帅到没朋友
  3. 软件工程毕业设计课题(21)基于JAVA毕业设计电子书小说网站系统毕设作品项目
  4. 合规性对区块链项目的重要性
  5. python批量测试网站加载时间_python测试网站访问速度
  6. 三国霸王大陆服务器维护,霸王大陆修改教程
  7. 计算机usb无法识别网络连接,usb无法识别是什么原因 usb无法识别解决方法【详解】...
  8. vue pc支付宝支付
  9. C++OpenCV系统学习(3)——图像混合、调整亮度与对比度
  10. VsCode新建VueJs项目