2.
反彙編演算法:
線性掃瞄(linear sweep)
遞迴下降(recursive descent)
工具:file:通過特定欄位來確定檔案型別
pe tools:
windows平台
peid:
nm:檢查中間目標檔案中的宣告函式和全域性變數名稱
ldd:
建立可執行程式時,必須解析該檔案引用的任何庫函式位址。聯結器通過兩種方法:靜態鏈結(static linking
)和動態鏈結(
dynamic linking)
ex:gcc -o example.out example.c
gcc -o example.out example.c --static
linux:
ldd程式可以指明可執行程式所需要的庫:
ldd example.out
windows:
visual studio
中的dumpbin:
dumpbin /dependents example.exe
objdump: 可以解析
elf pe
格式,依賴
libbfd
(乙個二進位制工具元件);
readelf
只可以解析
elf(不依賴於
libbfd)。
dumpbin:
windows
平台,類似
objdump。
strings: strings example.exe
引數-a
可使strings
掃瞄整個檔案
-t顯示每個字串的檔案偏移
流式反彙編器:ndisasm distorm
,可以反彙編網路輸入(檢查惡意**),
iso等等。
3.web:
openrce.org
htttp:
htttp:
cfg:配置檔案
idc:
ida的內建指令碼語言
idc所需的核心檔案
ids:符號檔案
loaders:
plugins:外掛程式
procs:處理器模組
sig:
til:型別庫資訊
呼叫約定:
c呼叫約定:
x86體系結構的許多
c編譯器使用的預設呼叫約定。
_cdecl:呼叫方按從右到左的順序將函式引數放入棧中,呼叫結束時,呼叫方(而不是被呼叫方)負責從棧中清除引數。(由於呼叫方負責清除引數,所以生成的程式相對較大)
微軟標準呼叫約定:微軟定義的標準
_stdcall:呼叫方按從右到左的順序將函式引數放入棧中,呼叫結束時,被呼叫方負責從棧中清除引數。(引數個數不確定函式除外,因為被呼叫者不知道引數個數,無法清除引數)
x86fastcall呼叫約定:是
stdcall
的乙個變體,向
cpu暫存器最多傳遞連個引數,傳遞給函式的前兩個引數分別放在
ecx,
edx暫存器中,剩餘的引數用
stdcall
約定從右到左放入棧中。在呼叫返回時,被呼叫函式負責清空棧。
c++呼叫約定:
_thiscall
microsoftvisualc++提供
thiscall
呼叫約定,將
this
傳遞到ecx
暫存器中。
gnu g++編譯器將
this
看做非靜態成員函式的第乙個隱含引數,其他與
cdecl
約定相同。使用
g++編譯的**,在呼叫非靜態成員函式之前,
this
被放置在棧頂,呼叫方負責在函式返回時清除堆疊(至少乙個引數,
this)。
系統呼叫:特殊的函式呼叫,從使用者模式進入核心模式。
linux x86系統:使用
int 0x80
啟動系統呼叫,引數一般位於暫存器中,也可以在棧中。
大多數x86
系統:sysenter
指令,系統呼叫引數位於堆疊上,
eax中存放系統呼叫編號。
區域性變數布局:不存在函式區域性變數布局約定。
1.計算區域性變數所需空間
2.確定暫存器是否可滿足需求,或者必須在棧上分配
_cdecl
(1)儲存
ebp,
ebp用於儲存函式執行之前的
esp值,函式執行結束,用
ebp恢復
esp。 (2
)儲存esp
到ebp中。
上述兩步彙編**:
push ebp
mov ebp,
esp
(3)在堆疊中劃分區域儲存區域性變數。通常方法是
esp減去乙個數值。 (4
)儲存ebx
,esi
,edi
到堆疊中,函式呼叫完後恢復。
對應**如下:
sub esp 0cch
push ebx
push esi
push edi
(5)把區域性變數區域初始化為
0cccccch.
。因為0cch
是int 3
指令的機器碼,是乙個斷點中斷指令。
**:lea edi, [ebp-0cch]
mov ecx, 33h
mov eax, 0 cccc cccc h
rep stos dword ptr [edi]
(6)執行函式,引數獲取
ebp+12
為第二個引數,
ebp+8
為第乙個引數,
ebp+4
為返回位址。 (7
)恢復ebx
,esi
,edi
,esp
,ebp
。最後返回。
**:pop edi
pop esi
pop ebx
mov esp,
ebp
pop ebp
ret程式分為除錯版(debug
)和發行版(
release)
check版
free版
for結構彙編結構:
mov 《迴圈變數
>, <
初始值》
;迴圈變數賦初值
jmp b;跳到第一次迴圈處
a:(改變迴圈變數) ;修改迴圈變數
b:cmp <
迴圈變數
>
,<
限制變數
>
;檢查迴圈條件
jge 跳出迴圈
(迴圈體)
jmp a ;跳回去修改迴圈變數
do迴圈:
(迴圈體)
cmp 《迴圈變數
>, <
限制變數
>
jl 《迴圈開始點
>
while迴圈: a:
cmp <
迴圈變數
>, <
限制變數
>
jge b (不符合迴圈條件)
(迴圈體)
jmp ab:(
迴圈結束)
if-else結構:
IDA Pro權威指南 視窗
列舉名稱。f 常規函式,ida認為不屬於庫函式 l 庫函式 i 匯入的共享庫的函式的名稱 g 命名 d 資料 a 字串資料 顯示程式中的字串。可以自行設定顯示什麼。列出檔案入口點。列出二進位制檔案匯入的所有函式。顯示ida認為的檔案所使用的結構體。顯示段的相關屬性。段視窗與objdump h rea...
IDA Pro權威指南 IDA入門
選擇載入器,一般預設就可。載入檔案時,有4個資料可檔案。id0二叉樹形式資料庫。id1檔案包含描述每個程式位元組的標記。nam 與name視窗有關的索引。til 儲存與乙個給定資料庫的本地型別定義有關的資訊。關閉檔案時,don t pack 不建立idb pack database store 建立...
IDA Pro權威指南 讀後整理引文
在資訊保安專業裡面,逆向分析是必不可少的乙個分支,而提到逆向分析,就不得不提到乙個著名的工具ida pro了,該工具是逆向分析工具裡面的集大成者,除了提供良好的預設分析手段之外,還擁有著良好的可拓展性,並且面對傳統的直接編譯為本地平台機械碼的語言有著較好反彙編的效果。當然面對一些執行在虛擬機器之上的...