windows逆向3

VC 程序內(nèi)存和編譯的一些特征
C++ 構(gòu)造函數(shù)
C++ 成員函數(shù)
C++ 析構(gòu)函數(shù)
C++ 全局對(duì)象的構(gòu)造
C++ 全局對(duì)象的析構(gòu)
C++ 全局對(duì)象的成員函數(shù)
VS2015 main 特征
C++ 虛函數(shù)
C++ 虛函數(shù)的調(diào)用
C++數(shù)據(jù)結(jié)構(gòu)

  1. 程序的特征一般有哪些?PEID 識(shí)別程序是什么語(yǔ)言的原理是什么?
    ① OEP 特征
    ② 區(qū)段名稱(chēng)
    ③ 鏈接器版本
    ④ 文件頭 magic
    PEID 識(shí)別的是 OEP 特征
    55 8B EC 6A FF 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC
    58
    64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58
  2. IDA 的快捷鍵有哪些?
    G 打開(kāi)跳轉(zhuǎn)窗口
    ESC 返回到上一步
    N 重命名
    R 將數(shù)值轉(zhuǎn)為 ASCI 碼字符
    回車(chē) 進(jìn)入選中地址所在處
    D 定義和轉(zhuǎn)換數(shù)據(jù)類(lèi)型
    Ctrl+X 交叉引用
    ; 重復(fù)注釋
    F2 設(shè)置斷點(diǎn)
    F5 將反匯編轉(zhuǎn)為 C 代碼

空格 切換圖形視圖和代碼視圖
H 轉(zhuǎn)換為 16 進(jìn)制
C 轉(zhuǎn)換為代碼
A 轉(zhuǎn)換為 asci 碼字符串
S
B 轉(zhuǎn)換為二進(jìn)制
F7 單步步入
F8 單步步過(guò)
F4 運(yùn)行到光標(biāo)處
Q 轉(zhuǎn)換為 16 進(jìn)制
Ctrl+回車(chē) 下一步(與 ESC 相反)
Alt+Q 轉(zhuǎn)換結(jié)構(gòu)體(堆棧窗口)
M 轉(zhuǎn)換枚舉類(lèi)型常量
Ins 創(chuàng)建結(jié)構(gòu)體(結(jié)構(gòu)體)
Alt+T 搜索文本
Shift+F9 打開(kāi)結(jié)構(gòu)體窗口
Shift+F12 打開(kāi)字符串窗口
Shift+F3 打開(kāi)函數(shù)窗口
CtrL+F7 運(yùn)行到函數(shù)返回
Ctrl+K 打開(kāi)局部堆棧窗口
Alt+K 打開(kāi)設(shè)置堆棧窗口
Alt+F4 關(guān)閉文件
Ctrl+G 打開(kāi)跳轉(zhuǎn)指定區(qū)段窗口
Ctrl+E 打開(kāi)選擇入口點(diǎn)窗口
P 創(chuàng)建函數(shù)
V 改寄存器名稱(chēng)
Shift+; 注釋
TAB 將反匯編轉(zhuǎn)為 C 代碼(與 F5 一樣)
F1 打開(kāi)幫助文檔
? 打開(kāi)計(jì)算器
Ctrl+M 打開(kāi)標(biāo)簽
Ctrl+W 保存
Alt+P 編輯函數(shù)
Ctrl+S 跳轉(zhuǎn)到指定的段
Shift+F5 打開(kāi)簽名窗口
K 修改堆棧變量
Y 設(shè)置參數(shù)類(lèi)型
E 設(shè)置函數(shù)結(jié)束
Ctrl+Ins 復(fù)制
Alt+X 退出
Alt+F10 創(chuàng)建匯編文件
U 將數(shù)據(jù)或代碼轉(zhuǎn)換為未定義
T 轉(zhuǎn)換結(jié)構(gòu)體偏移

