吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 30176|回复: 58
收起左侧

[Android 转帖] 萌新跟我来入门Hook技术

  [复制链接]
wushaominkk 发表于 2018-1-3 11:15
一、Hook技术
1.Hook英文翻译为“钩子”,而钩子就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件;
2.Hook使它能够将自己的代码“融入”被勾住(Hook)的进程中,成为目标进程的一部分;
3.在Andorid沙箱机制下,Hook是我们能通过一个程序改变其他程序某些行为得以实现;
二、Hook分类
1.根据Android开发模式,Native模式(C/C++)和Java模式(Java)区分,在Android平台上
  Java层级的Hook;
  Native层级的Hook;
2.根Hook对象与Hook后处理事件方式不同,Hook还分为:
  消息Hook;
  API Hook;
3.针对Hook的不同进程上来说,还可以分为:
  全局Hook;
  单个进程Hook;
三、Hook原理
Hook技术本质是函数调用,由于处于Linux用户状态,每个进程有自己独立的进程控件,所以必须先注入所要Hook的进程空间,修改其内存中进程代码,替换过程表的符号地址,通过ptrace函数附加进程,向远程进程注入so库,从而达到监控以及远程进程关键函数挂钩;
四、Hook工作流程
1.Android相关内核函数:
  ptrace函数:跟踪一个目标进程,结束跟踪一个目标进程,获取内存字节,像内存写入地址;
  dlopen函数:以指定模式打开指定的动态链接库文件;
  mmap函数:分配一段临时的内存来完成代码的存放;
2.向目标进程注入代码总结后的步骤分为以下几步:
  用ptrace函数attch上目标进程;
  发现装载共享库so函数;
  装载指定的.so;
  让目标进程的执行流程跳转到注入的代码执行;
  使用ptrace函数的detach释放目标集成;
五、常用Hook工具-Xposed框架
1.Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务;
2.通过替换/system/bin/app_process程序控制zygote进程,使app_process在启动过程中加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持;
六、Xposed框架安装
1.从官方网站(http://repo.xposed.info/module/de.robv.android.xposed.installer),下载de.robv.android.xposed.installer_v33_36570c.apk,安装本地服务XposedInstaller;
2.安装进入到XposedInstaller应用程序,“框架”模块出现“未激活”提示;

3.点击“框架”,进入到需要激活框架的界面,我们点击“安装/更新”就能完成框架的激活了,因为安装时会需要Root权限(下载相关工具如“Root精灵”),安装后会启动Xposed的app_process,所以安装过程会存在设备多次重启(安装过程如下图);
正在安装(下载):

获取Root权限(授权Root权限提示,并确定):

安装完成(安装完成提示重启):

安装成功(框架模块激活提示消失,即安装成功):

七、Xposed框架模块安装
1.Xposed框架内置了下载功能,我们只需要在下载模块点击之后,进行浏览、下载、搜索即可;

2.默认按照时间排序,你可以点击放大镜图标,进行搜索如(XuiMod,一款专门用于状态栏和置顶电池模块);
搜索XuiMod模块:

3.点击搜索到的模块,可以查看到该模块的描述信息,版本信息。在版本信息模块下进行模块的下载安装;
XuiMod描述信息:

XuiMod版本信息,点击下载相关模块:

下载完成,点击“安装”进行安装:

安装完成后,进入“模块”,激活下载安装的模块,重启生效:

重启后,长按XuiMod进入到模块运行界面,进行相关的操作,重启生效(如下图,手机顶部打开电源充电,居中,充电动画功能):

八、Xposed自定义模块开发
上个段落,我们讲解下如何下载、安装和使用Xposed模块。那么我们如何根据自己的需求,自己开发一个Xposed模块,下面我们就介绍下相关流程:
1.下载XposedBridgeApi-<version>.jar(http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067)文件,用户提供Hook相关的API,如下:

[java] view plain copy
  • /**  
  • *包装加载时的回调  
  • */   
  • public void handleLoadPackage(final LoadPackageParam lpparam)   
  • /**  
  • *Xposed提供的Hook方法  
  • *@param className 待Hook的Class  
  • *@param classLoader ClassLoader  
  • *@param methodName 待Hook的Method  
  • *@param paramterTypesAndClassback hook回调  
  • */   
  • Unhook findAndHookMethod(String className,ClassLoader classLoader,String methodName,Object... parameterTypesAndCallback)   
2.创建一个Android Project HookDemo,在项目app目录下创建lib目录(如果将jar包放置到libs目录下,可能会产生错误,估计Xposed作者在其框架内部也引用了BrideApi,这样操作能避免重复),将jar包放置到lib目录(不是项目本身的libs目录)下,选择jar包->右键->Add As Library将这个jar包添加到BuildPATH;

3.创建一个InputDemo项目(该项目使用输入框提示用户输入信息,点击按钮获取用户的信息并做相关的逻辑),用于模拟Hook目标,通过Xposed获取用户输入信息(关键代码和运行如下);


[java] view plain copy
  • OK.setOnClickListener(new View.OnClickListener() {   
  •             @overRide   
  •             public void onClick(View v) {   
  •                 String inPut = Input.getText() + "";   
  •                 //获取用户输入,并验证是否输入正确   
  •                 if (isInputOK(inPut)) {   
  •                     Toast.makeText(MainActivity.this, "Input Success", Toast.LENGTH_SHORT).show();   
  •                 } else {   
  •                     Toast.makeText(MainActivity.this, "Input Faild", Toast.LENGTH_SHORT).show();   
  •                 }   
  •             }   
  •         });   
  • … …   
  • &#8239;private boolean isInputOK(String inPut) {   
  •         if ("123456".equals(inPut)) {   
  •             return true;   
  •         } else {   
  •             return false;   
  •         }   
  •     }   
