标签:
最近弄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
标签:
原文地址:http://www.cnblogs.com/mmmmar/p/5838051.html