Cydia SubstrateによるAndroid HOOK(二)

18300 ワード

前のSubstrateについての紹介では、Substrate hook javaコードの使い方について説明しましたが、hook nativeコードの使い方について説明します.hook nativeコードは、nativeライブラリと同様に標準とされるandroidパッケージの一部として共有ライブラリとしてコンパイルされるSubstrate extensionsを作成する必要があります(複合拡張子.cy.soを使用します).
一、関連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, &copy, 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コードの作成が完了しました.インストールして実行すればいいです.