安卓逆向分析之ida动态调试APP

一。分析app包

  1. 可以使用 apktool 进行拆包,这里不进行打包签名,直接解压,看到有如下等信息。

   2. 进入 assets 查看,发现全部是 lua 文件。

   3. 打开 lua 文件发现已经加密了, 且全部文件都是以 DADDY 开头,可以推测这是 cocos 加载 lua 文件。

  4. 打开 lib 里的库文件发现了加载 lua 文件的 .so 二进制文件, 可以知道加密解密 lua 文件就在这里面处理的了。

   5. 查看 lib 里只有 arm 架构,所以不能用模拟器调试,需要用真机调试。

 二。配置真机调试

  1. 一台 root 的安卓手机,设置里打开 开发者选项,勾选USB调试。

  2. 在 ida 安装目录找到对应的 android_server ,32 位 arm 就是 android_server 

   3. 把 android_server 拷贝到 安卓手机里面

   4. 以 root 权限进入安卓手机

   5. 赋予 android_server 全部权限

   6. 启动 android_server

   7. 下载 mprop ,目的是设置所有 app 可调试

链接:https://pan.baidu.com/s/1bTF2R9S-y0X1qStwZjCohw  密码:7agb

  8. 把对应的 mprop 放到安卓手机里,并以 root 权限进入该目录

   9. 赋予权限,运行,并设置可调试

   10. 查看是否可调试成功

   11. 转发本机端口到 安卓 android_server监听的端口

  12. 完成真机环境

三。ida 动态调试

  1. 启动要调试的 app

  2. 打开 ida,选择 GO

   3. 点击下图 attach 调试

  4.  填写地址和端口,点击确定,因为本地已经转发了端口,所以填 127.0.0.1 ,如果没有转发端口,输入安卓手机的IP

   5. 找到要调试的 进程ID 或者 包名,可以点下方的搜索直接搜, 进程ID和包名可以在安卓里面 ps 看到

   6. 确定之后可以看到该程序的汇编代码,且程序被暂停了

  7. 在想要的地方打上断点,点击左上角的运行,然后就可以操作安卓里的app了,会在执行到断点的地方暂停程序,然后就可以分析了

四。ida 常用功能

  1. 列出程序所加载的所有静态库,即 .so 二进程文件

   2. 在所有静态库中找出要调试的, 这里我们找加载 lua 文件的 so 库,ctrl + f 可以搜索

   3. 双击进去即可找到该库的所有方法了, ctrl + f 可以搜索

   4. 双击要找的方法,进入该方法的汇编,按 F5 可以得到该汇编的伪代码

   5. 可以直接在伪代码中打断点调试

   6. 鼠标悬浮在变量上可查看到变量保存在哪个寄存器里和变量的虚拟地址,右边也可以查看寄存器保存的虚拟内存地址

   7. 双击变量可以跳到变量存储的值

   8. 右击十六进制视图同步ida视图,即可同步到一起

 可以在十六进制视图里看到详细的信息

   9. 右点击十六进制视图可以编辑内存里的值

 编辑完右点击更新值

   10. 地址保存的是0即为变量的结束地址

十六进制里的 00 值

 

  11. 把内存里的值导出来

点击run,就可以以导出开始地址到结束地址的内容

 

static main(void){
    auto fp, dex_addr,end_addr;
    //打开或创建一个文件
    fp = fopen("/Users/zgh/Desktop/111/11.txt", "wb");
    for ( dex_addr = 0xAC6D3058; dex_addr < 0xAC6D336B;    dex_addr ++ ){
      //按字节将其dump到本地文件中
      fputc(Byte(dex_addr), fp);
    }
}

  12.  找到 *(_DWORD *) 里的值,也就是指针的值

比如这个 a2,开始地址为 DC7002D4

 

双击可以查看到地址里的内容,局部变量存储在 栈 中,存储的地址为 ad65d2d4

 右点击跳转地址

 输入地址即可跳转

 跳转后十六进制视图可以查看到值

  13. 打开另一个窗口的ida,把 so 文件拖进去分析可以得到更加详细的代码信息。

五。逆向分析cocos解密lua流程

  1.  在ida字符串中搜索 sign ,能找到 sign 可以在旁边找到key, 如果搜索不出来说明被优化处理了,接着第2步

  2. 找 luaL_loadbuffer 函数,这个函数出来的内容是已经解密的 lua 文件内容,可以直接导出,如果没有说明也被优化过了,到第三步

  3. 找 xxtea_decrypt 解密函数 和 xxtea_encrypt 加密函数,第一个参数为要加密或者解密的内容,第三个参数是加密或者解密的key ,如过也没有,到第四步

  4. 找 getfiledata 函数,不管怎么优化 so 文件,都必定需要有一个加载 lua 文件的起始 ,就可以顺着往下找加密解密函数以及相关的key了

  5. 注意有可能对 lua 文件做多重加密,所以需要多次解密。

六。参考

https://www.jianshu.com/p/4307cdb4b147

https://www.freebuf.com/articles/network/173217.html

posted @ 2020-08-01 03:10  Python++  阅读(3023)  评论(0编辑  收藏  举报