在中国互联网这片弱肉强食的丛林中,封闭抄袭是垄断巨头的通行证,创新是弱小创业者的墓志铭。

了解Hook

还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生,Hook英文翻译过来就是“钩子”的意思,那我们在什么时候使用这个“钩子”呢?

我们知道,在Android操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步的向下执行。而“钩子”的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子勾上事件一样。并且能够在勾上事件时,处理一些自己特定的事件。如下图所示:

Hook的这个本领,使它能够将自身的代码“融入”被勾住(Hook)的程序的进程中,成为目标进程的一个部分。我们也知道,在Android系统中使用了沙箱机制,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。

这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是Hook的出现给我们开拓了解决此类问题的道路。当然,根据Hook对象与Hook后处理的事件方式不同,Hook还分为不同的种类,如消息Hook、API Hook等。


CydiaSubstrate框架

 
如果使用过苹果手机的用户应该对Cydiasubstrate框架来说一点都不会陌生,因为Cydiasubstrate框架为苹果用户提供了越狱相关的服务框架。

Cydiasubstrate原名MobileSubstrate(类库中都是以MS开头),作者为大名鼎鼎的Jay Freeman(saurik)。

当然 Cydiasubstrate 也推出了 Android版。Cydia Substrate是一个代码修改平台。它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的。

官网地址:http://www.cydiasubstrate.com/。


安装Cydiastrate框架Android本地服务

首先就是在Android设备中安装Cydiasubstrate框架的本地服务应用substrate.apk,我们可以再其官网下载到。

官方下载地址为:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk

当然,我们安装substrate后,需要“Link Substrate Files”(连接本地的Substrate服务文件),这一步是需要Root权限的,连接后还需要重启设备才能够生效。

下载使用Cydiasubstrate库 
Cydiasubstrate官方建议在Android SDK Manager中添加它们插件地址的方式进行更新下载。

如:在用户自定义网址中添加http://asdk.cydiasubstrate.com/addon.xml。

通过使用Android SDK Manager工具下载完Cydiasubstrate框架后,其存储于目录${ANDROID_HOME}\sdk\extras\saurikit\cydia_substrate下。

但是,由于Android SDK Manager在国内使用起来存在很多的限制,下载的时候也不是非常稳定,所以还是建议大家直接去官网下载开发库。 
官方下载地址为:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip。

下载完成后,将得到的所有文件(很多的jar包与so库),都拷贝都Android项目下的libs文件夹中,就可以直接使用了。

其中的substrate.h头文件与lib文件夹下的so文件是提供在使用NDK进行原生Hook程序开发中的函数支持库。

TIPS:CydiaSubstrate框架对于inline Hook的操作目前还是存在一些bug,使用的时候可能会出现崩溃的现象,部分使用了国内定制的ROM的设备在使用CydiaSubstrate框架时会造成设备无法重新启动或无法Hook的现象。

CydiaSubstrate怎么用?

CydiaSubstrate怎么用?其实很简单,CydiaSubstrate提供了三个静态的方法工具类,我们只需要学会使用它就好 。

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">MS<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.hookClassLoad</span>    拿到指定Class载入时的通知
MS<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.hookMethod</span>   使用一个Java方法去替换另一个Java方法
MS<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.moveUnderClassLoader</span> 使用不同的ClassLoder重载对象</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

具体说明如下:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Hook一个指定的Class* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> name Class的包名+类名,如android.content.res.Resources*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> hook 成功Hook一个Class后的回调*/</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> hookClassLoad(String name, MS.ClassLoadHook hook);<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Hook一个指定的方法,并替换方法中的代码* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> _class Hook的calss*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> member Hook class的方法参数*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> hook 成功Hook方法后的回调*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> old Hook前方法,类似C中的方法指针*/</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> hookMethod(Class _class, Member member, MS.MethodHook hook, MS.MethodPointer old);<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Hook一个指定的方法,并替换方法中的代码* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> _class Hook的calss*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> member Hook class的方法参数*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> alteration*/</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> hookMethod(Class _class, Member member, MS.MethodAlteration alteration);<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 使用一个ClassLoader重载一个对象* *<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> loader 使用的ClassLoader*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @param</span> object 带重载的对象*<span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;"> @return</span> 重载后的对象*/</span>
<T> T moveUnderClassLoader(ClassLoader loader, T object);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>

开始实战(广告注入)

听到这个题目,我估计很多打包党也已经迫不及待了,稍安勿躁。靠广告是赚不了大钱的,笔者也是一个打包党。程序员还是以成长发展为主,一时的快钱带会让你在编程的路上越走越远。

回到正题,使用Cydiasubstrate框架我们能够任意的Hook系统中的Java API,当然其中也用到了很多的反射机制,那么除了系统中给开发者提供的API以外,我们能否也Hook应用程序中的一些方法呢?答案是肯定的。下面我们就以一个实际的例子讲解一下如何Hook一个应用程序。

