最近弄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的更多相关文章

  1. 数据结构逆向分析-Vector

    数据结构逆向分析-Vector 这个应该是家喻户晓了的东西把,如果说C/C++程序员Vector都不用的话,可能就是一个不太好的程序员. Vector就是一个STL封装的动态数组,数组大家都知道是通过 ...

  2. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  3. Java中vector的使用详解

    Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提 ...

  4. C++ 中的std::vector介绍(转)

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

  5. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  6. vector algorithm find

    本来想着申请了博客园以后 我要写的博客都必须是有深度有内涵的...好吧 结果我只能说我想多了 还是得一步一步慢慢来 最近小学期的任务是要做一个学校食堂餐卡管理系统     有“严重拖延症”的我  果然 ...

  7. C++中 vector(容器)的用法

    vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: ...

  8. C++中vector的用法

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...

  9. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

随机推荐

  1. php之分页类代码

    /* 思路 1.把地址栏的URL获取 2.分析URL中的query部分--就是?后面传参数的部分 3.query部分分析成数组 4.把数组中的page单元,+1,-1,形成2个新的数组 5.再把新数组 ...

  2. php把文件上传到远程服务器上例子

    在这里我们利用curl实现把本地服务器的文件通过curl发送请求给远程服务器的php文件接受就实现了上传,还一个是利用ftp来上传方法也是php中的curl操作ftp服务器进行上传. 我这里写的是用c ...

  3. ObjectiveC1基础代码——类和对象

    // //  main.m //  ObjectiveC1 // //  Created by scjy on 15/10/30. //  Copyright © 2015年 lizhipeng. A ...

  4. IOS--UIButton的使用方法

    设置UIButton的文字显示位置.字体的大小.字体的颜色 分类: iphone界面详解2012-12-21 14:32 27269人阅读 评论(2) 收藏 举报 btn.frame = CGRect ...

  5. UIview lianxi

    // 创建一个和屏幕大小相同的window,记住[UIScreen mainScreen].bounds 是获取当前屏幕大小 self.window = [[[UIWindow alloc] init ...

  6. 在 C++Builder 工程里使用 Visual C++ DLL(3个工具) good

    译者序: 第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题.本来不好意思翻译,因为英语水平实在太差.最近发现不少网友在问在 C++Builder 的工程里调用 Visual C++  ...

  7. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

  8. Farm Irrigation(并查集)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  9. bzoj3295

    没什么好说的,树套树应该随便搞我在128MB空间下大胆的写了主席树当然要把原树和修改树分开来建没有然后了 type node=record l,r,s:longint; end; ..] of nod ...

  10. ZOJ-2008-Invitation Cards(dijkstra)

    题意: 在有向加权图中G(V,E),邮局要从起点S向其他n个节点发送邮件,于是派出n个邮递员,分别到达其他n个地点发送,然后回到起点S,求出所有邮递员所经过的总路程的最小值. 分析: 正向一次dijk ...