20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
引言
其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌丝功能,比如自动抢红包,微信阻止撤回,语音可转发等效果,现在步入了SDK 6.0时代,安上了黑域还有绿色守护真的省电,尤其你在装谷歌全家桶的时候,那个是真的费电啊!这篇文章,我想写一点xposed的工作原理。在不修改APK的情况下,影响其运行过程的服务框架。可以根据自己的需求编写模块,让模块控制目标应用的运行。
start
首先环境介绍 oneplus 3 手机 安卓6.0 root后安装xposed架构
好了好了开始!
你先下载好架构是没什么用的,之后需要人为的去编写模块去加载重启运行才行。那好,我们想要知道手机里某个app的某个类的某个方法中的某个函数,就要去指明他的包,这样在架构加载重启后才能去识别这个参数去hook,之后在ide的控制台下就能看见输入或者输出的参数的相关信息了,并去修改。
举一个例子,上篇博客中出现的登录app中.java文件中出现的isOK(字符,字符)这个函数是检查的帐号和密码,那我们如果能hook到这个函数,那这个登录系统就是很不稳了。那我们现在就可以针对他来进行模块的编写了。
public class LoginActivity extends Activity {
private final String ACCOUNT="jclemo";
private final String PASSWORD="123456";
private EditText etAccount, etPassword;
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etAccount=(EditText)findViewById(R.id.et_account);
etPassword=(EditText)findViewById(R.id.et_password);
btnLogin=(Button)findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isOK(etAccount.getText().toString(), etPassword.getText().toString())) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
}
}
});
}
private boolean isOK(String account, String password){
return account.equals(ACCOUNT) && password.equals(PASSWORD);
}
打开安卓IDE,新建一个项目,模块不需要界面,所以我们选择no activity就好,不要添加layout.xml
在空项目的java文件夹中新建一个类,命名用Module就好
接下来配置安卓manifest.xml
在main文件下创建一个assets文件夹,在里面创建一个普通文件,命名为xposed_init,然后打开输入包的名字和你的类的包名
新建一个文件夹,命名为jar,然后将XposedBridgeApi.jar包放进去,我在网上下载的是54版本,之后右键add lib,加入到我们程序需要的库里面。
编写模块类Module.java

以下为全部代码
.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.samuelzhan.xposehook">
<application android:allowBackup="true" android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="Hook Test!"/>
<meta-data
android:name="xposedminversion"
android:value="54"/>
</application>
</manifest>
java的Module模块类
public class Module implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (loadPackageParam.packageName.equals("com.example.logintest")) {
XposedHelpers.findAndHookMethod("com.example.logintest.LoginActivity",
loadPackageParam.classLoader,
"isOK",
String.class,
String.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
}
});
}
}
}

这里我们可以看到,Module继承了IXposedHookLoadPackage接口,当系统加载应用包的时候回回调 handleLoadPackage;XposedHelpers的静态方法 findAndHookMethod就是hook函数的的方法,其参数对应为类名+loadPackageParam.classLoader+方法名+参数类型+XC_MethodHook回调接口
这里的第一个参数类名必须要有包名前缀,即“packageName+className”
参数里有一个监听类XC_MethodHook,该类在hook前后回调,通过回调方法的MethodHookParam可以拦截到函数参数。Xposed除了hook目标应用的函数之外,还可以hook某些类的构造方法,对应的方法为XposedHelpers.findAndHookConstructor()。
接下来就签名打包生成apk文件吧,安装到手机上,然后提示有新的xposed模块更新,直接授权加上重启手机就好,热重启很快的。

重启后我们就可以hook那个isOK函数了,用以下来记录获取登录的密码
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("账号:"+(String)param.args[0]+" 密码:"+(String)param.args[1]);
Log.d("xxx","账号:"+(String)param.args[0]+" 密码:"+(String)param.args[1]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.d("zz", param.getResult().toString());
}
});
手机连接到ide后登录,我们在IDE的控制台上能够看到帐号和密码
当然也可修改
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//修改参数
param.args[0]="jclemo";
param.args[1]="123456";
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.d("zz", param.getResult().toString());
}
});

