Android Hook 框架 Cydia_substrate 详解
目錄(?)[-]
使用方法
短信監控實例
1、Cydia_Substrate 框架簡介
Cydia Substrate是一個代碼修改平臺。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。而Xposed只支持 HOOK app_process中的java函數,因此Cydia Substrate是一款強大而實用的HOOK工具。
其實cydia_substrate 與xposed 的hook原理是一樣的,二者都可以作為Java Hook的框架,看使用習慣了。下面簡單介紹一下cydia_substrate 的使用方法。
官網地址:http://www.cydiasubstrate.com/
Demo地址:https://github.com/zencodex/cydia-android-hook
官方教程:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1
SDK下載地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip
使用方法
下面以官網的一個實例來說明cydia substrate的使用方法。該實例是實現將多個接口組件顏色修改為紫羅蘭色。
需要安裝:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk
步驟一:創建一個空的Android工程。由于創建的工程將以插件的形式被加載,所以不需要activity。將SDK中的substrate-api.jar復制到project/libs文件夾中。
步驟二:配置Manifest文件
(1)需要指定權限:cydia.permission.SUBSTRATE
(2)添加meta標簽,name為cydia.permission.SUBSTRATE,value為下一步中創建的類名.Main
[java] view plaincopyprint?
<manifestxmlns:android="http://schemas.android.com/apk/res/android">
<application>
<meta-dataandroid:name="com.saurik.substrate.main"android:value=".Main"/>
</application>
<uses-permissionandroid:name="cydia.permission.SUBSTRATE"/>
</manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
</application>
<uses-permission android:name="cydia.permission.SUBSTRATE"/>
</manifest>
步驟三:創建一個類,類名為Main。類中包含一個static方法initialize,當插件被加載的時候,該方法中的代碼就會運行,完成一些必要的初始化工作。
[java] view plaincopyprint?
importcom.saurik.substrate.MS;
publicclassMain{
staticvoidinitialize(){
//...codetorunwhenextensionisloaded
}
}
import com.saurik.substrate.MS;
public class Main {
static void initialize() {
// ... code to run when extension is loaded
}
}
步驟四:為了實現HOOK,達到修改目標類中的代碼的目的,我們需要得到目標類的一個實例,如示例中的resources。
[java] view plaincopyprint?
publicclassMain{
staticvoidinitialize(){
MS.hookClassLoad("android.content.res.Resources",newMS.ClassLoadHook(){
publicvoidclassLoaded(Class<?>resources){
//...codetomodifytheclasswhenloaded
}
});
}
}
public class Main {
static void initialize() {
MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
public void classLoaded(Class<?> resources) {
// ... code to modify the class when loaded
}
});
}
}
步驟五:通過MS.MethodHook實例實現原代碼的修改。
為了調用原來代碼中的方法,我們需要創建一個MS.MethodPointer類的實例,它可以在任何時候運行原來的代碼。
在這里我們通過對原代碼中resources對象原始代碼的調用和修改,將所有綠色修改成了紫羅蘭色。
[java] view plaincopyprint?
publicvoidclassLoaded(Class<?>resources){
MethodgetColor;
try{
getColor=resources.getMethod("getColor",Integer.TYPE);
}catch(NoSuchMethodExceptione){
getColor=null;
}
if(getColor!=null){
finalMS.MethodPointerold=newMS.MethodPointer();
MS.hookMethod(resources,getColor,newMS.MethodHook(){
publicObjectinvoked(Objectresources,Object...args)
throwsThrowable
{
intcolor=(Integer)old.invoke(resources,args);
returncolor&~0x0000ff00|0x00ff0000;
}
},old);
}
}
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);
}
}
安裝運行,重啟系統后發現很多字體顏色都變了。
示例中MS.hookMethod的代碼可以改成:
[java] view plaincopyprint?
MS.hookMethod(resources,getColor,newMS.MethodAlteration<Resources,Integer>(){
publicIntegerinvoked(Resourcesresources,Object...args)
throwsThrowable
{
intcolor=invoke(resources,args);
returncolor&~0x0000ff00|0x00ffee00;
}
});
MS.hookMethod(resources, getColor, new MS.MethodAlteration<Resources, Integer>() {
public Integer invoked(Resources resources, Object... args)
throws Throwable
{
int color = invoke(resources, args);
return color & ~0x0000ff00 | 0x00ffee00;
}
});
2、短信監控實例
在下面的例子中我們實現了短信監聽功能,將短信發送人、接收人以及短信內容打印出來:
[java] view plaincopyprint?
<spanstyle="font-size:12px;">importjava.lang.reflect.Method;
importandroid.app.PendingIntent;
importandroid.util.Log;
importcom.saurik.substrate.MS;
publicclassMain{
staticvoidinitialize(){
MS.hookClassLoad("android.telephony.SmsManager",newMS.ClassLoadHook(){
@Override
publicvoidclassLoaded(Class<?>SmsManager){
//codetomodifytheclasswhenloaded
MethodsendTextMessage;
try{
sendTextMessage=SmsManager.getMethod("sendTextMessage",
newClass[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});
}catch(NoSuchMethodExceptione){
sendTextMessage=null;
}
MS.hookMethod(SmsManager,sendTextMessage,newMS.MethodAlteration(){
publicObjectinvoked(Object_this,Object..._args)throwsThrowable{
Log.i("SMSHOOK","SEND_SMS");
Log.i("SMSHOOK","destination:"+_args[0]);
Log.i("SMSHOOK","source:"+_args[1]);
Log.i("SMSHOOK","text:"+_args[2]);
returninvoke(_this,_args);
}
});
}
});
}
}</span>
<span>import java.lang.reflect.Method;
import android.app.PendingIntent;
import android.util.Log;
import com.saurik.substrate.MS;
public class Main {
static void initialize() {
MS.hookClassLoad("android.telephony.SmsManager", new MS.ClassLoadHook() {
@Override
public void classLoaded(Class<?> SmsManager) {
//code to modify the class when loaded
Method sendTextMessage;
try {
sendTextMessage = SmsManager.getMethod("sendTextMessage",
new Class[]{String.class,String.class,String.class,PendingIntent.class,PendingIntent.class});
} catch (NoSuchMethodException e) {
sendTextMessage = null;
}
MS.hookMethod(SmsManager, sendTextMessage, new MS.MethodAlteration() {
public Object invoked(Object _this,Object... _args) throws Throwable{
Log.i("SMSHOOK","SEND_SMS");
Log.i("SMSHOOK","destination:"+_args[0]);
Log.i("SMSHOOK","source:"+_args[1]);
Log.i("SMSHOOK","text:"+_args[2]);
return invoke(_this, _args);
}
});
}
});
}
}</span>
運行步驟
ROOT過的手機一部,沒有ROOT的,請自行搜索方法。
Eclipse 上安裝 Android Substrate SDK,參考:http://www.cydiasubstrate.com/id/73e45fe5-4525-4de7-ac14-6016652cc1b8/
手機端去下載安裝 Cydia Substratehttp://www.cydiasubstrate.com/download/com.saurik.substrate.apk
按照章節1上面的例程,編譯本代碼后安裝到手機
手機上運行Substrate,界面上點擊“Link Substrate Files”,再點擊 “Restart System(Soft)”(這些都是Hook 步驟)
最后再編寫一個Test.apk, 調用hook 后的class,檢驗hook 結果。
總結
以上是生活随笔為你收集整理的Android Hook 框架 Cydia_substrate 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 办理房贷前,名下信用卡必须全部还清吗?
- 下一篇: 因为银行过度授信导致信用卡逾期还不上,可