最近弄Android c/c++方面的逆向,發現c++的類,stl模闆,在逆向的時候相比c語言都帶來了不小的困難。
今天自己寫了個小程式,然後逆向分析了一下
vector 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>::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>::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>::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>::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*)
調試結果:
第一次push_back
第二次push_back
第三次push_back
最後附上循環列印的代碼
for (vector::size_type i = 0; i < array_int.size(); ++i) {
cout<
}
整個循環過程就比較容易了解了.
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)通路 ...
STL vector用法介紹
STL vector用法介紹 介紹 這篇文章的目的是為了介紹std::vector,如何恰當地使用它們的成員函數等操作.本文中還讨論了條件函數和函數指針在疊代算法中使用,如在remove_if()和f ...
随機推薦
java布局學習 (三)
前文已經講了常用的4個布局了,今天再介紹最後的三個布局: 5.CardLayout 6.BoxLayout 7.空白布局null (五)CardLayout 紙牌布局 首先這種布局不是二維布局,而 ...
.Net簡單圖檔系統-本地存儲和分布式存儲
本地存儲 所謂本地存儲就是将上傳圖檔儲存到圖檔伺服器的本地磁盤上. if (ConfigHelper.GetConfigString("SaveMode") == "Lo ...
設定MySQL自動增長從某個指定的數開始
自增字段,一定要設定為primary key. 以指定從1000開始為例.1 建立表的時候就設定: CREATE TABLE `Test` ( `ID` int(11) NOT NULL AUTO_I ...
C語言頭檔案的使用與寫法
C語言中的.h檔案和我認識由來已久,其使用方法雖不十分複雜,但我卻是經過了幾個月的“不懂”時期,幾年的“一知半解”時期才逐漸認識清楚他的本來面目.揪其原因,我的驽鈍和好學而不求甚解固然是原因之一,但另 ...
機器學習實驗一SVM分類實驗
一.實驗目的和内容 (一)實驗目的 1.熟悉支援向量機SVM(Support Vector Machine)模型分類算法的使用. 2.用svm-train中提供的代碼架構(填入SVM分類器代碼)用tr ...
Ansible 系列之 Patterns
Ansible 之 Patterns 1.Ansible中的Patterns決定了我們要管理哪個主機,意思是與哪些主機進行互動. 我們将在Ad-Hoc(Ad-Hoc 是指 臨時執行的指令,要結合着子產品 ...
ARMCC和GCC編譯ARM代碼的軟浮點和硬浮點問題 【轉】
轉自:http://houh-1984.blog.163.com/blog/static/31127834201211112129167/ 本文介紹了ARM代碼編譯時的軟浮點(soft-float)和 ...
TEdit的 Clear 和 指派 &#39;&#39;
function TControl.GetText: TCaption; var Len: Integer; begin Len := GetTextLen; SetString(Result, PC ...
python+webdriver,選取Select下拉框中的值
在選擇下拉框中的值時遇到了困難,用driver.find_element_by_id("").send_keys("")進行指派不能成功擷取下拉框中的值. ...
軟體工程-東北師大站-第十二次作業(PSP)
1.本周PSP 2.本周進度條 3.本周累計進度圖 代碼累計折線圖 博文字數累計折線圖 4.本周PSP餅狀圖