下面我们针对Android操作系统的浏览器应用,Hook其首页Activity的onCreate方法(其他方法不一定存在,但是onCreate方法一定会有),并在其中注入我们的广告。根据上面对Cydiasubstrate的介绍,我们有了一个简单的思路。

首先,我们根据某广告平台的规定,在我们的AndroidManifest.xml文件中填入一些广告相关的ID。并且在AndroidManifest.xml文件中填写一些使用Cydiasubstrate相关的配置与权限。当然,我们还会声明一个广告的Activity,并设置此Activity为背景透明的Activity,为什么设置透明背景的Activity,如下图:

好了,下面我们就来实操一下。

其AndroidManifest.xml文件的部分内容如下所示:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 广告相关的权限  --></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.INTERNET"</span> /></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.ACCESS_NETWORK_STATE"</span> /></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.ACCESS_WIFI_STATE"</span> /></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.READ_PHONE_STATE"</span> /></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.WRITE_EXTERNAL_STORAGE"</span> /></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.permission.GET_TASKS"</span> /></span>
<span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 加入substrate权限  --></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">uses-permission</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"cydia.permission.SUBSTRATE"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application
</span>    <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:allowBackup</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"true"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:icon</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@drawable/ic_launcher"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:label</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@string/app_name"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:theme</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@style/AppTheme"</span> ></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 广告相关参数 --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data
</span>        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"APP_ID"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"c62bd976138fa4f2ec853bb408bb38af"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data
</span>        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"APP_PID"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"DEFAULT"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 声明substrate的注入口味Main类 --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data
</span>        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.saurik.substrate.main"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.example.hookad.Main"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 透明无动画的广告Activity --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">activity
</span>        <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.example.hookad.MainActivity"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:theme</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@android:style/Theme.Translucent.NoTitleBar"</span> ></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">intent-filter</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">action</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.intent.action.VIEW"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">category</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"android.intent.category.DEFAULT"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 广告的action  --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">action</span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"com.example.hook.AD"</span> /></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">intent-filter</span>></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">activity</span>></span>
<span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li></ul>

对于Cydiasubstrate的主入口Main类,依照之前的步骤新建一个包含有initialize方法的Main类。

这个时候我们希望使用MS.hookClassLoad方式找到浏览器主页的Activity名称。

这里我们使用adb shell下使用dumpsys activity命令找到浏览器主页的Activity名称为com.android.browser.BrowserActivity。

