0x01 作用

hook native层的RegisterNatives函数,打印注册的函数名和函数地址

0x02 代码

  1. var ishook_libart = true;
  2. function hook_libart() {
  3. if (ishook_libart === false) {
  4. return;
  5. }
  6. var symbols = Module.enumerateSymbolsSync("libart.so");
  7. var addrGetStringUTFChars = null;
  8. var addrNewStringUTF = null;
  9. var addrFindClass = null;
  10. var addrGetMethodID = null;
  11. var addrGetStaticMethodID = null;
  12. var addrGetFieldID = null;
  13. var addrGetStaticFieldID = null;
  14. var addrRegisterNatives = null;
  15. var addrAllocObject = null;
  16. var addrCallObjectMethod = null;
  17. var addrGetObjectClass = null;
  18. var addrReleaseStringUTFChars = null;
  19. for (var i = 0; i < symbols.length; i++) {
  20. var symbol = symbols[i];
  21. if (symbol.name == "_ZN3art3JNI17GetStringUTFCharsEP7_JNIEnvP8_jstringPh") {
  22. addrGetStringUTFChars = symbol.address;
  23. // console.log("GetStringUTFChars is at ", symbol.address, symbol.name);
  24. } else if (symbol.name == "_ZN3art3JNI12NewStringUTFEP7_JNIEnvPKc") {
  25. addrNewStringUTF = symbol.address;
  26. // console.log("NewStringUTF is at ", symbol.address, symbol.name);
  27. } else if (symbol.name == "_ZN3art3JNI9FindClassEP7_JNIEnvPKc") {
  28. addrFindClass = symbol.address;
  29. // console.log("FindClass is at ", symbol.address, symbol.name);
  30. } else if (symbol.name == "_ZN3art3JNI11GetMethodIDEP7_JNIEnvP7_jclassPKcS6_") {
  31. addrGetMethodID = symbol.address;
  32. // console.log("GetMethodID is at ", symbol.address, symbol.name);
  33. } else if (symbol.name == "_ZN3art3JNI17GetStaticMethodIDEP7_JNIEnvP7_jclassPKcS6_") {
  34. addrGetStaticMethodID = symbol.address;
  35. // console.log("GetStaticMethodID is at ", symbol.address, symbol.name);
  36. } else if (symbol.name == "_ZN3art3JNI10GetFieldIDEP7_JNIEnvP7_jclassPKcS6_") {
  37. addrGetFieldID = symbol.address;
  38. // console.log("GetFieldID is at ", symbol.address, symbol.name);
  39. } else if (symbol.name == "_ZN3art3JNI16GetStaticFieldIDEP7_JNIEnvP7_jclassPKcS6_") {
  40. addrGetStaticFieldID = symbol.address;
  41. // console.log("GetStaticFieldID is at ", symbol.address, symbol.name);
  42. } else if (symbol.name == "_ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi") {
  43. addrRegisterNatives = symbol.address;
  44. console.log("RegisterNatives is at ", symbol.address, symbol.name);
  45. } else if (symbol.name.indexOf("_ZN3art3JNI11AllocObjectEP7_JNIEnvP7_jclass") >= 0) {
  46. addrAllocObject = symbol.address;
  47. // console.log("AllocObject is at ", symbol.address, symbol.name);
  48. } else if (symbol.name.indexOf("_ZN3art3JNI16CallObjectMethodEP7_JNIEnvP8_jobjectP10_jmethodIDz") >= 0) {
  49. addrCallObjectMethod = symbol.address;
  50. // console.log("CallObjectMethod is at ", symbol.address, symbol.name);
  51. } else if (symbol.name.indexOf("_ZN3art3JNI14GetObjectClassEP7_JNIEnvP8_jobject") >= 0) {
  52. addrGetObjectClass = symbol.address;
  53. // console.log("GetObjectClass is at ", symbol.address, symbol.name);
  54. } else if (symbol.name.indexOf("_ZN3art3JNI21ReleaseStringUTFCharsEP7_JNIEnvP8_jstringPKc") >= 0) {
  55. addrReleaseStringUTFChars = symbol.address;
  56. // console.log("ReleaseStringUTFChars is at ", symbol.address, symbol.name);
  57. }
  58. }
  59. if (addrRegisterNatives != null) {
  60. Interceptor.attach(addrRegisterNatives, {
  61. onEnter: function (args) {
  62. console.log("[RegisterNatives] method_count:", args[3]);
  63. var env = args[0];
  64. var java_class = args[1];
  65. var funcAllocObject = new NativeFunction(addrAllocObject, "pointer", ["pointer", "pointer"]);
  66. var funcGetMethodID = new NativeFunction(addrGetMethodID, "pointer", ["pointer", "pointer", "pointer", "pointer"]);
  67. var funcCallObjectMethod = new NativeFunction(addrCallObjectMethod, "pointer", ["pointer", "pointer", "pointer"]);
  68. var funcGetObjectClass = new NativeFunction(addrGetObjectClass, "pointer", ["pointer", "pointer"]);
  69. var funcGetStringUTFChars = new NativeFunction(addrGetStringUTFChars, "pointer", ["pointer", "pointer", "pointer"]);
  70. var funcReleaseStringUTFChars = new NativeFunction(addrReleaseStringUTFChars, "void", ["pointer", "pointer", "pointer"]);
  71. var clz_obj = funcAllocObject(env, java_class);
  72. var mid_getClass = funcGetMethodID(env, java_class, Memory.allocUtf8String("getClass"), Memory.allocUtf8String("()Ljava/lang/Class;"));
  73. var clz_obj2 = funcCallObjectMethod(env, clz_obj, mid_getClass);
  74. var cls = funcGetObjectClass(env, clz_obj2);
  75. var mid_getName = funcGetMethodID(env, cls, Memory.allocUtf8String("getName"), Memory.allocUtf8String("()Ljava/lang/String;"));
  76. var name_jstring = funcCallObjectMethod(env, clz_obj2, mid_getName);
  77. var name_pchar = funcGetStringUTFChars(env, name_jstring, ptr(0));
  78. var class_name = ptr(name_pchar).readCString();
  79. funcReleaseStringUTFChars(env, name_jstring, name_pchar);
  80. //console.log(class_name);
  81. var methods_ptr = ptr(args[2]);
  82. var method_count = parseInt(args[3]);
  83. for (var i = 0; i < method_count; i++) {
  84. var name_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3));
  85. var sig_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize));
  86. var fnPtr_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2));
  87. var name = Memory.readCString(name_ptr);
  88. var sig = Memory.readCString(sig_ptr);
  89. var find_module = Process.findModuleByAddress(fnPtr_ptr);
  90. console.log("[RegisterNatives] java_class:", class_name, "name:", name, "sig:", sig, "fnPtr:", fnPtr_ptr, "module_name:", find_module.name, "module_base:", find_module.base, "offset:", ptr(fnPtr_ptr).sub(find_module.base));
  91. }
  92. },
  93. onLeave: function (retval) { }
  94. });
  95. }
  96. ishook_libart = true;
  97. }
  98. hook_libart();
  99. //frida -U --no-pause -f co.c0c.myApplication -l hookregisternatives.js