Cydia SubstrateによるAndroid HOOK(二)
18300 ワード
前のSubstrateについての紹介では、Substrate hook javaコードの使い方について説明しましたが、hook nativeコードの使い方について説明します.hook nativeコードは、nativeライブラリと同様に標準とされるandroidパッケージの一部として共有ライブラリとしてコンパイルされるSubstrate extensionsを作成する必要があります(複合拡張子.cy.soを使用します).
一、関連API
(1)
MSConfig
名前
説明
開発者はhookの実行可能なファイルの完全なパスを試みた.一般にzygote,"/system/bin/app_process"である.
開発者がhookしようとしたlibライブラリの名前、例えばhook_android_logは、「liblog.so」を指定する.
(2)void MSHookFunction(void *symbol, void *hook, void **old);
パラメータ
説明
置換されたコードのアドレスは、一般的に関数です.
The address of an ABI-compatible replacement for the code at the address referenced by
元の関数の実装を呼び出すために、関数ポインタを指すポインタ.元の関数を処理する必要がなければNULL
(3)void *MSFindSymbol(MSImageRef image, const char *name);
パラメータ
説明
有効なimage参照を指定します(MSGetImageByNameを呼び出して返される結果).NULLの場合、すべてのイメージが検索されます.
検索する元のミラーシンボルの名前.これはdlopenがロードした高度な記号ではなく、下線を接頭辞または他の特定のプラットフォームの符号化が必要になる場合があります.
シンボルのアドレス(ARM/Thumbタイプに調整)は、シンボルを位置決めできない場合はNULLを返します.
(4)MSImageRef MSGetImageByName(const char *file);
パラメータ
説明
soまたはダイナミックライブラリの完全なパスに基づいてimageをロード
他のAPIで使用できるイメージは参照できますが、イメージがロードされていない場合はNULLです.
二、使用例
次に、native hookのコード作成手順を、以前に署名検証されたhookコードを例に説明します.
これでhookコードの作成が完了しました.インストールして実行すればいいです.
一、関連API
(1)
MSConfig
名前
説明
Filter:Executable
開発者はhookの実行可能なファイルの完全なパスを試みた.一般にzygote,"/system/bin/app_process"である.
Filter:Library
開発者がhookしようとしたlibライブラリの名前、例えばhook_android_logは、「liblog.so」を指定する.
:
MSConfig(MSFilterExecutable, "/system/bin/app_process")
MSConfig(MSFilterLibrary, "liblog.so")
(2)void MSHookFunction(void *symbol, void *hook, void **old);
パラメータ
説明
symbol
置換されたコードのアドレスは、一般的に関数です.
hook
The address of an ABI-compatible replacement for the code at the address referenced by
symbol
. old
元の関数の実装を呼び出すために、関数ポインタを指すポインタ.元の関数を処理する必要がなければNULL
:
1 void *(*oldConnect)(int, const sockaddr *, socklen_t);
2
3 void *newConnect(
4 int socket, const sockaddr *address, socklen_t length
5 ) {
6 if (address->sa_family == AF_INET) {
7 sockaddr_in *address_in = address;
8 if (address_in->sin_port == htons(6667)) {
9 sockaddr_in copy = *address_in;
10 address_in->sin_port = htons(7001);
11 return oldConnect(socket, ©, length);
12 }
13 }
14
15 return oldConnect(socket, address, length);
16 }
17
18 MSHookFunction(&connect, &newConnect, &oldConnect);
(3)void *MSFindSymbol(MSImageRef image, const char *name);
パラメータ
説明
image
有効なimage参照を指定します(MSGetImageByNameを呼び出して返される結果).NULLの場合、すべてのイメージが検索されます.
name
検索する元のミラーシンボルの名前.これはdlopenがロードした高度な記号ではなく、下線を接頭辞または他の特定のプラットフォームの符号化が必要になる場合があります.
return
シンボルのアドレス(ARM/Thumbタイプに調整)は、シンボルを位置決めできない場合はNULLを返します.
:
1 MSImageRef image;
2 image = MSGetImageByName("/usr/lib/libSystem.B.dylib");
3
4 void *(*palloc)(size_t);
5 palloc = (void *(*)(size_t)) MSFindSymbol(image, "_malloc");
6
7 void *data = (*palloc)(1024);
8 free(data);
(4)MSImageRef MSGetImageByName(const char *file);
パラメータ
説明
file
soまたはダイナミックライブラリの完全なパスに基づいてimageをロード
return
他のAPIで使用できるイメージは参照できますが、イメージがロードされていない場合はNULLです.
:
1 MSImageRef image;
2 image = MSGetImageByName("/system/lib/libc.so");
3 if (image != NULL)
4 /* image is loaded */;
二、使用例
次に、native hookのコード作成手順を、以前に署名検証されたhookコードを例に説明します.
1. android native HookVerify,so hook ( Cydia Substrate ), activity。 jni , libsubstrate.so,libsubstrate-dvm.so,substrate.h jni 。
jni HookVerify.cy.cpp 。
2. Manifest
:<uses-permission android:name="cydia.permission.SUBSTRATE"/>
native code, android:hasCode false。
3.Android.mk :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := substrate
LOCAL_SRC_FILES := libsubstrate.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := substrate-dvm
LOCAL_SRC_FILES := libsubstrate-dvm.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := HookVerify
# .cy
LOCAL_SRC_FILES := HookVerify.cy.cpp
LOCAL_LDLIBS := -llog
LOCAL_ARM_MODE := arm
LOCAL_LDLIBS += -L$(LOCAL_PATH) -lsubstrate-dvm -lsubstrate
include $(BUILD_SHARED_LIBRARY)
4.HookVerify.cy.cpp :
1 #include <jni.h>
2 #include "substrate.h"
3 #include <android/log.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <fcntl.h>
7 #include <sys/types.h>
8 #include <string.h>
9 #include <sys/stat.h>
10 #define TAG "HOOKDEMO"
11 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
12 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
13 char* AppName = NULL;
14 // hook lib :
15 MSConfig(MSFilterLibrary, "/system/lib/libdvm.so");
16 // :
17 void *(*oldUnzOpen64)(const char* filepath);
18 //
19 void *newUnzOpen64(const char* filepath){
20 return oldUnzOpen64("/sdcard/myapk.apk");
21 }
22 //Hook dvmLoadNativeCode
23 bool (*_dvmLoadNativeCode)(char* pathName, void* classLoader, char** detail);
24 bool My_dvmLoadNativeCode(char* pathName, void* classLoader, char** detail){
25 bool b_Result = _dvmLoadNativeCode(pathName,classLoader,detail); // ,
26 //LOGD("dvmLoadNativeCode AppName:%s", AppName);
27 if(strstr(pathName,"AppVerify") != NULL){
28 LOGD("dvmLoadNativeCode Find Hook");
29 MSImageRef image = MSGetImageByName(pathName);
30 if(image != NULL){
31 void* mFun = MSFindSymbol(image, "unzOpen64");
32 // Hook fork
33 if(mFun != NULL){
34 LOGD("dvmLoadNativeCode Hook");
35 //MSHookFunction(mFun,(void*)&My_fork,(void**)&_fork);
36 MSHookFunction(mFun, (void*)&newUnzOpen64, (void**)&oldUnzOpen64);
37 }
38 }
39 }
40 return b_Result;
41 }
42 // hook, :
43 //Substrate entry point
44 MSInitialize{
45 __android_log_print(ANDROID_LOG_ERROR, TAG, "Substrate initialized.");
46 MSImageRef image;
47 image = MSGetImageByName("/system/lib/libdvm.so"); // lib
48 if (image != NULL)
49 {
50 // c++ , objdump
51 void * dvmload = MSFindSymbol(image, "_Z17dvmLoadNativeCodePKcP6ObjectPPc");
52 if(dvmload == NULL)
53 {
54 LOGD("error find dvmLoadNativeCode ");
55 }
56 else{
57 MSHookFunction(dvmload,(void*)&My_dvmLoadNativeCode,(void **)&_dvmLoadNativeCode);
58 }
59 }
60 else{
61 LOGD("ERROR FIND LIBDVM");
62 }
63 }
これでhookコードの作成が完了しました.インストールして実行すればいいです.