让他的id永远为jclemo,密码永远为123456。之后重新打包,发送到安卓手机上!
总结
这个实验只是xposed研究很小很小的一个方面,还有很多深入的内容需要去研究,下次实验本来打算做的是cydia研究,因为他在苹果越狱上有很大的贡献,想要在安卓平台上也进行一次实验,但是很尴尬的一点就是,这个平台只支持到4.4.4平台,而我的手机最低需要6.0,无法安装4.4.4的cydia,因此无法继续运行,所以改成安卓apk的签名研究!
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究的更多相关文章
- 20145307陈俊达_安卓逆向分析_APKtools分析smail
20145307陈俊达_安卓逆向分析_APKtools分析smail 引言 真刺激呢!到了第二篇博客了,难度开始加大,之前是简单的dex2jar和有图形界面的jd-gui,现在来隆重介绍强大的反汇编工 ...
- 20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用
20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用 引言 这次免考选择了四个项目,难度也是从简到难,最开始先写一个工具的使用 想要开发安卓首先要会编写代码,但是想要逆向分 ...
- 20145307陈俊达《网络对抗》Exp7 网络欺诈技术防范
20145307陈俊达<网络对抗>Exp7 网络欺诈技术防范 基础问题回答 什么是dns欺骗攻击! 利用dns spoof运行DNS欺骗,如果是请求解析某个域名,dnsspoof会让该域名 ...
- 20145307陈俊达《网络对抗》逆向及Bof基础
20145307陈俊达<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...
- 20145307陈俊达《网络对抗》Exp4 恶意代码分析
20145307陈俊达<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪 ...
- 20145307陈俊达《网络对抗》Exp9 Web安全基础实践
20145307陈俊达<网络对抗>Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求 ...
- 20145307陈俊达《网络对抗》Exp6 信息搜集与漏洞扫描
20145307陈俊达<网络对抗>Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.D ...
- 20145307陈俊达《网络对抗》shellcode注入&return to libc
20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...
- 20145307陈俊达《网络对抗》Exp 8 Web基础
20145307陈俊达<网络对抗>Exp 8 Web基础 基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中输入信息的元素,表单在网页中主要负责数据采 ...
随机推荐
- 计蒜客 30994 - AC Challenge - [状压DP][2018ICPC南京网络预赛E题]
题目链接:https://nanti.jisuanke.com/t/30994 样例输入: 5 5 6 0 4 5 1 1 3 4 1 2 2 3 1 3 1 2 1 4 样例输出: 55 样例输入: ...
- 蓝桥杯 - G将军有一支训练有素的军队 - [树形DP]
G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军).现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死 ...
- Python 文件内容读取
# 读取数据的函数 def readData(filename): with open(filename, 'r') as f: data = f.read().lower() data = list ...
- 服务器端FIN的条件
服务器端FIN的条件_域名/网络_常见问题_对象存储 OSS-阿里云 https://help.aliyun.com/knowledge_detail/65427.html 服务器端FIN的条件 KB ...
- flask数据库操作
Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres ...
- MySQL锁定状态查看相关命令
1.show processlist; SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到 ...
- C++三大特性之继承
原文地址:https://qunxinghu.github.io/2016/09/12/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E7%B ...
- sql server 备份恢复效率
sql server 备份恢复效率 如何提高备份的速度呢? 其实这个问题和如何让系统跑的更快是一样的,要想系统跑的更快,无非就是:优化系统,或者就是更好更强大的服务器,特别是更多的cpu.更大的内存. ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- latex中文模板
\documentclass[UTF8,a4paper,10pt, twocolumn]{ctexart} \usepackage[left=2.50cm, right=2.50cm, top=2.5 ...