zoukankan      html  css  js  c++  java
  • android逆向奇技淫巧三:MT管理器替代android killer修改和重新编译smail代码/frida hook 更改so层代码

      对于逆向同学而言,用android killer打开、分析、修改源代码、重新编译apk是很方便的一件事,所以大部分人都是按照这个流程逆向搞APK的;对于大部分APK而言这么做也是ok的,但是对于少数APK,用android killer打开的时候就会报错,比如前面提到的这款国民级app:

                

       android killer反编译时不管三七二之一,会反编译所有的文件,不仅仅是源代码。其实对于逆向而言,核心需求就是改代码,至于资源、配置文件一般都是不关心的,但是这种报错(有些apk也可能不报错)直接影响了apk的二次编译,比如重新编译时报错如下:

                 

            

           

           明明一行代码也没改,二次编译的时候居然还是爆各种错误,逆向同学感觉“很受伤”!遇到这种情况怎么办了?难道就没办法改apk的smail源码了?这个时候就要借助MT管理器了;打开MT,在data/app目录下选中这款app,单击base.apk后选中功能,弹窗如下:这是MT管理器的核心功能了,非常强大!

      

       返回后点击查看,能看到apk目录的所有文件;这里主要演示修改smail代码,所以选中一个dex,在弹出的窗口中选择dex编辑器:

          

        然后继续选择需要更改代码的部分,比如类列表->方法列表->方法,这里只是做测试,随便选择一个init初始化方法,增加几个空格,如下:然后保存;会弹窗提示保存成功!

          

       再一路返回,选择“保存并退出”!这里选中自动签名,并确定!然后MT会自动打包apk!

         

     改过的dex会变绿:

         

         退回上一级,base.apk也会变绿:

      

        这时在点击base.apk重新安装:签名状态显示的是v1+v2:

     

       然后一路点击安装按钮,就能重新安装我们更改后的apk了!

    =============================分割线==============================================

      Java层的代码用MT管理器修改,so层了?当然可以用010Editor、IDA等修改,但是app有可能会做MD5检测,是完全能检查出so被更改的!这时只能在刚加载so时去更改代码了(防止动态检测反调试),核心js代码如下:先通过linker找到call_funtion的地址,然后hook该函数,看看第三个参数、也就是so的path是不是自己想要更改的so;如果是,就可以直接在内存改so的代码了

    function dis(address, number) {
        for (var i = 0; i < number; i++) {
            var ins = Instruction.parse(address);
            console.log("address:" + address + "--dis:" + ins.toString());
            address = ins.next;
        }
    }
    
    //libc->strstr()  从linker里面找到call_function的地址
    function hook() {
    //call_function("DT_INIT", init_func_, get_realpath());
        var linkermodule = Process.getModuleByName("linker");
        var call_function_addr = null;
        var symbols = linkermodule.enumerateSymbols();
        for (var i = 0; i < symbols.length; i++) {
            var symbol = symbols[i];
            //LogPrint(linkername + "->" + symbol.name + "---" + symbol.address);
            if (symbol.name.indexOf("__dl__ZL13call_functionPKcPFviPPcS2_ES0_") != -1) {
                call_function_addr = symbol.address;
                //LogPrint("linker->" + symbol.name + "---" + symbol.address)
    
            }
        }
        Interceptor.attach(call_function_addr, {
            onEnter: function (args) {
                var type = ptr(args[0]).readUtf8String();
                var address = args[1];
                var sopath = ptr(args[2]).readUtf8String();
                console.log("loadso:" + sopath + "--addr:" + address + "--type:" + type);
                if (sopath.indexOf("libnative-lib.so") != -1) {
                    var libnativemodule = Process.getModuleByName("libnative-lib.so");//call_function正在加载目标so,这时就拦截下来
                    var base = libnativemodule.base;
                    dis(base.add(0x8D8E).add(1), 10);
                    var patchaddr = base.add(0x8d96);//改so的机器码,避免待会完全加载后运行时就错过时机了!
                    Memory.patchCode(patchaddr, 4, patchaddr => {
                        var cw = new ThumbWriter(patchaddr);
                        cw.putNop();
                        cw = new ThumbWriter(patchaddr.add(0x2));
                        cw.putNop();
                        cw.flush();
                    });
                    /*                Memory.protect(base.add(0x8d96),4,'rwx');
                                    base.add(0x8d96).writeByteArray([0x00,0xbf,0x00,0xbf]);*/
                    console.log("+++++++++++++++++++++++")
                    dis(base.add(0x8D8E).add(1), 10);
                    console.log("----------------------")
    
                    dis(base.add(0x8E6E).add(1), 10);
                    Memory.protect(base.add(0x8E78), 4, 'rwx');
                    base.add(0x8E78).writeByteArray([0x00, 0xbf, 0x00, 0xbf]);
                    console.log("+++++++++++++++++++++++")
                    dis(base.add(0x8E6E).add(1), 10);
    
    
                }
            }
        })
    }
    
    function main() {
        hook();
    }
    
    setImmediate(main);

    1、https://space.bilibili.com/10015124  MT管理器介绍

    2、https://space.bilibili.com/377614938  MT管理器介绍

  • 相关阅读:
    Java基础中的一些注意点(续)
    Java基础中的一些注意点
    Java基础知识学习
    JavaScript DOM2
    JavaScript window
    函数
    JavaScript数组
    JavaScript循环练习2
    JavaScript循环练习
    JavaScript循环
  • 原文地址:https://www.cnblogs.com/theseventhson/p/14699733.html
Copyright © 2011-2022 走看看