easyHook,一个直接指定hook目标,无需重新写xposed代码重新启动的工具,支持加固app 2021-5-25 17:55 | 2,856 | 0 | 资源 1736 字 | 7 分钟 本文最后更新于 1330 天前,其中的信息可能已经有所发展或是发生改变 来源吾爱破解 2021/5/25更新:最近遇到的加固app越来越多,很多时候不好动态调试。所以我修改了下逻辑,现在通过hook classLoader暴力枚举所有类和方法的加载,从而达到可以直接hook加固app的目的。hook加固app的原理:以360加固为例,首先我们看看加固app: 通常我们要hook加固的app需要先找到如上图所示的方法,拿到Context,再通过getClassLoader()来拿到壳的classLoader,然后就可以hook到加固app的函数了。但是有个问题,如果换个app,加固的版本变了,或者用了别的加固,那这个地方又要重新找。所以我们需要找到一个通用的方法,从而能hook所有加固的app。我们需要这个classLoader的原因就是我们用xposed的时候经常用XposedHelper.findAndHookMethod()方法来hook我们的目标,这个方法就需要一个实际的classLoader去load目标函数。我们查看下这个方法的源码:会发现最终时调用了XposedBridge.hookMethod方法来hook的,所以我们也可以直接调用,传如我们的目标方法对象和一个callback就可以。安卓引入mutiDex以后用loadClass来加载所有类。源码如下图所示: 所以我想到的办法是直接hook这个loadClass方法,这个方法第一个参数是类名,返回值即为一个类对象。通过param.getResult()拿到返回的类,把类名与我们需要hook的类名匹配,从而拿到需要的目标类,再拿到这个类的所有方法,同样的方法,匹配到我们需要的方法,这样就可以达到我们hook加固app的目的。[Java] 纯文本查看 复制代码private void findContext() { XposedHelpers.findAndHookMethod(ClassLoader.class, “loadClass”, String.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (!param.hasThrowable()) { try { String strClazz = param.args[0].toString(); if (!strClazz.startsWith(“android.”)) { Class<?> clazz = (Class<?>) param.getResult(); synchronized (this.getClass()) { strClassName = strClazz; // 获取被hook的目标类的名称 if (strClazz.equals(className)) { //这个className是事先在界面上填写的需要hook的类名 Log.d(TAG, “loadClass: ” + strClazz); Method[] methods = clazz.getDeclaredMethods(); // 遍历类的所有方法 if (methods.length > 0) { for (Method method : methods) { if (method.getName().equals(methodName)) {//methodName是事先在界面上填写的需要hook的方法名 hook(method); } } } } } } } catch (Exception e) { } } } }); }还是上面的360加固的app,他报文里有个签名字段,先把一堆字符拼在一起最后再加密,脱壳后简单分析了下代码,发现其中一个字段来源是g.w.b.a.d.a().r()方法。直接填写: 然后打开app登录,即可看到成功打印了参数。由于是一个void方法,返回值为null。 经测试,360,腾讯,爱加密,梆梆的壳是可以hook。别的壳暂未测试,不过按理来说没啥问题。最新成品: 源代码已开源更新,也可按照需求自行修改编译https://github.com/safeYYY/easyHook原文:由于最近经常逆向android apk,很多时候没有动态调试的条件,于是xposed就成了我最常用的debug工具,遇到可疑的地方直接hook一下参数和返回值看是不是我要破解的地方。这个方法确实很方便,但也有个问题,每次都要重新写xposed模块,然后安装,重启,太浪费时间,于是就想到了做一个可视化工具,直接把要hook的包名、类名、方法名填进去,就不需要每次都重新写代码打包安装重启了。于是就有了这个想法,写了个简易小工具。此工具依赖xposed框架。为了方便,我加入了悬浮窗,实时显示hook的结果,例如,我自己写的一个app里有个test方法: 直接在小工具里填写对应的包名、类名、方法名,选择对应的参数类型(此处为了方便我列出了常用的基础参数类型,如果时其他类型或者自定义对象类型,直接填如完整的类名即可,例如“java.util.LinkedHashMap”) 填写完后,点击保存,并打开悬浮窗,运行我的app,效果如下: 确实hook到了我想要的东西。为了确保可用性,我找了个某灵魂聊天软件实测。这个软件默认用抓包工具抓包,是无法正常通信的,因为使用了双向证书校验,也就是客户端内藏了张证书。 详情见我的另一个帖子。https://www.52pojie.cn/thread-1408337-1-1.html这时候就要找客户端证书以及证书密码了,证书很好找,但是证书密码代码内没有直接硬编码,想分析代码比较困难,且耗费时间,因此我想到直接hook。经常逆向的人应该都知道,android加载客户端证书使用的是java.security.KeyStore.open()方法。这个方法第一个参数是证书文件流,第二个参数是证书密码。简单定位代码,发现第二个参数来源为SoulNetworkSDK.r().c方法,所以我们直接hook这个c方法,c方法的返回值即为我们需要的证书密码。 直接填写对应包名类名方法名: 直接将包名类名方法名填入工具,点击保存,打开悬浮窗,运行目标app,效果如下: 可以看到,证书密码已经成功hook到,长按可将hook结果复制到剪切板,现在直接在charles或者burp里导入p12证书并填写密码即可正常抓包。实战测试顺利通过。代码比较粗糙,但是用起来很方便,所以各位如果喜欢或者有需要可以star一下。2021年4月21日修改:修复了开发者自定义参数类型导致方法hook不到的bug我想升级,有没有免费评分帮我给个 下载地址:https://www.52pojie.cn/thread-1408286-1-2.html 赞赏 豆 暂无评论 发送评论 编辑评论 正在回复 的评论 : 取消回复 Markdown 悄悄话 邮件提醒 发送 编辑 取消 |´・ω・)ノヾ(≧∇≦*)ゝ(☆ω☆)(╯‵□′)╯︵┴─┴ ̄﹃ ̄(/ω\)∠( ᐛ 」∠)_(๑•̀ㅁ•́ฅ)→_→୧(๑•̀⌄•́๑)૭٩(ˊᗜˋ*)و(ノ°ο°)ノ(´இ皿இ`)⌇●﹏●⌇(ฅ´ω`ฅ)(╯°A°)╯︵○○○φ( ̄∇ ̄o)ヾ(´・ ・`。)ノ"( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃(ó﹏ò。)Σ(っ °Д °;)っ( ,,´・ω・)ノ"(´っω・`。)╮(╯▽╰)╭o(*////▽////*)q>﹏<( ๑´•ω•) "(ㆆᴗㆆ)😂😀😅😊🙂🙃😌😍😘😜😝😏😒🙄😳😡😔😫😱😭💩👻🙌🖕👍👫👬👭🌚🌝🙈💊😶🙏🍦🍉😣Source: github.com/k4yt3x/flowerhd 颜文字Emoji小恐龙花! × × 上一篇【桌面应用】网易云FM V1.3下一篇 模拟器精简工具系列【已更新雷神、雷电V4、雷电V3】 推荐文章 易语言模块反编译工具 [20210609]抖音、快手直播源及视频无水印解析工具2.5,含观看、投屏、下载及web交互 BATOCERA gamelist.xml辅助生成工具 很早以前写的【你想明白生命的意义吗?】恶搞对话框 微信视频号下载工具3.0(拒绝收费) 音量调节旋钮——带音频频谱显示 【桌面应用】网易云FM V1.3 搜索文件和目录,然后复制文件 模拟器精简工具系列【已更新雷神、雷电V4、雷电V3】 局域网批量远程唤醒-远程开机软件