原生 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