zoukankan      html  css  js  c++  java
  • Xposed框架之函数Hook学习

    作者:Fly2015

    Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架而且据说cydiasubstrate框架能实现Android的Java层和Native层的函数的Hook。学习Android的逆向也有一段时间了,记录一下学习Xposed框架的过程。

    Xposed框架的学习站点: http://repo.xposed.info/

     

    一、Xposed框架实现Hook的原理介绍

    Zygote是 Android 的核心,每执行一个 app。Zygote 就会 fork 一个虚拟机实例来执行 app,Xposed Framework 深入到了 Android 核心机制中,通过改造 Zygote 来实现一些非常牛逼的功能。Zygote 的启动配置在/init.rc 脚本中。由系统启动的时候开启此进程,相应的执行文件是/system/bin/app_process。这个文件完毕类库载入及一些函数调用的工作。

    当系统中安装了 Xposed Framework 之后,会对 app_process 进行扩展,也就是说,Xposed Framework 会拿自己实现的 app_process 覆盖掉 Android 原生提供的 app_process 文件。当系统启动的时候。就会载入由 Xposed Framework 替换过的进程文件,而且,XposedFramework 还定义了一个 jar 包,系统启动的时候。也会载入这个包:

    /data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar

     

    二、Xposed框架执行的条件

    1.RootedDevice / Emulator (已 root 的手机或者模拟器)

    2.XposedInstaller (Xposed 安装程序下载)

    3.HookingAndroid App (要被Hook的目标App)

     

    XposedFramework 就是一个apk包也就是上面下载的Xposed安装程序,下载后用以下的命令安装到手机上或者模拟器:

    adb install de.robv.android.xposed.installer_v32_de4f0d.apk

     

    安装好之后,打开 Xposed ,以下是截图:



     Xposed安装以后的效果图:

                    


    三、Hook模块的实现

     

    1.加入meta-data元素

    一个Xposed 模块就是一个Android app,不须要实现 Activity。本例中的Hook模块叫com.xposeddemo, 以下是这个实例的 AndroidManifest.xml 文件,注意当中定义了三项 meta-data元素:

    1).xposedmodule 
    2).xposeddescription 加载Hook 模块之后显示的信息
    3).xposedminversion 填写导入的jar包的版本




    2.加入XposedBridgeApi-54.jar包

    当中 xposedminversion 是指 XposedBridge library的版本信息。须要将 XposedBridge library 拷贝到 lib文件夹(注意是lib 文件夹不是 libs文件夹)。假设没有lib文件夹,在project文件夹下新建一个lib文件夹,将下载好的XposedBridgeApi-54.jar包放入当中,然后在project里右键–Build Path–Add to Build Path.




    XposedBridgeApi-54.jar包的下载地址:

    http://dl-1.va.us.xda-developers.com/2/7/4/8/8/7/8/XposedBridgeApi-54.jar?key=lqjljy-2L4Sk3lItcQkWoQ&ts=1434529310

     

    3.加入xposed_init文件

    在assets文件夹下新建一个xposed_init文件。

    内容为:包名+类名。如:com.xposeddemo.Module




    4.在Hooking Android App中查找Hook的关键点

    要被Hook的Android App就使用非虫大神的书中第4章用的crackme02.apk应用程序。


    程序执行的界面例如以下:



    对该apk进行反编译的代码截图:



    注冊码的校验函数:


    通过对crackme02.apk反编译发现仅仅要注冊码验证函数checkSN返回值是true就表明注冊码验证通过,我们的Hook点就是checkSN函数。

     

    5.针对Hooking Android App的Hook关键点实现Hook模块

    1).实现 IXposedHookLoadPackage接口

    2).确定要Hook的Android App的包名

    3).推断要Hook的包名

    4).确定要Hook的AndroidApp的方法

    5).详细实现Android App的函数Hook,调用XposedHelpers.findAndHookMethod(“包名+类名”, lpparam.classLoader, “要hook的函数名称”, 第一个參数类型, 第二个參数类型….., new XC_MethodHook() {

    protectedvoidbeforeHookedMethod(MethodHookParam param) {

           //函数运行之前要做的操作

    }

    protectedvoidafterHookedMethod(MethodHookParam param) {

    //函数运行之后要做的操作

    }

    });

     



    将编写XposedHook须要的模块导入project以后。在写代码的时候。会有提示:



    XposedHook演示样例代码的实现:



    确定了crackme02.apk的Hook点。我们能够确定要Hook函数所在的包为com.droider.crackme0201,要Hook函数所在的类为com.droider.crackme0201.MainActivity。要被Hook的函数为privateboolean checkSN(StringuserName, String sn)


    见编写的XposedHook演示样例代码:

    package com.xposeddemo;
    
    import de.robv.android.xposed.IXposedHookLoadPackage;
    import de.robv.android.xposed.XC_MethodHook;
    import de.robv.android.xposed.XC_MethodHook.MethodHookParam;
    import de.robv.android.xposed.XposedBridge;
    import de.robv.android.xposed.XposedHelpers;
    import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
    
    public class Module implements IXposedHookLoadPackage {
    
    	@Override
    	public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
    		// 推断是否是要Hook的包名(被Hook函数所在的包为com.droider.crackme0201)
    		if (lpparam.packageName.equals("com.droider.crackme0201")){
    			XposedBridge.log("Loaded App:" + lpparam.packageName);
    			
    			//查找要Hook的函数
    			XposedHelpers.findAndHookMethod(
    					"com.droider.crackme0201.MainActivity", //被Hook函数所在的类com.droider.crackme0201.MainActivity
    					lpparam.classLoader, 
    					"checkSN",     //被Hook函数的名称checkSN
    					String.class, //被Hook函数的第一个參数String
    					String.class, //被Hook函数的第二个參数String
    					new XC_MethodHook(){
    						@Override
    						protected void beforeHookedMethod(MethodHookParam param)
    								throws Throwable {
    							// Hook函数之前运行的代码
    							
    							//传入參数1
    							XposedBridge.log("beforeHookedMethod userName:" + param.args[0]); 
    							//传入參数2 
    							XposedBridge.log("beforeHookedMethod sn:" + param.args[1]);
    							//函数返回值
    							XposedBridge.log("beforeHookedMethod result:" + param.getResult());
    						}
    						
    						@Override
    						protected void afterHookedMethod(MethodHookParam param)
    								throws Throwable {
    							// Hook函数之后运行的代码
    							
    							//通过对checkSN函数的分析发现,仅仅要改动函数的返回值就可以实现注冊的破解
    							param.setResult(true);	
    							
    							//传入參数1
    							XposedBridge.log("afterHookedMethod userName:" + param.args[0]); 
    							//传入參数2 
    							XposedBridge.log("afterHookedMethod sn:" + param.args[1]);
    							//函数返回值
    							XposedBridge.log("afterHookedMethod result:" + param.getResult());
    						}
    					});
    		}
    	
    	}
    }

    上面这一行代码指定了仅仅有当com.droider.crackme0201 这个包载入的时候。才会触发一系列的 hook 行为。当这行为触发的时候,de.robv.android.xposed.XposedHelpers 类的 findAndHookMethod 方法就会被调用。并在适当的时候运行前置方法(beforeHookedMethod)和后置方法(afterHookedMethod),在本次的演示样例中仅仅要改动checkSN函数的返回值就可以实现注冊的验证绕过。



    在Xposed框架中安装刚才已经编写好的Hook模块XposedDemo如上图所看到的,然后重新启动手机或者模拟器,我们编写的XposedDemo模块在手机或者模拟器重新启动以后就会生效的,点击执行crackme02.apk应程序。依照输入要求输入任意的username和注冊码该程序就会验证通过(例如以下图)。



    因为在博客上的排版不好,已经将笔记整理成了文档,XposedHook演示样例代码改动一下就能够拿来使用。文档和演示样例代码的下载地址:http://download.csdn.net/detail/qq1084283172/8873927


    參考的网址:

    http://0nly3nd.sinaapp.com/?p=613

    http://www.freebuf.com/articles/terminal/56453.html

     

    2015.6.18


  • 相关阅读:
    python 线程队列、线程池、全局解释器锁GIL
    java Cookie 获取历史记录列表(三)
    Java中如何读写cookie (二)
    java读取和写入浏览器Cookies
    zookeeper的安装和部署
    Spring Boot 多模块项目创建与配置 (一)
    十款效果惊艳的Html案例(一)
    phython
    阿里高并发所用到的技术
    Java9新特性
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6962664.html
Copyright © 2011-2022 走看看