c++逆向 vector
最近弄Android c/c++方面的逆向,发现c++的类,stl模板,在逆向的时候相比c语言都带来了不小的困难。
今天自己写了个小程序,然后逆向分析了一下
vector<int> array_int; array_int.push_back(1); array_int.push_back(2); array_int.push_back(5);
定义一个vector,然后添加数据。
ida反汇编如下:(已添加注释)
. int_tmp = -0x18
. vector_ptr = -0x14
. var_8 = -
.
. PUSH {R4-R7,LR}
. LDR R5, =(__stack_chk_guard_ptr - 0x1170)
. SUB SP, SP, #0x1C
.
.text:0000116C ADD R5, PC ; __stack_chk_guard_ptr
.text:0000116E LDR R5, [R5] ; __stack_chk_guard
. ADD R6, SP, #0x1C+vector_ptr
. ; [SP,#0x1C+int_tmp]
. LDR R3, [R5]
. MOVS R0, R6
. STR R3, [SP,#0x1C+var_8]
.
.text:0000117C MOVS R1, R7
.text:0000117E STR R3, [SP,#0x1C+int_tmp]
. STR R4, [SP,#0x1C+vector_ptr]
. ]
. ]
. BL _ZNSt6vectorIiSaIiEE9push_backERKi ; std::vector<int,std::allocator<int>>::push_back(int const&)
.
.text:0000118C MOVS R0, R6
.text:0000118E MOVS R1, R7
. STR R3, [SP,#0x1C+int_tmp]
. BL _ZNSt6vectorIiSaIiEE9push_backERKi ; std::vector<int,std::allocator<int>>::push_back(int const&)
. MOVS R3, #
. MOVS R0, R6
.text:0000119A MOVS R1, R7
.text:0000119C STR R3, [SP,#0x1C+int_tmp]
.text:0000119E BL _ZNSt6vectorIiSaIiEE9push_backERKi ; std::vector<int,std::allocator<int>>::push_back(int const&)
分析如下:
. ADD R6, SP, #0x1C+vector_ptr
将栈的vector_ptr处的地址复制给R6
. ; [SP,#0x1C+int_tmp]
将sp+4的地址赋值给R7 ,这个地址相当于栈的int_tmp处
. MOVS R0, R6
将vector_ptr的地址赋值给R0,作为push_back的第一个参数
.(顺序已调整,看地址号) . .text:0000117C MOVS R1, R7 .text:0000117E STR R3, [SP,#0x1C+int_tmp] . STR R4, [SP,#0x1C+vector_ptr]
将要push_back的int值1储存到栈的int_tmp处。将R7赋值给R1,作为push_back的第二个参数,第一个参数为vector对象指针,也就是this指针。
将vector_ptr处赋值为0。
. ] . ]
将vector_ptr处的后两个栈中的项赋值为0,其中[R6,#4]处保存的是vector中的最后一项元素的下一项的指针,相当于end()。
而[R6,#8]处的值也会随着一次次push_back发生改变,暂时没有发现其作用
. BL _ZNSt6vectorIiSaIiEE9push_backERKi ; std::vector<int,std::allocator<int>>::push_back(int const&)
执行push_back(R0,R1)
这是R0里边为vector_ptr的地址(地址处的值为0),R1为int_tmp的地址(地址处的值为要添加的数据1)
执行完这一句时,vector_ptr地址的处的值将被修改为对象array_int的地址。
在以后的每次push_back()操作,vector_ptr处,vector_ptr+4处,vector_ptr+8处的值都会变化。
对应的函数原型为push_back(vector<int>*,int*)
调试结果:
第一次push_back

第二次push_back

第三次push_back

最后附上循环打印的代码
for (vector<int>::size_type i = 0; i < array_int.size(); ++i) {
cout<<array_int.at(i);
}

整个循环过程就比较容易理解了.
c++逆向 vector的更多相关文章
- 数据结构逆向分析-Vector
数据结构逆向分析-Vector 这个应该是家喻户晓了的东西把,如果说C/C++程序员Vector都不用的话,可能就是一个不太好的程序员. Vector就是一个STL封装的动态数组,数组大家都知道是通过 ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- Java中vector的使用详解
Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提 ...
- C++ 中的std::vector介绍(转)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- vector algorithm find
本来想着申请了博客园以后 我要写的博客都必须是有深度有内涵的...好吧 结果我只能说我想多了 还是得一步一步慢慢来 最近小学期的任务是要做一个学校食堂餐卡管理系统 有“严重拖延症”的我 果然 ...
- C++中 vector(容器)的用法
vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: ...
- C++中vector的用法
C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...
- STL vector
STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...
随机推荐
- js+dom开发第十六天
一.css常用标签及页面布局 1.常用标签 position(定位) z-index(定位多层顺序) background(背景) text-align(针对字符自动左右居中) margin(外边距) ...
- Python Tutorial 学习(三)--An Informal Introduction to Python
3.1. 将Python用作计算器 3.1.1. Numbers 数 作为一个计算器,python支持简单的操作, '+','-','*','/'地球人都知道的加减乘除. ()可以用来改变优先级,同数 ...
- 使用windows live writer 编辑博客日志
使用Windows Live Writer 编辑日志 一 意义 写博客日志是个需要坚持的好习惯.使用Windows Live Writer,能不受网页自带编辑器限制. Markdown支持.安装mar ...
- MySQL 执行计划explain详解
MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...
- STM32 枚举类型和结构体的使用
结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型. 首先结构体可以在一个结构中声明不同的数据类型. 第二相同结构的结构体变量是可以相互赋值的,而 ...
- c++ 顺序容器学习 - 容器适配器
摘要: 对 容器适配器 的疑问. 刚开始接触 容器适配器 时,总感觉怪怪的,认为多此一举,顺手搜了搜,原来我在这一点is not alone: STL容器适配器的用途 其中有个老兄说的好,这里 引用一 ...
- 面向对象涉及SOLID原则
S = Single Responsibility Principle 单一职责原则 O = Opened Closed Principle 开放闭合原则 L = Liscov Substituti ...
- 一步一步学习SignalR进行实时通信_8_案例2
原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...
- linux 里 /etc/passwd 、/etc/shadow和/etc/group 文件内容解释
•/etc/passwd文件用于存放用户账户信息,每行代表一个账户,每个账户的各项信息用冒号分割,例如: root:x:::root:/root:/bin/bash username:password ...
- windows7旗舰版IIS6配置-保证能发布
http://wenku.baidu.com/view/20b4d26248d7c1c708a145d1.html