第八章 Android 原生程序开发与逆向分析(六)(原生 C++ 程序逆向分析 - C++ STL 的逆向分析)

本文详细介绍了Android原生C++程序逆向分析,特别是针对C++ STL的逆向。分析了使用STL的C++程序在静态和动态链接时的不同,以及如何处理静态链接STL带来的逆向分析挑战,包括使用IDA的签名功能来识别静态库函数。
摘要由CSDN通过智能技术生成

原生 C++ 程序逆向分析

  • C++ 程序比 C 复杂很多:除了基本的分支语句结构,还有很多 C 不具备的面向对象的特性和标准模板库

C++ STL 的逆向分析

  • 先看使用 STL 后如何对非面向对象的 C++ 程序静态分析
  • 实例:app7.cpp
#include <iostream>
#include <map>
#include <string>
#include <vector>

int main(int argc, char const *argv[])
{
    std::map<int, std::string> maps;
    std::vector<std::string> vecs;

    maps[1] = "android";
    maps[2] = "ios";
    maps[3] = "macos";

    vecs.push_back("android");
    vecs.push_back("ios");
    vecs.push_back("macos");

    std::map<int, std::string>::const_iterator cit;
    for (cit = maps.begin(); cit != maps.end(); cit++)
    {
        std::cout << cit->second << " re book published." << std::endl;
    }

    std::vector<std::string>::const_iterator cit2;
    for (cit2 = vecs.begin(); cit2 != vecs.end(); cit2++)
    {
        std::cout << *cit2 << " 2nd re book publised." << std::endl;
    }
    
    return 0;
}

  • 上述代码用了 STL 中的数据结构 string、map、vector,以及标准输入/输出的 std::cout,通过两个 for 循环遍历 map 和 vector,分别打印三行字符串
  • 编译并运行输出结果:
    在这里插入图片描述
  • 编译 app7 时用的 -lc++_shared(其实是 Clang 默认的,不用输入)参数指定了编译时使用 shared 版本的 c++(stl),因此程序运行时会依赖 libc++_shared.so。若将 app7 上传到 Android 设备中运行,在程序运行时要通过 LD_LIBRARY_PATH 环境变量指定 libc++_shared.so 的路径(不然会如上图一般报错)。若用 ndk-build 方式编译 app7,则可在 Application.mk 中指定 APP_STL 选项。若用 Android Studio 的 CMake 方式编译 app7,则可指定 ANDROID_STL 选项。独立工具链能用哪些 STL(现在的版本只能用 libc++),取决于运行构建脚本时传入的 --stl 选项,若没指定该选项,gcc 默认用 libgnustl_shared,Clang 默认用 libc++
  • 用 objdump 查看 main() 的反汇编:
root@myUbuntu:~# $OBJDUMP -d app7 | grep "<main>:" -A 49
0000000000001858 <main>:
    1858:    f81e0ffc     str    x28, [sp,#-32]!
    185c:    a9017bfd     stp    x29, x30, [sp,#16]
    1860:    910043fd     add    x29, sp, #0x10
    1864:    d10983ff     sub    sp, sp, #0x260
    1868:    320003e8     orr    w8, wzr, #0x1
    186c:    d0000049     adrp    x9, b000 <search_object+0x18c>
    1870:    91221129     add    x9, x9, #0x884
    1874:    d000004a     adrp    x10, b000 <search_object+0x18c>
    1878:    9122314a     add    x10, x10, #0x88c
    187c:    d000004b     adrp    x11, b000 <search_object+0x18c>
    1880:    9122416b     add    x11, x11, #0x890
    1884:    d280000c     mov    x12, #0x0                       // #0
    1888:    b00000ed     adrp    x13, 1e000 <GCC_except_table338+0x1027c>
    188c:    f947ddad     ldr    x13, [x13,#4024]
    1890:    d000004e     adrp    x14, b000 <search_object+0x18c>
    1894:    9122a9ce     add    x14, x14, #0x8aa
    1898:    b000000f     adrp    x15, 2000 <_ZNSt6__ndk120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeIiNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPNS_11__tree_nodeIS9_PvEElEEEC2Ev+0x8>
    189c:    910951ef     add    x15, x15, #0x254
    18a0:    d0000050     adrp    x16, b000 <search_object+0x18c>
    18a4:    91225a10     add    x16, x16, #0x896
    18a8:    d100e3b1     sub    x17, x29, #0x38
    18ac:    d10143a2     sub    x2, x29, #0x50
    18b0:    d10153a3     sub    x3, x29, #0x54
    18b4:    b81ec3bf     stur    wzr, [x29,#-20]
    18b8:    b81e83a0     stur    w0, [x29,#-24]
    18bc:    f81e03a1     s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值