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項目地址】