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插件到此就开发完毕了!
我是任雪飘,感谢您的关注!