Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> android加固系列—5.加固前先學會破解,hook(鉤子)jni層系統api,androidjni

android加固系列—5.加固前先學會破解,hook(鉤子)jni層系統api,androidjni

編輯:關於android開發

android加固系列—5.加固前先學會破解,hook(鉤子)jni層系統api,androidjni


【版權所有,轉載請注明出處。出處:http://www.cnblogs.com/joey-hua/p/5138585.html】

crackme項目jni的關鍵代碼(項目地址見文章底部),獲取當前程序的包名com.example.shelldemo和com.example.nocrack對比,正常運行結果是this app is illegal,這裡的破解內容是hook strcmp函數來修改函數返回值來改變程序走向以達到running successfully。

 

1.工具介紹

Eclipse + ndk,編譯jni源碼

cmd窗口

 

2.准備工作

手機root。

在編譯以下的c文件之前有個地方需要你自行修改,mystrcmp.c下的

 

com.example.crackme-2有可能是com.example.crackme-1

A.編譯inject.c並傳輸

在Android.mk中輸入,並編譯生成inject:

LOCAL_PATH := $(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_MODULE := inject   

LOCAL_SRC_FILES := inject.c   

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog  

include $(BUILD_EXECUTABLE)

 

然後打開cmd命令窗口進入到文件的目錄下並輸入:

adb push inject /data/local/tmp

將文件inject推送到手機的/data/local/tmp目錄下

 

B.編譯mystrcmp.c並傳輸

在Android.mk中輸入,並編譯生成libmystrcmp.so:

LOCAL_PATH := $(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog -lEGL  

LOCAL_MODULE    := mystrcmp  

LOCAL_SRC_FILES := mystrcmp.c  

include $(BUILD_SHARED_LIBRARY)

 

然後在命令窗口輸入:

adb push libmystrcmp.so /data/local/tmp

 

 

3.開始hook

首先在手機上啟動crackme,然後在pc端打開一個新的命令窗口,並輸入:

adb shell

su

cd  /data/local/tmp

chmod 777 *

ps | grep com.example.crackme

./inject 3166(這裡對應的是你進程的pid)

 

這時候觀察eclipse的logcat的INJECT標簽就會發現

 

觀察com.example.crackme

 

表明注入成功了,並且找到了strcmp函數,完整的意思就是已經把我們的libstrcmp.so注入到進程com.example.crackme裡了。並且把我們自己新寫的strcmp函數的地址替換掉了系統的strcmp函數地址,請看關鍵代碼:

got_item = *(uint32_t *)(out_addr + i);
                    if (got_item  == old_strcmp) {
                        LOGD("Found strcmp in got\n");
                        got_found = 1;

                        uint32_t page_size = getpagesize();
                        uint32_t entry_page_start = (out_addr + i) & (~(page_size - 1));
                        mprotect((uint32_t *)entry_page_start, page_size, PROT_READ | PROT_WRITE);
                        *(uint32_t *)(out_addr + i) = new_strcmp;

現在其實已經成功了,那麼就來運行吧,首先在命令窗口按回車

 

然後在手機上點擊按鈕“檢測是否被crack”

 

這時調用了我們自定義的strcmp,並獲得了傳遞過來的兩個字符串參數,並且始終返回成功0,見關鍵代碼:

 

至此程序已破解。

 

一個碼農的日常 

crackme項目地址

Hook項目地址

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved