關於Release版除法反彙編的小結

2021-08-15 19:10:52 字數 1899 閱讀 7019

諸如a/b(a是變數,b是常量)這種帶常量的除法,可以被(數學上的)等價變換為[a/(2^n)]*[(2^n)/b]的形式。由於b和n是常量,因此在編譯期間,編譯器會將(2^n)/b轉換成新的常量b',上式變為(a*b')/(2^n)。將原本除法表示式轉換為乘法和移位運算子(ps:除以2^n可以被編譯成右移n位)。編譯器為什麼要做這樣的轉化?據說,執行轉化後的表示式需要3個機器週期,而執行idiv指令需要8個機器週期。

上述轉換,對於**的執行確實大有裨益,但這使得反彙編時除數籠罩在陰翳中了。我們的目標是在反彙編過程中識別

乘數b'和移位數n,然後反推除數b。

在反彙編過程中除法運算中,常常會遇到諸如:0x92492493h這類數值巨大的常量,作者稱之為magicnumber。我們需要對魔數分類討論:

1.魔數值位於區間 [0x00000000,0x80000000):

1.1).識別魔數字於這個區間的除數不需要對魔數做額外的處理,所以先予討論。最簡單的情形就是執行(i)mul後,用sar指令使edx右移n位。edx是乘法運算結果的高32bit,因此實際右移(32+n)位。

mov ecx,[esp+arg0]

mov eax,38e38e39h

imul ecx

sar edx,1

mov eax,edx

shr eax,1fh

add edx,eax

push edx

上面這段**組成的表示式為:38e38e39*ecx/2^33,與公式(

a*b'

)/(2^n

)對比,可得b'=magicnumber=38e38e39,n=33,根據公式b=(2^n)/b',可得b=9.

1.2).最簡單的情形往往只是乙個特例。多數情形下,執行(i)mul後,edx會與被除數參與到零星的幾步四則運算。於此,需要將表示式按乘法的結合律進行合併:

mov ecx,[esp+arg0]

mov eax,24924925h

mul ecx

sub ecx,edx

shr ecx,1

add ecx,edx

shr ecx,2

push ecx

...

上面這段**組成的表示式為:/2^2,其中magicnumber=24924925h,ecx為被除數。合併表示式後為ecx*(2^32+magicnumber)/(2^35)。與公式

(a*b'

)/(2^n

)對比,可得b'=2^32+magicnumber,n=35。根據公式b=(2^n)/b',可得b=(2^35)/(2^32+24924925h)=7

2 .魔數值位於區間 [0x80000000,0xffffffff]:

2.1).如果位於這個區間的魔數參與到有符號乘法中,因為有符號數的最高位是符號位,所以對應的有符號乘法指令不會讓最高位參與數值計算。對於這種實際參與乘法計算的數是負數的情況,需要做特殊處理,magicnumber在計算前要變為magicnumber=magicnumber-2^32,如下例:

mov eax,92492493h

imul esi

add edx,esi

sar edx,2

mov eax,edx

shr eax,1fh

add edx,eax

push edx

...

上面這段**組成的表示式為:[(magicnumber*esi)/2^23+esi]*1/4,其中magicnumber=92492493h-2^32。合併表示式後為(0x92492493)*esi/2^34。與公式

(a*b'

)/(2^n

)對比,可得b'

=0x92492493h,n=34.根據公式b=(2^n)/b',可得b=7.

乘法除法反彙編

彙編乘法指令一般為mul,imul,如果在彙編中使用這些指令來進行乘法運算,會比較慢,一般要進行轉換。int fun 反彙編 push ecx 為區域性變數a分乙個空間 mov eax,dword ptr esp esp棧頂指標指向的就是剛剛壓入的ecx lea ecx,dword ptr eax ...

反彙編版 記憶體版棧結構

正常下 ebp 為上一層函式棧底 ebp 4 進入call下一條執行指令位址,也可以叫做返回位址 ebp 8 從左往右看的話算是第乙個引數 如果這個函式是有引數的話 ebp 0c 第二引數 如果這個函式是有引數的話 ebp 10 第三個引數 如果這個函式是有引數的話 ebp 一般為區域性變數 執行函...

C反彙編例項(詳細註解版)(一)

呵,好久沒寫 csdn 文章了,來湊個熱鬧。最近我閱讀了楚狂人 wowocock 寫的 天書夜讀 試讀本,對 c反彙編感觸頗深,書中有一例演算法反彙編,其對彙編的閱讀確實富有挑戰,而該書中也未詳解,在此,我謹將此例詳細分析如下,幫助大家更好理解 c反彙編 若有任何錯誤,請大家批評指正!該例的要求是求...