VC 程序內(nèi)存和編譯的一些特征

  1. 內(nèi)存值特點(diǎn)
    FDFDFDFD 堆標(biāo)記
    CCCCCCCC 未初始化狀態(tài)
    CDCDCDCD 堆申請(qǐng)空間未初始化狀態(tài) new -> malloc -> HeapAlloc -》RtlAllocHeap
    40300000 浮點(diǎn)數(shù)(IEEE 浮點(diǎn)表示法)
    3D9B5DC1 Hash 值(算法不可逆,一般采用方式爆破)
    00380000 VirtualAlloc 申請(qǐng)的內(nèi)存地址(頁(yè)對(duì)齊)
    FEEEFEEE 堆釋放之后的填充信息
    0012FF8C 堆棧地址(5,6 位)

字符串:hello
ASCII 碼:68 65 6c 6c 6f
HASH 值:定長(zhǎng),是原數(shù)據(jù)的摘要信息, 不可逆
HASH 算法:68+65+6c+6c+6f = xxxx
典型 Hash 算法:MD5,SHA-1, SHA-256, CRC32。。。。

  1. C++編譯的一些特點(diǎn)
    ① 局部變量
  • 當(dāng)函數(shù)開(kāi)頭有
    Push ebp
    Mov ebp,esp

局部變量是 ebp – xxxx
當(dāng)函數(shù)開(kāi)頭沒(méi)有 push ebp 之類(lèi)的代碼,只有 SUB ESP,yyy
局部變量是 ESP+xxx ,需要根據(jù)前后堆棧的變化來(lái)確定
一般來(lái)說(shuō) xxx < yyy

② 參數(shù)

  • 當(dāng)函數(shù)開(kāi)頭有
    Push ebp
    Mov ebp,esp
    Sub ebp, xxx
    參數(shù)是 ebp + 8 為第一個(gè)參數(shù),然后遞增

  • 當(dāng)函數(shù)開(kāi)頭沒(méi)有 push ebp 之類(lèi)的代碼, 只有 SUB ESP,yyy
    參數(shù)是 ESP+yyy+4 ,需要根據(jù)前后堆棧的變化來(lái)確定
    ③ 調(diào)用約定
    成員函數(shù)、構(gòu)造函數(shù)、析構(gòu)函數(shù)都有 this 指針,所以是 thiscall = this 指針+stdcall
    靜態(tài)成員函數(shù)、友元函數(shù)沒(méi)有 this 指針是 stdcall

④ 常用寄存器規(guī)則
Ecx 常用于表示 this 指針
Eax 常用于表示返回值

C++ 構(gòu)造函數(shù)
特點(diǎn) 1: ECX 傳參
特點(diǎn) 2: CALL 內(nèi)部 有對(duì) ECX 指向緩沖區(qū)進(jìn)行賦值或者初始化
特點(diǎn) 3: 返回值 EAX 是 this 指針

C++ 成員函數(shù)
特點(diǎn) 1: ECX 傳參
特點(diǎn) 2: CALL 內(nèi)部 有對(duì) ECX 指向緩沖區(qū)進(jìn)行訪問(wèn)或是賦值

C++ 析構(gòu)函數(shù)
特點(diǎn) 1: ECX 傳參
特點(diǎn) 2: CALL 內(nèi)部 有對(duì) ECX 指向緩沖區(qū)進(jìn)行訪問(wèn)或是釋放
特點(diǎn) 3: 局部對(duì)象一般調(diào)用是在函數(shù)退出前

C++ 全局對(duì)象的構(gòu)造
在 C 運(yùn)行庫(kù)中的_initterm 函數(shù)中進(jìn)行的調(diào)用

image.png

image.png

源碼:initterm.cpp 中的_initterm 函數(shù)

extern "C" void __cdecl _initterm(_PVFV* const first, _PVFV* const last)
{
for (_PVFV* it = first; it != last; ++it)
{
if (it == nullptr)
continue;
(
it)(); // 循環(huán)調(diào)用全局對(duì)象的構(gòu)造函數(shù)。
}
}
反匯編信息:
(
*it)();
0133A215 8B 4D F8 mov ecx,dword ptr [ebp-8]
0133A218 8B 11 mov edx,dword ptr [ecx]
0133A21A 89 55 F4 mov dword ptr [ebp-0Ch],edx
0133A21D 8B 4D F4 mov ecx,dword ptr [ebp-0Ch]
0133A220 FF 15 00 80 3A 01 call dword ptr [__guard_check_icall_fptr
(013A8000h)]
0133A226 FF 55 F4 call dword ptr [ebp-0Ch]