4.在HookDemo项目中,修改AndroidManifest.xml文件中配置插件的名称和Api版本号;

[html] view plain copy
  • <?xml version="1.0" encoding="utf-8"?>   
  • <manifest xmlns:android="http://schemas.android.com/apk/res/android"   
  •     package="com.example.pengchengxiang.hookdemo">   
  •     <application>   
  •         … …   
  •         <meta-data   
  •             android:name="xposedmodule"   
  •             android:value="true" />   
  •         <!--模块描述-->   
  •         <meta-data   
  •             android:name="xposeddescription"   
  •             android:value="a hook demo" />   
  •         <!--模块版本-->   
  •         <meta-data   
  •             android:name="xposedminversion"   
  •             android:value="30" />   
  •     </application>   
  • </manifest>   
5.创建一个入口类继承并实现IXposedHookLoadPackage接口,使用findAndHookMethod方法Hook输入信息;  

[java] view plain copy
  • public class Main implements IXposedHookLoadPackage {   
  •     @Override   
  •     public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {   
  •         if (!loadPackageParam.packageName.equals("com.example.pengchengxiang.inputdemo")) {   
  •             return;   
  •         }   
  •   
  •   
  •         XposedBridge.log("Loaded app:" + loadPackageParam.packageName);   
  •         //Hook MainActivity类的isInputOK方法,并将该方法的参数输出至Xposed工具中   
  •         findAndHookMethod("com.example.pengchengxiang.inputdemo.MainActivity", loadPackageParam.classLoader, "isInputOK", String.class, new XC_MethodHook() {   
  •             @Override   
  •             protected void beforeHookedMethod(MethodHookParam param) throws Throwable {   
  •                 XposedBridge.log("hook start");   
  •                 XposedBridge.log("param1:" + param.args[0]);   
  •             }   
  •    
  •             @Override   
  •             protected void afterHookedMethod(MethodHookParam param) throws Throwable {   
  •                 XposedBridge.log("hook end");   
  •                 XposedBridge.log("param1:" + param.args[0]);   
  •             }   
  •         });   
  •     }   
  • }   
注意:在实际应用过程中,你Hook的方法参数可能是目标程序自定义的类,非Android SDK提供,如"com.example.pengchengxiang.inputdemo.Test"。这里我们可以使用方法XposedHelpers.findClass来获取参数类型的class对象,如下:

