frida動態(tài)獲取registerNatives方法參數(shù)

分析了下某通信APP,發(fā)現(xiàn)他的數(shù)據(jù)發(fā)包參數(shù)中有三四個參數(shù)在so文件中生成返回;

通過ida動態(tài)調試了下APP的so,發(fā)現(xiàn)有些調試問題,老是阻斷,ida報錯的 tid:5056

這個問題沒能找到解決方法,有老哥知道了,感謝告知;

這個方法走不通,就來一波曲線救國,經(jīng)過一般折騰發(fā)現(xiàn)的registerNatives;

我本來的目的就是查找到動態(tài)注冊函數(shù)的地址,那么他的地址肯定會在registerNatives方法中存在;

那么我們先看看這個register的方法的使用

寫個簡單的demo

const char *classPathName ="com/ex/jni_4/MainActivity";

JNINativeMethod method[] = {{"getString", "()Ljava/lang/String;",(void *) native_getString}};

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved){

JNIEnv *env =NULL;

? ? vm->GetEnv((void **) &env,JNI_VERSION_1_6);

? ? jclass jclass1 = env->FindClass(classPathName);

? ? if (jclass1 ==NULL){

return JNI_ERR;

? ? }

void* p = method;

? ? env->RegisterNatives(jclass1,method,1);

? ? env->DeleteLocalRef(jclass1);

? ? return JNI_VERSION_1_6;

}

registerNatives有四個參數(shù)

env是他的第一個參數(shù)(這個要注意)

第二個參數(shù)是他的Java類

第三個是要注冊的所以方法(在JNINativeMethod 的數(shù)組)

第四個是要注冊的方法數(shù)量

hook registerNatives方法的demo(這里就放出一個js)

var ModuleScanning = function (args) {

Process.enumerateModules({

onMatch: function (exp) {

if (exp.namein args) {

console.log("[*] Module:" + exp.name+ ",Address:" + exp.base);

}

},

onComplete: function () {

}

});

};

var RevealNativeMethods = function () {

console.log("native");

var pSize= Process.pointerSize;

var env= Java.vm.getEnv();

var RegisterNatives= 215, FindClassIndex= 6;// search "215" @ https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html

? ? var jclassAddress2NameMap= {};

var moduleDict= {};

function getNativeAddress(idx) {

return env.handle.readPointer().add(idx * pSize).readPointer();

}

// intercepting FindClass to populate Map

? ? Interceptor.attach(getNativeAddress(FindClassIndex), {

onEnter: function (args) {

jclassAddress2NameMap[args[0]]= args[1].readCString();

},

onLeave: function (args) {

}

});

// RegisterNative(jClass*, .., JNINativeMethod *methods[nMethods], uint nMethods) // https://android.googlesource.com/platform/libnativehelper/+/master/include_jni/jni.h#977

? ? Interceptor.attach(getNativeAddress(RegisterNatives), {

onEnter: function (args) {

for (var i= 0, nMethods= parseInt(args[3]); i< nMethods; i++) {

/*

https://android.googlesource.com/platform/libnativehelper/+/master/include_jni/jni.h#129

typedef struct {

const char* name;

const char* signature;

void* fnPtr;

} JNINativeMethod;

*/

? ? ? ? ? ? ? ? var structSize= pSize* 3;// = sizeof(JNINativeMethod)

? ? ? ? ? ? ? ? var methodsPtr= ptr(args[2]);

var methodName= methodsPtr.add(i* structSize ).readPointer();

var signature= methodsPtr.add(i* structSize+ pSize).readPointer();

var fnPtr= Memory.readPointer(methodsPtr.add(i* structSize+ pSize* 2));// void* fnPtr

? ? ? ? ? ? ? ? var jClass= jclassAddress2NameMap[args[0]].split('/');

var moduleName= DebugSymbol.fromAddress(fnPtr)['moduleName'];

console.log(JSON.stringify({

module: moduleName,// https://www.frida.re/docs/javascript-api/#debugsymbol

? ? ? ? ? ? ? ? ? ? package: jClass.slice(0,-1).join('.'),

class: jClass[jClass.length- 1],

method: methodName.readCString(),// char* name

? ? ? ? ? ? ? ? ? ? signature: signature.readCString(),// char* signature TODO Java bytecode signature parser { Z: 'boolean', B: 'byte', C: 'char', S: 'short', I: 'int', J: 'long', F: 'float', D: 'double', L: 'fully-qualified-class;', '[': 'array' } https://github.com/skylot/jadx/blob/master/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java

? ? ? ? ? ? ? ? ? ? address: fnPtr

}));

moduleDict[moduleName]= "1";

}

},

onLeave: function (args) {

ModuleScanning(moduleDict);

}

});

};

Java.perform(RevealNativeMethods);

效果圖

module是這個so的名稱,我這邊沒能拿到,但不影響我的目標;后面我找到原因了在修改

typedef struct {

const char* name;

const char* signature;

void* fnPtr;

} JNINativeMethod;

這個是源碼中定義的NINativeMethod的結構體

方法名,方法簽名,方法地址

由于沒有打印出該so的基址,

只能通過adb來看了

ps 命令拿到pid

cat /proc/(pid)/maps?



method":"ai","signature":"()Z","address":"0x244905ff

0x244905ff - 0xd1005000 = ida 中 ai方法的地址



引用

JNI調用和動態(tài)注冊探索 · 飯先生 | blog

Android逆向之旅—抖音火山視頻的Native注冊混淆函數(shù)獲取方法 | 尼古拉斯.趙四

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370