zoukankan      html  css  js  c++  java
  • 爱加密加固病毒分析-脱壳篇

    一.文件信息

    文件名称:久秒名片赞系统 
    包名: android.support.v8 
    大小: 1497829 bytes 
    MD5: 8123AC1150B47EF53507EC2360164E3B 
    SHA1: 958B1E341C72DBCF52863C570B77C71A862987B1 
    程序壳:爱加密 
    描述:爱加密有反调试功能,无法直接给关键函数下断点,所以只能单步跟踪到它检测反调试的地方修改比较值,从而跳过反调试。壳程序通过读取进程文件(/proc/uid/status)中的TracerPid属性来确认自己是否被调试,该属性如果不为0则说明程序是被调试状态。如果要获取该文件的值那么必然是有读写操作的,通过在读写函数地方下断点,就可以修改它的值从而骗过反调试。即只要在fopen和fgets处下断点单步跟踪就可以了(函数在libc.so)。


    二.调试准备

    1. 安装IDA Pro 服务器: 
      adb push android_server /data/local/tmp 
      设置服务器运行权限: 
      cd data/local/tmp/ chmod 777 android_server 
      运行服务: 
      adb shell & cd /data/local/tmp & ./android_server 
      设置端口转发: 
      adb forward tcp:23946 tcp:23946
    2. 调试运行 
      adb shell am start -D -n android.support.v8/android.support.v7.q448870015
    3. IDA 附加进程调试 
      Debugger -> Attach 
      Ctrl+F 搜索 android.support.v8
    4. 函数下断点 
      Modules中搜索 libc.so 
      给fopen,fgets下断点 
      Modules 中搜索 libdvm.so 
      给dvmDexFileOpenPartia 下断点
    5. jdb调试 
      打开monitor 
      鼠标选中要调试的进程(android.support.v8) 
      jdb–connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

    三.调试脱壳

    环境准备好后按F9 开始运行程序,这时会断到我们下断点的地方。 
    这里写图片描述 
    此时 R7寄存器中有值 /proc/self/cmdline.debug.atrace 
    这里写图片描述 
    使用adb查看

    这里写图片描述

    继续F9 运行让程序再次断在fopen函数处。在运行的过程中可能出现如下错误提示,忽略它继续运行。
    

    这里写图片描述

    这里写图片描述 
    程序再次断在fopen函数处,这时 R7寄存器中的值 
    这里写图片描述 
    即 /proc/11446/status ,从这里开始壳程序开始读取status文件检查自己是否被调试跟踪了。继续F9运行。程序会断在fgets函数处,这时我们在函数结束处下断点。查看函数返回值,如果是TracerPid属性则修改值为0。 
    程序运行到函数末尾断点处,此时查看R0寄存器的值 
    这里写图片描述 
    即 Name:roidd.support.v8 
    通过查看status文件可以知道,这个值是文件内第一行的字符串 
    这里写图片描述

    从这里就可以知道程序还需要在运行5次才能读到 TracerPid属性 
    F9运行5次,在次查看fgets函数返回值 
    这里写图片描述 
    Tracerpid:11465 
    这个值正是IDA 服务器进程的UID 
    这里写图片描述 
    在Hex View中按F2修改这个值 
    这里写图片描述 
    这里写图片描述 
    这里要注意,修改的颜色是橙黄色,但是还不能使用,必须在按F2应用才行。 
    这里写图片描述 
    修改完之后,再次F9运行程序。 
    这里写图片描述 
    在次断在fopen函数处,此时R0寄存器的值 
    这里写图片描述 
    可以看到,壳程序再次读取 /proc/11446/status 文件。显然反调试不是只有一次的,那么继续修改它的返回值,直到不再读取这个文件。 
    通过再次修改,壳程序不再读取 /proc/11446/status文件了。说明它的反调试就比较了两次,那么现在就可以去掉fgtes断点按F9让程序跑起来了。 
    程序断在了这个函数处,这说明壳开始解密dex了同时证明前面已经成功欺骗了反调试,继续单步观察寄存器中的值。 
    这里写图片描述 
    R0寄存器中保存着dex在内存中的地址,R1寄存器中保存着dex文件的大小。 
    这里写图片描述 
    通过Hex View 查看内存 
    这里写图片描述 
    内存中已经显示 0A 78 65 64 dex文件头模数了,右边字符串同样显示着dex.035。红框中 06 FD 00 和R1寄存器的值一样。已经得到了dex内存地址和大小,接着使用IDA脚本dump出这个dex文件。

    static main(void)
        {
            auto fp, begin, end, dexbyte;
            fp = fopen("F:\dump.dex", "wb"); //打开或创建一个文件
            begin =  R0;                       //dex基址
            end = begin + R1;                  //dex基址 + dex文件大小
            for ( dexbyte = begin; dexbyte < end;dexbyte ++ )
            {
                fputc(Byte(dexbyte), fp);     //按字节将其dump到本地文件中
            }
        }

    这里写图片描述 
    将dump出的文件使用工具打开: 
    这里写图片描述 
    文件能正常打开,下一篇分析锁机密。


    四.问题总结

    调试环境中出现问题的解决: 
    IDA附加程序时显示目标积极拒绝则 重新输入端口转发命令。 
    IDA附加程序弹出错误则 重新运行IDA服务器命令 
    IDA F9运行程序如果没有反应则 检查是否输入jdb调试命令。 
    因为该程序是加壳的锁机软件,所有调试过程中难免会因为错误步骤让程序运行起来从而导致锁机,这时可以运行 adb uninstall android.support.v8 卸载锁机软件(注意:在手机被锁后切勿拔掉usb数据线)。

  • 相关阅读:
    数据挖掘常用算法
    helloworld
    sqlserver 变量级基本语法
    存储过程
    动态代理jdk 和cglib
    创建表添加约束
    sqlserver 子查询
    创建数据库
    javaScript实现同意等待——心得
    JavaScript关于不要复制黏贴代码的心得
  • 原文地址:https://www.cnblogs.com/NigelX/p/6671485.html
Copyright © 2011-2022 走看看