C++ 全局對(duì)象的析構(gòu)
在 main 函數(shù)調(diào)用之后,調(diào)用的 exit 函數(shù)內(nèi)部


image.png

源碼:onexit.cpp 中_execute_onexit_table 函數(shù)中

_PVFV const function = __crt_fast_decode_pointer(last);
last = encoded_nullptr;
function(); // 調(diào)用全局對(duì)象的析構(gòu)
_PVFV
const new_first = __crt_fast_decode_pointer(table->_first);
_PVFV
const new_last = __crt_fast_decode_pointer(table->_last);
反匯編:
function();
0133758C 8B 45 CC mov eax,dword ptr [ebp-34h]
0133758F 89 45 DC mov dword ptr [ebp-24h],eax
01337592 8B 4D DC mov ecx,dword ptr [ebp-24h]
01337595 FF 15 00 80 3A 01 call dword ptr [__guard_check_icall_fptr
(013A8000h)]
0133759B FF 55 DC call dword ptr [ebp-24h]

C++ 全局對(duì)象的成員函數(shù)
反匯編中,調(diào)用全局對(duì)象的成員函數(shù)時(shí),全局對(duì)象的地址會(huì)直接賦給 ECX


image.png

VS2015 main 特征


image.png

50 E8 ???????? 8B 00 50 E8 ???????? 8B 08 51 E8

C++ 虛函數(shù)
特點(diǎn) 1:當(dāng)一個(gè)類(lèi),有一個(gè)以上的虛函數(shù)定義時(shí),創(chuàng)建類(lèi)對(duì)象,對(duì)象基地址就會(huì)產(chǎn)生虛函數(shù)
表指針。
特點(diǎn) 2:有虛函數(shù)的類(lèi)對(duì)象,構(gòu)造函數(shù)中有對(duì)虛函數(shù)表指針進(jìn)行初始化

image.png

虛函數(shù)表(vTable)存儲(chǔ)在 rdata 段。這說(shuō)明虛函數(shù)表是在編譯時(shí)就已經(jīng)生成了。
VC 編譯器為每一個(gè)有虛函數(shù)的類(lèi),都會(huì)生成相應(yīng)的虛函數(shù)表
當(dāng)兩個(gè)類(lèi)有繼承關(guān)系時(shí),子類(lèi)的構(gòu)造函數(shù)代碼會(huì)嵌入父類(lèi)的構(gòu)造函數(shù)調(diào)用代碼

image.png

C++ 虛函數(shù)的調(diào)用
通過(guò) . 和 通過(guò) -> 調(diào)用虛函數(shù)是不一樣的
通過(guò) . 調(diào)用虛函數(shù) 與正常函數(shù)一樣,沒(méi)區(qū)別
通過(guò) -> 調(diào)用虛函數(shù),會(huì)訪問(wèn)虛函數(shù)表,一般是寄存器調(diào)用

CObjA obj1;
00ACA92D 8D 4D E0 lea ecx,[obj1]
00ACA930 E8 91 E8 FE FF call CObjA::CObjA (0AB91C6h)
00ACA935 C7 45 FC 00 00 00 00 mov dword ptr [ebp-4],0
obj1.Print();
00ACA93C 8D 4D E0 lea ecx,[obj1]
00ACA93F E8 3A 08 FF FF call CObjA::Print (0ABB17Eh)
CObjA* p1 = &obj1;
00ACA944 8D 45 E0 lea eax,[obj1]
00ACA947 89 45 D4 mov dword ptr [p1],eax
p1->Print();
00ACA94A 8B 45 D4 mov eax,dword ptr [p1]
00ACA94D 8B 10 mov edx,dword ptr [eax]
00ACA94F 8B F4 mov esi,esp
00ACA951 8B 4D D4 mov ecx,dword ptr [p1]
00ACA954 8B 02 mov eax,dword ptr [edx]
00ACA956 FF D0 call eax

image.png

C++數(shù)據(jù)結(jié)構(gòu)
vector, list, map

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容