Xposed框架与Drozer测试框架学习-Hook篇

一、前言

Xposed框架是Android中Hook技术的一个著名框架。另一个是CydiaSubstrate,但是这个框架是收费的,可能因为它可以Hook到C++层所以在使用上有点难度,个人感觉这个框架可以作为高阶应用,简单的只在Java层做Hook应用就使用Xposed框架就可以了。Xposed它是免费且开源的,网上有很多文章介绍Xposed。

二、前提

本人测试环境:
Nexus 5 (这个大家随意,只要是Android手机就行)
Android 4.4.4 (已经root过,Xposed框架需要root权限)
准备Xposed框架文件,这里需要注意的是,它针对不同系统发布了多个版本,所以你需要针对自己设备系统版本下载对应的框架。
(注:框架的安装和使用网上有很多文章,这里不再赘述)

三、编写测试app

Xposed.apk是一个模块管理器,我们如果想做hook操作还得自己编写模块安装到设备中。模块安装成功这个框架工具app可以检测出来,会提示你加载模块然后重启生效。

(注:我编写的测试app和模块是在一个项目中)

第一步:

使用Android Studio创建项目,项目名为XPhooktDemo。将项目视图切换为Project,在app目录下创建lib文件夹,在lib文件夹下放入XposedBridge.jar。(这里说明为什么要创建lib文件夹,在网上大部分文章都写的是添加到libs中,但是我自己实验发现这样是不能运行的,模块加载重启后日志提示框架错误。)

在项目上右键,选择open module Settings

在Project Structure窗口中点击Dependencies视图卡

第二步:

创建简单输入验证,输入正确弹出新的界面,输入错误弹出错误提示Toast。

源码:

public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    Button mButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.edit);
        mButton = (Button) findViewById(R.id.btn);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String count_a;
                count_a = mEditText.getText().toString();
                if (!count_a.isEmpty()){
                    if (isEquals(count_a))
                    {
                        Toast.makeText(MainActivity.this,"OK",Toast.LENGTH_SHORT).show();
                        Intent start = new Intent(MainActivity.this,welcome.class);
                        startActivity(start);

                    }
                    else
                        Toast.makeText(MainActivity.this,"ERROR",Toast.LENGTH_SHORT).show();
                }

                Toast.makeText(MainActivity.this,"NULL",Toast.LENGTH_SHORT).show();
            }
        });
    }
    private boolean isEquals(String count){
        if (count.equals("15pb")){
            return true;
        }
        return false;
    }
}

在点击事件中调用了isEquals方法做比较。比较的值是 "15pb"。

第三步:

编写模块,创建实现IXposedHookLoadPackage接口的类

源码:

public class Main implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

        //打印装载的apk程序包名
        XposedBridge.log("Lanuch app:"+loadPackageParam.packageName);

        //你想操作的应用的包名,这里为这个项目自身的包名
        if (loadPackageParam.packageName.equals("com.example.a71037.xphooktdemo")) {
            Class clasz = loadPackageParam.classLoader.loadClass("com.example.a71037.xphooktdemo.MainActivity");
            //hook MainActivity的 isEquls 方法
            XposedHelpers.findAndHookMethod(clasz, "isEquals", int.class, new XC_MethodHook() {
                //方法执行前进行的操作
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    Integer para1 = (Integer) param.args[0];   //获取参数1
                    String s1 = Integer.toString(para1);
                    Log.v("hook before param1:", s1);
                    param.args[0] = "15pb";  //设置参数1,也就是将isEquls的参数恒定
                    Log.v("hook", "before hook!");
                    XposedBridge.log("hook before param1:" + s1);
                }

            });
        }
    }
}

清单文件:

  <!-- 作为xposed模块 -->
        <meta-data
            android:name="xposedmodule"
            android:value="true"/>

        <!-- 模块描述 -->
        <meta-data
            android:name="xposeddescription"
            android:value="模块描述"/>

        <!-- XposedBridgeApi的最低版本号 -->
        <meta-data
            android:name="xposedminversion"
            android:value="82"/>

第四步:

验证结果,在isEquals方法中比较输入的字符串是否为15pb,在经过hook后将所有的输入的参数修恒定改为15pb,这样无论我们输入什么,他返回的永远是true。

四、实际用途

本文介绍了Xposed框架的基本使用以及一个简单的例子,但是这个框架是非常有用的最常用的当属破解,也可进行脱壳、外挂等。

五、总结

本文是介绍Xposed的基础使用,通过自己编写测试app加深理解。内容比较简单但却是我学习的记录,如果对你有用希望您点个赞。

(如果懒得写代码需要提供apk,可发我邮箱索要:[email protected])

时间: 2024-08-26 14:23:10

Xposed框架与Drozer测试框架学习-Hook篇的相关文章

十大免费移动程序测试框架(Android/iOS)