使用MS.hookClassLoad方法获取了BrowserActivity之后再hook其onCreate方法,在其中启动一个含有广告的Activity。Main类的代码如下所示:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> Main {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">/*** substrate 初始化后的入口*/</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> initialize() {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//Hook 浏览器的主Activity,BrowserActivity</span>MS.hookClassLoad(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.android.browser.BrowserActivity"</span>, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> MS.ClassLoadHook() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> classLoaded(<span class="hljs-title" style="box-sizing: border-box;">Class</span><?> resources) {Log.e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"test"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.android.browser.BrowserActivity"</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 获取BrowserActivity的onCreate方法</span>Method onCreate;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">try</span> {onCreate = resources.getMethod(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"onCreate"</span>, Bundle.class);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">catch</span> (NoSuchMethodException e) {onCreate = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;}<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (onCreate != <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>) {final MS.MethodPointer old = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> MS.MethodPointer();<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// hook onCreate方法</span>MS.hookMethod(resources, onCreate, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> MS.MethodHook() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> Object <span class="hljs-title" style="box-sizing: border-box;">invoked</span>(Object <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">object</span>, Object...args) throws Throwable {Log.e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"test"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"show ad"</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 执行Hook前的onCreate方法,保证浏览器正常启动</span>Object result =  old.invoke(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">object</span>, args);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 没有Context</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 执行一个shell 启动我们的广告Activity</span>CMD.run(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"am start -a com.example.hook.AD"</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> result;}}, old);}}});}
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li></ul>

对于启动的广告MainActivity,在其中就是弹出一个插屏广告。当然可也可是其他形式的广告或者浮层,内容比较简单这里不做演示了。对整个项目进行编译,运行。这个时候我们重新启动Android自带的浏览器的时候发现,浏览器会弹出一个广告弹框。

从上面的图片我们可以看出来了,之前我们设置插屏广告MainActivity为无标题透明(Theme.Translucent.NoTitleBar)就是为了使得弹出来的广告与浏览器融为一体,让用户感觉是浏览器弹出的广告。也是恶意广告程序为了防止自身被卸载掉的一些通用隐藏手段。

这里演示的注入广告是通过Hook指定的Activity中的onCreate方法来启动一个广告Activity。当然,这里我们演示的Activity只是简单的弹出来了一个广告。如果启动的Activity带有恶意性,如将Activity做得与原Activity一模一样的钓鱼Activity,那么对于移动设备用户来说是极具欺骗性的。


写在之后

其实我不想发这篇文章,我做过广告打包党,深知这又为各个地下掘金的打包党提供了思路。

但,CydiaSubstrate不仅仅是为了对广告进行注入而生,希望大家多多挖掘思路,以共同学习提升为主。

最后,有兴趣探讨的加我一下微信,大家交交朋友。

原文地址: http://blog.csdn.net/yzzst/article/details/47318751

Android上玩玩Hook?相关推荐

  1. 安装使用Frida在Android上进行hook

    前言 我们对Android应用进行hook最常用的就是Xposed,它相对来说更加完善,而且有强大的社区和丰富的插件.而Frida则于Xposed不同,它是一款轻量级的Hook框架,可用于多平台,相同 ...

  2. pc使用android,如何在电脑上使用Android系统在PC上玩玩Android游戏

    由于很多原因,搭载Windows及Android双系统的产品一直没有大规模上市,而类似华硕Transformer Book Trio这样的双系统产品价格则高达万元.那么,如果你想体验一下Android ...

  3. android hook 实例,代码实例分析android中inline hook

    以下内容通过1.实现目标注入程序,2.实现主程序,3.实现注入函数,4.thumb指令集实现等4个方面详细分析了android中inline hook的用法,以下是全部内容: 最近终于沉下心来对着书把 ...

  4. Android安全:Hook技术

    原址 一.Hook技术  1.Hook英文翻译为"钩子",而钩子就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件:  ...

  5. Android上隐藏应用程序浅析

    Android上隐藏应用程序浅析 手机上有秘密不想被同事.朋友或爱人看到?现在各大主流的手机安全软件纷纷推出"私密空间"或"隐私信箱"等功能,用来存放私密文件. ...

  6. facetime多人聊天_您可以在Android上使用FaceTime吗?

    facetime多人聊天 Apple's FaceTime video calling is perhaps one of their most used features. It lets peop ...

  7. Android打造专有Hook第三篇,实战全量代码规范检查

    系列文章目录 Android打造专有hook,让不规范的代码扼杀在萌芽之中 Android打造专有hook第二篇,走进规范第一步 上篇文章,环境已经搭建,初始化程序已经完成,所需要的配置文件也均已创建 ...

  8. 【小分队】Android上隐藏应用程序

    Android上隐藏应用程序浅析 手机上有秘密不想被同事.朋友或爱人看到?现在各大主流的手机安全软件纷纷推出"私密空间"或"隐私信箱"等功能,用来存放私密文件. ...

  9. android上传本地图片到服务器上,Android使用post方式上传图片到服务器的方法

    本文实例讲述了Android使用post方式上传图片到服务器的方法.分享给大家供大家参考,具体如下: /** * 上传文件到服务器类 * * @author tom */ public class U ...

最新文章

  1. P2057 [SHOI2007]善意的投票 (最大流最小割)
  2. 在哪里能收到python实例代码-python实例代码
  3. MySQL模拟:线上误update的恢复
  4. 【光环板】更新硬件方案最近找到的一些光环板资料,硬件方案及原理图
  5. 乱码 转ios_王者荣耀:转区数量提升25倍,教你解决检测异常,IOS也有艾琳了
  6. Kubernetes教程
  7. 随想录(被高估的busybox)
  8. python输入名字配对情侣网名_输入名字自动取情侣网名,输入名字自动取网名
  9. Mybatis 从入门到入魔
  10. passenger 部署
  11. 软件设计师——数据流图
  12. 情感原因识别相关论文整理
  13. 什么是天气预报 API 接口?如何获取天气预报 API?
  14. TP5 在西部数码虚拟主机下 要如何实现伪静态
  15. Ubuntu重启后nvidia-smi命令报错NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
  16. 数字图像处理 第八章——图像压缩
  17. can总线配置读入是什么意思_CAN总线含义
  18. RISC-V、ARM和X86架构
  19. 自动驾驶介绍、应用、前景
  20. 用python实现解常微分方程组的简单示例以及用odeint解常微分方程的范例

热门文章

  1. UVa 11121 - Base -2 负进制的转化和推广
  2. CentOS7安装cuda及GPU驱动--基于runfile文件
  3. 惩罚、补偿、正则化、约束的联系和区别
  4. 科大星云诗社动态20210217
  5. c4d流体插件_【C4D】流体插件详细讲解
  6. [Embeding-2]文本表示学习-词嵌入入门理解
  7. SqlServer中的动态Sql
  8. 游戏外挂的基本编写原理
  9. PowerDesigner设计数据库
  10. getpeername函数与getsockname函数的介绍