從來沒接觸過Android的HOOK,在看雪上找到了一篇HOOK 的文章,但是太復雜了,應該是本地環境問題,測試不成功。
后來搜到Cydia Substrate,看了幾篇文章,進入官網查看了一下文檔,簡直是神器,HOOK過程簡潔,總共就幾個關鍵API,使用起來特別方便。
於是在blog記錄一下。
一、手機端配置
1.手機必須Root,我這里使用的是模擬器。(安利一波Genymotion模擬器,太好用了)
2.下載cydiasubstrate APK。(官網下載地址)
二、測試代碼
使用官網提供的例子。字少圖多,我就不重述了。寫下幾個我遇到的錯誤:
1.新建安卓工程時不要默認添加的Activity。
2.Manifest文件application段的meta-data必須填寫。
3.manifest節點需要填寫package(官網沒填寫package,可能是eclipse版本問題,我裝的eclipse默認填寫了package,並且不可刪除),主函數所在文件必須在這個package下,否則代碼不會執行。
4.無論更新HOOK,還是卸載HOOK,最好都重啟一下手機。(再次安利一波Genymotion模擬器,重啟速度太快了)
三、效果圖
四、附件
Manifest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.cydiahookjava" android:versionCode="1" android:versionName="1.0" > <application android:label="@string/app_name" > <meta-data android:name="com.saurik.substrate.main" android:value=".Main" /> </application> <uses-permission android:name="cydia.permission.SUBSTRATE" /> </manifest>
Java文件
package com.example.cydiahookjava; import java.lang.reflect.Method; import com.saurik.substrate.MS; public class Main { static void initialize() { MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() { public void classLoaded(Class<?> resources) { Method getColor; try { getColor = resources.getMethod("getColor", Integer.TYPE); } catch (NoSuchMethodException e) { getColor = null; } if (getColor != null) { final MS.MethodPointer old = new MS.MethodPointer(); MS.hookMethod(resources, getColor, new MS.MethodHook() { public Object invoked(Object resources, Object... args) throws Throwable { //先調用原函數 int color = (Integer) old.invoke(resources, args); //再修改返回值 return color & ~0x0000ff00 | 0x00ff0000; } }, old); } } }); } }