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)访问 ...
随机推荐
- WCF服务对象实例化基础
很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...
- [转]NodeJS、NPM安装配置步骤(windows版本)
1.windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的“INSTALL” ...
- rel=nofollow 是什么意思
nofollow是什么意思? nofollow是html标签的一个属性值,Google推荐使用nofollow,告诉机器(爬虫)无需追踪目标页,是指禁止蜘蛛爬行和传递权重,但是如果你是通过sitema ...
- hiho一下103周 平衡树·Treap
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- Fastreport怎么样在同一页上下部分打印相同内容
使用FastReport遇到个难题,不知道怎么解决 分组打印之后,需要同一页上下部分打印相同内容,就是一式两份的联单打印. 例如: 送货单 ********** A 这里上半页,地区分组之后的内容 * ...
- 简化 Django
http://www.oschina.net/translate/simplifying-django 尽管Django的流行和普及, 一些开发者仍然认为她是一个过时的web开发框架, 仅仅适合内容丰 ...
- Borg Maze poj 3026
Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of ...
- 我的VSTO之路(五):Outlook初步开发之联系人扩展
原文:我的VSTO之路(五):Outlook初步开发之联系人扩展 上一讲我们完成对Word的介绍,文本开始,我将着重介绍Outlook.Outlook是微软Office中一个非常实用的工具,尤其在一个 ...
- struts2框架通过jQuery实现AJAX应用
众所周知,在web2.0时代,哪个web框架要是不跟AJAX沾点边,都不好意思说自己的框架有多么多么NB,当然struts也不例外,从 struts1开始到现在的struts2也都对AJAX有支持.A ...
- VS2010中fatal error LNK1123错误的解决方案
问题描述: 在VS2010项目编译时会出现如下错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 解决方案: 查找是否有两个cvtres.exe ...