1. 程式人生 > 其它 >教我兄弟學Android逆向06 用AndroidStudio編寫第一個so

教我兄弟學Android逆向06 用AndroidStudio編寫第一個so

上一篇教我兄弟學Android逆向05 在smali程式碼中插入Log》我教會了你隨心所欲的在smali程式碼中插入log,你也很認真的學習了,那麼這節課我將帶你走進so的世界,這時你有一些疑問,經常聽比人說soso的那麼so到底是什麼呢?我是來學破解技術的啊為什麼這節課要讓我編寫so?
先看一下下面的介紹:
Android開發中,我們經常會用到.so檔案。原因有很多,比如部分方法不想暴露,如加密規則。比如部分祕鑰需要儲存,哪怕最簡單的一個String我們使用.so呼叫獲取這個String,也比直接明文寫在程式碼中要來的安全。那麼逆向破解也是一樣,你要破解一個so就得先學習這個so是怎麼編寫的 為了避免以後破解so時知其然而不知其所以然 所以今天我為你帶來了這篇教程。



那麼今天的主線是:如何用AndroidStudio編寫一個so並在java層呼叫so中的方法?

帶著這條主線 我將開始今天的教程 下面要認真聽課了!
一. 開啟AndroidStudio新建一個類,宣告native方法。這個類是java與C/C++互動的中介,方法由java宣告,由C/C++實現。
<ignore_js_op>

<ignore_js_op>

<ignore_js_op>

[Java]純文字檢視複製程式碼 ?
1 2 3 4 5 6 7 8 public class myJNI {   //載入so庫 static { System.loadLibrary(
"JniTest"); }   //native方法 public static native String sayHello(); }



二.開啟android studio終端,使用javac編譯上述檔案,生成class檔案。
1.開啟myJNI類所在的目錄,並複製路徑
<ignore_js_op>

<ignore_js_op>

2.找到AndroidStudio最底部的Terminal開啟命令列 輸入命令cd+自己剛剛複製的目錄(如果底部沒有Terminal 按住快捷鍵alt+f2也能調出來)
<ignore_js_op>

3.使用javac編譯上述檔案,生成class檔案。


<ignore_js_op>

4.確認自己的包名和類名!然後在java目錄使用 javah -jni 包名.類名 命令生成.h標頭檔案然後就能看到生成了一個h檔案。注意一定要在java層目錄下輸入命令,不然不會報錯:找不到xxx類
<ignore_js_op>

<ignore_js_op>

<ignore_js_op>

三.新建一個jni資料夾,新建main.c,把.h裡面的內容複製進去,並實現裡面的函式。
1.新建一個jni資料夾
<ignore_js_op>

2.新建main.c
<ignore_js_op>

<ignore_js_op>

3.生成的h檔案

[C]純文字檢視複製程式碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_jwxdxnx06_myJNI */ #ifndef _Included_com_jwxdxnx06_myJNI #define _Included_com_jwxdxnx06_myJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_jwxdxnx06_myJNI * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_jwxdxnx06_myJNI_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif



拷貝修改後的main.c

[C]純文字檢視複製程式碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_jwxdxnx06_myJNI */ #ifndef _Included_com_jwxdxnx06_myJNI #define _Included_com_jwxdxnx06_myJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_jwxdxnx06_myJNI * Method: sayHello * Signature: ()Ljava/lang/String; */ //就實現了個函式 JNIEnv的用法可以自行百度,這裡就不展開了 JNIEXPORT jstring JNICALL Java_com_jwxdxnx06_myJNI_sayHello(JNIEnv *env, jclass jobj) { //返回一句話 return (*env)->NewStringUTF(env,"hello 52pojie!"); } #ifdef __cplusplus } #endif #endif



4.還要在jni資料夾下新增一個空白的util.c檔案,不然會報錯,我也不知道為什麼。
<ignore_js_op>

5、配置NDK開啟Project的local.properties檔案新增NDK路徑 ndk下載連結:https://pan.baidu.com/s/1K0yDiJsn4cI0k1Bnpv920A密碼:hj4o
<ignore_js_op>

6.開啟app Module的build.gradle檔案,在defaultConfig節點裡新增以下程式碼注意這裡的moduleName,是我們在之前自己編寫的類裡面載入的so庫名

[Java]純文字檢視複製程式碼 ?
1 2 3 4 5 ndk { moduleName "JniTest" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }


<ignore_js_op>

7.還要在gradle.properties裡面加上這麼一句話:
android.useDeprecatedNdk=true
<ignore_js_op>

四. 生成SO庫
1.完成以上步驟之後,我們rebuild一下就可以生成so庫了 生成的so在專案的app\build\intermediates\ndk\debug\lib路徑下

<ignore_js_op>

<ignore_js_op>

五.配置so庫
在src\main下新建資料夾jniLIB,並將生成的SO檔案拷貝到該資料夾下

<ignore_js_op>

<ignore_js_op>

六.開啟MainActivity.java插入一條log來呼叫so中的sayHello方法,並連線手機除錯
<ignore_js_op>


<ignore_js_op>

<ignore_js_op>

七.總結
本節課帶你編寫了第一個so檔案,並在java層呼叫了so中的sayHello方法,學習完本節課相信你已經對so有了初步的瞭解,本節課的例子自己一定要跟著做一遍 ,對本節課教程中不懂得有疑問的,自己一定要去百度 。完成本節課的例子後,記得做課後作業。

課後作業:
編寫so並在裡面實現一個加法的功能
最終效果:java層呼叫so中的Add方法,傳入兩個引數22和30,通過log顯示出來52, 記住不懂的百度。


本節課所用到的AndroidStudio專案和生成的Apk:
連結:https://pan.baidu.com/s/12n3QnoRQK01LdG0oFVqTIQ密碼:ndef

本節課參考:https://www.cnblogs.com/wzben/p/5733571.html



下一篇:教我兄弟學Android逆向07 IDA破解第一個so

學習時的痛苦是暫時的 未學到的痛苦是終生的