十大免费移动程序测试框架(Android/iOS) 概述:本文将介绍10款免费移动程序测试框架,帮助开发人员简化测试流程,一起来看看吧. Bug是移动开发者最头痛的一大问题.不同于Web应用程序开发,你可以时刻发现并修复Bug,而移动应用程序中的Bug隐藏得很深,直到用户使用时才发现问题.这样一来,不仅有损产品在市场上的名声,而且还会影响销售.所以在产品发布以前,开发人员需要严格测试程序.本文将介绍10款免费移动程序测试框架,帮助开发人员简化测试流程,一起来看看吧. Appium for iOS

Spring TestContext测试框架搭建

同样是测试,JUnit和Spring TestContext相比,Spring TestContext优势如下: 1.Spring TestContext可以手动设置测试事务回滚,不破坏数据现场 2.在测试类中不用手动装配bean,只要一个@Autowired即可自动装配 ----------------分割线--------------------------- 本文记录web project和java project如何使用TestContext测试框架,首先介绍web project 现总

软件测试第三周——测试框架

首先,先来了解一下测试框架 测试框架的属性: 1. 测试框架是测试开发过程中提取特定领域测试方法共性部分形成的体系结构 2. 测试框架的作用:在其基础上重用测试设计原则和测试经验,调整部分内容便可满足需求,可提高测试用例设计开发质量,降低成本,缩短时间 3.测试框架类型根据测试领域不同而改变 4.测试框架是一个半成品,需要测试工程师基于它转化成自己的测试用例: 5.测试框架是提供给测试人员开发相应领域测试用例的测试分析设计工具 6.测试框架不是测试用例集,而是通用的,具有一般性的系统主体部分.测

Pyunit测试框架

一.概述 本系列主要解决的问题是“接口自动化测试”,选择的测试语言是 python 脚本语言.截至目前为止,python是公认的最好的用于自动化应用的语言之一 二.PyUnit测试框架 使用 python 作为自动化编程语言,那么就自然的使用 pyunit 作为自动化测试框架了.测试框架unittest要达到如下目标: ● 支持自动化测试 ● 让所有的测试脚本共享 开启(setup) 和 关闭(shutdown) 的代码 ● 可以通过集合(collections)的方式来组织测试用例脚本 ● 将

集成C#测试框架和Selenium对于Web系统实现自动化测试

系统环境: 软件需求: Visual C# 2010,Mozilla Firefox,Selenium 硬件需求: Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间 内容简介: 1. 利用Spy++进行Windows对象识别,查找Windows计算器中的3类不同的对象,列出这些对象的常规属性. 2. 利用Selenium测试脚本录制以下操作: (1) 在Firefox地址栏中输入淘宝网主页网址http://www.taobao.com/,回车载入网页

Go语言开发(二十)、GoStub测试框架

Go语言开发(二十).GoStub测试框架 一.GoStub简介 GoStub是一款轻量级的单元测试框架,接口友好,可以对全局变量.函数或过程进行打桩.GoStub安装:go get github.com/prashantv/gostub 二.GoStub常用方法 gostub用于在测试时打桩变量,一旦测试运行时,重置原来的值. type Stubs struct { // stubs is a map from the variable pointer (being stubbed) to t

学习心得——测试框架浅析

笔者按:       在这一学期的软件测试课程学习中,我逐渐接触到了软件测试的相关知识,实现了从较为关注软件编写与实现等前端内容到逐渐理解软件测试等项目后期环节的跨 越与 转变.而在软件测试领域,我们经常会听到测试框架这个名词,那什么是测试框架?它在软件测试中起到什么样的作用?我将就自己浅薄的学习心得,在这里为大 家做一个简单的分析与交流. 正文:          我们先来看一下百度百科给出的关于“框架”一词的定义:“框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问

软件测试学习笔记week 3 --- 测试框架初体验

测试框架初体验 在这周的软件测试课上,第一次了解了软件测试框架的概念.软件测试框架包含的范围非常广,从自动化测试框架到单元测试框架以及性能测试框架.在上个寒假中,在学习Coursera的在线课程时发现普林斯顿的单元测试做得非常强大,从程序正确性到Time consuming甚至Memory consuming,几乎能发现程序中的每一处错误或者缺陷.因此,在上完了这周的课程后,我查阅了一些资料,做了这篇随笔记录了解到的单元测试的知识. 一.什么是测试框架 要认识测试框架,首先要对所谓框架有概念.框

测试驱动开发(TDD)及测试框架Mocha.js入门学习

组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型.由此将不存在QA的角色,或者仅存很少的QA用于系统模块间的集成测试. 因此代码的测试与开发都将由开发者(Developer)来保证. 这就需要借助优秀测试框架的帮助,尤其是支持TDD开发模式的自动化测试框架更为重要,因为我使用的编程是语言是Node.js,那么广泛使用的Mocha.js将成为我的首选. 在团队转型过程中,很多事情