傻瓜式编写安卓hook插件

本文介绍了如何使用Xposed框架在Android上进行动态Hook,以方便分析加密算法。通过创建一个Hook插件,配置AndroidManifest.xml,引入XposedBridge.jar,并在xposed_init中指定插件类,实现了对特定方法的Hook。示例代码展示了如何Hook MD5的静态方法,从而在不修改源码的情况下获取加密内容。
摘要由CSDN通过智能技术生成

CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16
(请不要删掉此地址)

前言/背景

我们平常在做算法分析时,经常碰到加密算法在so 层,或者在想快速知道我们传入参数是那些,最近快的办法就是动态调试,但是有时间又觉得smali代码调试很麻烦。直接hook方法会更省事。下面我们就来写个hook 插件。

概述

第一个启动的进程自然是init进程,该进程会启动所有Android进程的父进程——Zygote(孵化)进程,该进程的启动配置在/init.rc脚本中,而Zygote进程对应的执行文件是/system/bin/app_process,该文件完成类库的加载以及一些函数的调用工作。在Zygote进程创建后,再fork出SystemServer进程和其他进程。而Xposed Framework呢,就是用自己实现的app_process替换掉了系统原本提供的app_process,加载一个额外的jar包,然后入口从原来的com.android.internal.osZygoteInit.main()被替换成了de.robv.android.xposed.XposedBridge.main(),然后创建的Zygote进程就变成Hook的Zygote进程了,而后面Fork出来的进程也是被Hook过的。这个Jar包在/data/data/de.rbov.android.xposed.installer/bin/XposedBridge.jar。

目标app

下面我们随便找个apk来练手
前往下载
提取密码:46zn

Xposed框架配置

AndroidManifest.xml配置

    <application
      
        //在application里面加下面这三个配置项
        <meta-data
            android:name="xposedmodule"
            android:value="true"/>
        <meta-data
            android:name="xposeddescription"
            android:value="任雪飘开发插件1.0"/>//这边可以随便改
        <meta-data
            android:name="xposedminversion"
            android:value="54"/>这是版本号
        
    </application>

XposedBridge.jar配置

Android Studio配置:将jar复制到app下的libs目录中,修改app的build.gradle,添加provided files(‘libs/XposedBridgeApi-82.jar’)
XposedBridgeApi-82.jar 前往下载

提前文件密码:4y87

xposed_init配置

assets中创建一个新的文件xposed_init,在xposed_init里面写入代码的 包名+类名
在这里插入图片描述

代码示例

package com.xiaojianbang.app;

import java.security.MessageDigest;

public class MD5 {
    public static String md5_1(String args) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5", "BC");
        md.update(args.getBytes());
        return Utils.byteToHexString(md.digest());
    }

    public static String md5_2(String args) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5", "BC");
        md.update(args.getBytes(), 2, 5);
        return Utils.byteToHexString(md.digest("xiaojianbang".getBytes()));
    }
}

我们现在写个hook代码进行hook md5_1这个静态方法,代码如下:

package com.renxuepiao.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.LoadPackageParam;

public class hook implements IXposedHookLoadPackage{
    
	//插件入口点
	@Override
	public void handleLoadPackage(LoadPackageParam pparam)
			throws Throwable {
		//获取包名
		XposedBridge.log("任雪飘开发插件hook:"+pparam.processName);
		if(pparam.processName.equals("com.xiaojianbang.app")){
			XposedHelpers.findAndHookMethod(
					"com.xiaojianbang.app.MD5",
					pparam.classLoader,
					"md5_1",
					String.class,
					new XC_MethodHook(){
						/**
						 * hOOK前
						 * 打印消息
						 * */
					protected void	beforeHookedMethod(MethodHookParam Param) 
					    throws Throwable {
						   super.beforeHookedMethod(Param);
						   XposedBridge.log("md5_1"+Param.args[0]);
						   }
					
					/**
					 * 打印后
					 * 
					 * **/
					protected void afterHookedMethod(MethodHookParam Param)
			        		throws Throwable {
							   super.afterHookedMethod(Param);
							   XposedBridge.log("md5_1"+Param.getResult());
							   
						     }
						 });
			          
			
		}
	}

}

运行结果

在这里插入图片描述

总结

xposed 框架可以开发能快速hook能快速获取到对应的数据,这样我们能了解到我们加密的内容有哪些!hook插件到此就开发完毕了!

我是任雪飘,感谢您的关注!

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

埋谷与麦谷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值