首页 > 代码库 > c++逆向 vector
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反汇编如下:(已添加注释)
.text:00001164 int_tmp = -0x18.text:00001164 vector_ptr = -0x14.text:00001164 var_8 = -8.text:00001164.text:00001164 PUSH {R4-R7,LR}.text:00001166 LDR R5, =(__stack_chk_guard_ptr - 0x1170).text:00001168 SUB SP, SP, #0x1C.text:0000116A MOVS R4, #0.text:0000116C ADD R5, PC ; __stack_chk_guard_ptr.text:0000116E LDR R5, [R5] ; __stack_chk_guard.text:00001170 ADD R6, SP, #0x1C+vector_ptr.text:00001172 ADD R7, SP, #4 ; [SP,#0x1C+int_tmp].text:00001174 LDR R3, [R5].text:00001176 MOVS R0, R6.text:00001178 STR R3, [SP,#0x1C+var_8].text:0000117A MOVS R3, #1.text:0000117C MOVS R1, R7.text:0000117E STR R3, [SP,#0x1C+int_tmp].text:00001180 STR R4, [SP,#0x1C+vector_ptr].text:00001182 STR R4, [R6,#4].text:00001184 STR R4, [R6,#8].text:00001186 BL _ZNSt6vectorIiSaIiEE9push_backERKi ; std::vector<int,std::allocator<int>>::push_back(int const&).text:0000118A MOVS R3, #2.text:0000118C MOVS R0, R6.text:0000118E MOVS R1, R7.text:00001190 STR R3, [SP,#0x1C+int_tmp].text:00001192 BL _ZNSt6vectorIiSaIiEE9push_backERKi ; std::vector<int,std::allocator<int>>::push_back(int const&).text:00001196 MOVS R3, #5.text:00001198 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&)
分析如下:
.text:00001170 ADD R6, SP, #0x1C+vector_ptr
将栈的vector_ptr处的地址复制给R6
.text:00001172 ADD R7, SP, #4 ; [SP,#0x1C+int_tmp]
将sp+4的地址赋值给R7 ,这个地址相当于栈的int_tmp处
.text:00001176 MOVS R0, R6
将vector_ptr的地址赋值给R0,作为push_back的第一个参数
.text:0000116A MOVS R4, #0(顺序已调整,看地址号).text:0000117A MOVS R3, #1.text:0000117C MOVS R1, R7.text:0000117E STR R3, [SP,#0x1C+int_tmp].text:00001180 STR R4, [SP,#0x1C+vector_ptr]
将要push_back的int值1储存到栈的int_tmp处。将R7赋值给R1,作为push_back的第二个参数,第一个参数为vector对象指针,也就是this指针。
将vector_ptr处赋值为0。
.text:00001182 STR R4, [R6,#4].text:00001184 STR R4, [R6,#8]
将vector_ptr处的后两个栈中的项赋值为0,其中[R6,#4]处保存的是vector中的最后一项元素的下一项的指针,相当于end()。
而[R6,#8]处的值也会随着一次次push_back发生改变,暂时没有发现其作用
.text:00001186 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
c++逆向 vector
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。