原创 逆向-加減乘運算

後面打算記錄一下逆向識別的學習過程,也就是把每個C語言中的基礎關鍵點都反彙編,然後對比觀察。雖然說這裏的每一步都是很簡單,但是就算簡單也還是得看,畢竟每個程序都是由這些一個個簡單的點組合而成,當進行反彙編還原時,也就是將反彙編一點點拆分成

原创 PE結構-重定位表

首先,先來說一下爲什麼需要重定位表,先來觀察一段程序 00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB

原创 PE結構-節

首先,節的話有兩部分,一部分是節表,另外一部分就是節區了,節表是用於描述節區信息的,而節區呢,簡單點說就是數據塊。 在上一篇博客中有提及過如何定位節表,重點就是需要根據選項頭的大小來定位,這裏的話就直接上一點代碼吧,前兩篇概念較多

原创 逆向-除法優化上

上一篇說完加減乘的優化,這篇來說說除法,首先先打個鋪墊,除法的優化涉及到各種數學公式,這裏我們主要探討一下結論,具體的證明可以參考《C++反彙編與逆向分析技術揭祕》,這裏做一個總結。 首先,如果除數爲變量時,是沒有任何的優化空間的,所以老

原创 64位彙編入門

忽然間想記錄一下64位的彙編...這裏的話主要就是記錄一下和32位彙編的一些比較大的差別,主要就是寄存器和函數調用這兩方面,指令什麼的話我覺得就遇到查就可以了,有時間的話整理吧。 首先先來看寄存器,如下圖 對於上圖而言,白色背景部分表示

原创 逆向-數組

對於數組而言,我們需要理解其數組的尋址公式,而其公式又與其內存的分佈息息相關,所以當你瞭解了其內存分佈,那麼這個公式自然而然也能推出來。 首先數組有如下兩點性質 連續性-排列連續 一致性-類型一致 因爲有其連續的特點,所以其內存模型也就

原创 逆向-函數

函數的工作機制主要是依託棧結構來實現的,首先棧的一種後進先出的結構,爲什麼使用這種數據結構,因爲這和我們函數調用的流程很類似,當程序嵌套調用時,最後一個調用的函數總是最先返回。 對於函數,我們先從宏觀上大體的先去了解,後面在看一些內部細節

原创 逆向-字符串

在C語言中,字符串其實就是一個特殊的數組,一個以零結尾的字符數組而已,所以對於定位字符串中的字符的話可以參考上一篇博客-數組。這篇博客主要用於記錄字符串的一些操作函數,以便於在逆向識別的時候可以順利的還原爲函數。這裏因爲在release版

原创 逆向-除法優化下

由於除法優化實在太多了,所以這一篇繼續講,前面一篇說了除數爲正數情況(常量),那麼這篇就來說一說除數爲負數的情況。首先裏面涉及的很多基礎知識請翻上一篇查看,其實如果理解了上一篇的那些基本原理,除法爲負的情況也是很好理解的,因爲除數爲負的情

原创 逆向-循環結構

對於循環結構而言,主要就三種,do-while循環,while循環,for循環,這三種循環,在debug下其特點還是比較明顯的,在release下的話可以說基本上都被優化爲do-while循環(效率高),所以說release下的循環,根據

原创 逆向-分支結構下

上一篇說完IF結構,這一篇就接着總結分支結構中的switch,對於switch結構,編譯器共有四種方案提供選擇,我們不必去關心編譯器何時會選擇何種結構,因爲這個完全取決於編譯器作者,所以我們只需能識別出這四種方案是switch結構即可。

原创 逆向-分支結構上

前面把一些基本的運算都記錄完了,後面開始流程結構,其流程結構主要分爲分支結構和循環結構。對於流程結構的逆向識別,主要在於首先需要識別是什麼,然後識別語句體(花括號上下界位置),因爲確定好了這兩步後,其裏面的主體內容就是前面的基本運算或者又

原创 逆向-三目運算

首先,先簡單回顧一下三目運算符(條件表達式)的格式 表達式一 ? 表達式二 : 表達式三 當表達式一的結果爲真時,選擇執行表達式二,否則執行表達式三。 看完這個格式,很明顯這是一個有分支的結構,那麼編譯器會老老實實的都按分支語句進行編譯

原创 逆向-取模運算

除法終於整理結束了,這篇開始整理取模運算,對於取模運算來說,個別的情況還是需要使用除法的,所以除法運算的基礎還是得牢靠。 取模也叫取餘,表達爲 a % b。下面需要對b的情況進行區分來分析 1. 變量 2. 常量 2.1 無符號

原创 PE結構-導出表

在上一篇博客中說了導入表,所謂的導入表,其實相當於記錄程序所依賴的函數庫信息,類似於你要調用外部函數,總得記錄下這個函數在哪個庫中,名字或者序號是什麼。有了這些信息後,我們就可以LoadLibrary和GetProcAddress獲取函數