[java] view plain copy
  • XposedHelpers.findAndHookMethod("com.example.pengchengxiang.inputdemo.MainActivity", loadPackageParam.classLoader, "isInputOK", String.class,  
  •                 XposedHelpers.findClass("com.example.pengchengxiang.inputdemo.Test", loadPackageParam.classLoader), new XC_MethodHook() {...}  
6.声明主入口路径,在assets文件夹中创建xposed_init文件,并在其中声明主入口类;
[java] view plain copy
  • com.example.pengchengxiang.hookdemo.Main  
7.完成InputDemo和HookDemo并安装在手机中,在XposedInstaller中启动我们的自己开发的模块;

8.重新启动手机,在XposedInstaller中日志模块,查看在InputDemo中使用XposedBridge.log输出的日志;


提示1:查看日志模块,如果报错如下图:

处理1:第一,检查XposedBridgeApi-54.jar是否防在新建的lib目录下;第二,估计Xposed作者在其框架内部也使用了BridgeApi,使用Provided依赖避免重复引用;

免费评分

参与人数 24吾爱币 +26 热心值 +24 收起 理由
Sup丶T + 1 + 1 热心回复!
xihuyu2000 + 1 我很赞同!
zzzlucas + 1 + 1 用心讨论,共获提升!
审判者压缩 + 1 + 1 热心回复!
duyuesheng + 1 谢谢@Thanks!
qtfreet00 + 6 + 1 鼓励转贴优秀软件安全工具和文档!
米洛 + 1 + 1 热心回复!
superlu + 1 + 1 鼓励转贴优秀软件安全工具和文档!
june_fj + 1 + 1 谢谢@Thanks!
戏言19 + 1 + 1 谢谢@Thanks!
xisaez + 1 + 1 学习了。。。谢谢。。收下。慢慢补
寒蝉鸣泣之时 + 1 + 1 用心讨论,共获提升!
Edward0524 + 1 + 1 谢谢@Thanks!
夏雨微凉 + 1 谢谢@Thanks!
a1239761234 + 1 + 1 谢谢@Thanks!
no_one + 1 + 1 知乎所以然?
小乖哟 + 1 + 1 热心回复!
青鸾火凤 + 1 + 1 我还以为的PC端外G的hool教程
小灰灰~ + 1 + 1 热心回复!
lin_xop + 1 + 1 热心回复!
ZXC408287430 + 1 热心回复!
LeoTang + 2 + 2 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qaz003 + 1 + 1 谢谢@Thanks!
zhishui + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Rin_0506 发表于 2018-4-5 21:08
麻烦请问一下日志里面只输出了这个怎么办
04-05 21:04:00.316 ?/SENTINEL_TAG( 6485): SENTINEL_MSG_LIBCUTILS
04-05 21:04:00.316 ?/SENTINEL_TAG( 6485): SENTINEL_MSG_LIBLOG
04-05 21:04:01.642 ?/SENTINEL_TAG( 6585): SENTINEL_MSG_LIBCUTILS
04-05 21:04:01.642 ?/SENTINEL_TAG( 6585): SENTINEL_MSG_LIBLOG
 楼主| wushaominkk 发表于 2018-3-14 17:49
lmh2932261247 发表于 2018-1-5 22:31
我是萌新。。我i想知道这个hook有什么用,是干些什么的,什么上面可以用的到,

不用反编译修改其他apk,还可以修改系统内置的apk
z28761789 发表于 2018-1-3 11:55
zhishui 发表于 2018-1-3 11:57
感谢分享
吃鸡的兔子 发表于 2018-1-3 11:59
好评   很详细哇
LeoTang 发表于 2018-1-3 12:14
很强 赞一个!
debug_cat 发表于 2018-1-3 12:41 来自手机
如何hook一个,定义的handler
mz135135 发表于 2018-1-3 12:56
现在主要就是任何apk都加固了,核心代码都看不到。
欧巴QAQ 发表于 2018-1-3 12:57
牛逼啊!!!!!1
小灰灰~ 发表于 2018-1-3 13:09
前来学习了
Mjollnir 发表于 2018-1-3 13:24
感谢分享 mark!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-19 02:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表