当前位置:   article > 正文

i茅台app逆向分析frida反调试_frida process terminated

frida process terminated

文章仅供思路参考,请勿用作非法攻击

环境:

i茅台 1.3.7

frida 14.2.17

安卓 9 系统


frida注入

常规frida不注入任何脚本

frida -U -f com.moutai.mall --no-pause
  1. / _ | Frida 14.2.17 - A world-class dynamic instrumentation toolkit
  2. | (_| |
  3. > _ | Commands:
  4. /_/ |_| help -> Displays the help system
  5. . . . . object? -> Display information about 'object'
  6. . . . . exit/quit -> Exit
  7. . . . .
  8. . . . . More info at https://frida.re/docs/home/
  9. Spawned `com.moutai.mall`. Resuming main thread!
  10. [MI 8::com.moutai.mall]-> Process terminated
  11. [MI 8::com.moutai.mall]->

这种情况就是有frida反调试,frida的反调试可以写在java层或者so层,搜罗网上的方法,比较

普遍的就是:使用葫芦娃版本的frida、改frida_server的名称,修改frida_server的端口,文章中的frida_server均已满足以上条件,情况比较严峻。

反调试定位:

这个app是有壳的,防护大概率会是在so层,毕竟java层的反调试已经过时了,我们可以通过hook安卓系统的libdl.so中的android_dlopen_ext来定位问题出现在哪个so,定位到具体so再定位so里面的反调试线程,找出来反调试线程最终把反调试线程替换成空函数以达到绕过frida检测的目的,以下是hook 安卓系统libdl.so中的android_dlopen_ext函数代码

  1. function hook_dlopen(soName = '') {
  2. Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"),
  3. {
  4. onEnter: function (args) {
  5. var pathptr = args[0];
  6. if (pathptr !== undefined && pathptr != null) {
  7. var path = ptr(pathptr).readCString();
  8. console.log(path);
  9. }
  10. }
  11. }
  12. );
  13. }
  14. setImmediate(hook_dlopen,"");

 以上hook代码的作用用于定位反调试出现在哪个so文件

  1. └─# frida -U -f com.moutai.mall -l imoutai.js --no-pause
  2. ____
  3. / _ | Frida 14.2.17 - A world-class dynamic instrumentation toolkit
  4. | (_| |
  5. > _ | Commands:
  6. /_/ |_| help -> Displays the help system
  7. . . . . object? -> Display information about 'object'
  8. . . . . exit/quit -> Exit
  9. . . . .
  10. . . . . More info at https://frida.re/docs/home/
  11. Spawned `com.moutai.mall`. Resuming main thread!
  12. [MI 8::com.moutai.mall]-> /system/framework/oat/arm64/org.apache.http.legacy.boot.odex
  13. /data/app/com.moutai.mall-ZqwkhQsJ0Sxyv7X-FRkGlw==/oat/arm64/base.odex
  14. /data/app/com.moutai.mall-ZqwkhQsJ0Sxyv7X-FRkGlw==/lib/arm64/libnesec.so
  15. Process terminated
  16. [MI 8::com.moutai.mall]->
  17. Thank you for using Frida!

 通过将js代码注入到目标app,根据以上显示可以发现 libnesec.so 的可能性非常大,注入多次后仍然是停留在这个so,说明这个so内部有函数做了反调试处理。我们修改修改js代码,以便能定位反调试线程,新的js代码如下:

  1. var soaddr = null;
  2. function hook_dlopen(soName = '') {
  3. Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"),
  4. {
  5. onEnter: function (args) {
  6. var pathptr = args[0];
  7. if (pathptr !== undefined && pathptr != null) {
  8. var path = ptr(pathptr).readCString();
  9. if (path.indexOf(soName) != -1) {
  10. this.hook = true;
  11. }
  12. console.log(path);
  13. }
  14. },
  15. onLeave:function(ret){
  16. if (this.hook = true) {
  17. soaddr = Module.findBaseAddress("libnesec.so");
  18. hook_pthread_create();
  19. }
  20. }
  21. }
  22. );
  23. }
  24. function printNativeStack(context, name) {
  25. var trace = Thread.backtrace(context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("\n");
  26. console.log(trace)
  27. }
  28. function hook_pthread_create() {
  29. Interceptor.attach(Module.findExportByName("libc.so", "pthread_create"), {
  30. onEnter(args) {
  31. var func_addr = args[2]
  32. var offes = func_addr.sub(soaddr);
  33. console.log("The thread function address is " + offes);
  34. }
  35. })
  36. }
  37. setImmediate(hook_dlopen,"libnesec.so");

 注入以上代码返回以下

  1. ──(root
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/484653
    推荐阅读
    相关标签