170507 彙編 直接定址表,反編譯 演算法分析

2021-07-31 17:37:03 字數 1634 閱讀 2554

1625-5 王子昂 總結《2023年5月7日》 【連續第218天總結】

a.組合語言第十六章100%

加密與解密演算法分析100%

b.直接定址表:

標誌是table,作用是建立一種key和value的對應關係。更接近於字典

eg:table  db '0123456789abcdef'

mov bx,3

mov ah,table[bx]。

則ah中就送入了table中的第4位的值,'3'的ascii碼值

還可以eg:

table dw ag0,ag30,ag60,ag90,ag120,ag150,ag180;把table作為字串偏移位址表

ag0 db '0',0;以0標誌字串結束

ag30 db '0.5',0

...mov bx,1

add bx,bx;因為位址表的單位是字,所以每個是2位元組

mov bx,table[bx]

...mov ah,cs:[bx];bx此時為對應內容的偏移位址,通過這種方法取出對應的內容

還可以直接在直接定址表中存放子程式的位址,這樣可以更加方便地呼叫

od中,直接修改記憶體進而遮蔽程式的某些功能或改變程式流程的方法稱為patch(補丁)或爆破

在c++規範中引數按照從右往左的順序入棧,因此在彙編**中則是依次將對應的暫存器push入棧(為了保護現場)後,在子程式中呼叫相應的暫存器放置引數

跟著書本進行了一遍c++**與彙編**的比較,理解起來略有困難,但是一點一點看完還是挺有收穫的

xor指令:異或,兩引數按位比較,不同得1,相同得0

本程式中用於置零:xor esi,esi;將esi置0

jle指令:jump low equal,cmp比較結果為小於等於時跳轉至標號,否則不動

本程式中用於判斷,包括for的結束條件和if中使用<=時

在進入迴圈之前,將迴圈中會用到的暫存器push入棧(若迴圈中也用到了棧,則必須在迴圈內完全清空使用部分,避免影響外部)來保護環境,留出相應的暫存器給迴圈內使用

c++的for迴圈轉換為彙編指令時,賦初值完成後會先進行結束條件判斷,如果符合則直接跳至結尾,不符合則將暫存器push,然後開始迴圈

eg:;for(i=3,j=0;i

mov edi,[esp+18];函式的引數len的值從棧中取出放入di暫存器

mov ecx,3;給i=0

xor esi,esi;code=0

xor eax,eax;j=0

cmp edi,ecx;len<=i的比較

jle end;若len<=i,即i>len,即不滿足i

push ebx;滿足迴圈條件,暫存器入棧保護環境,開始迴圈

...;迴圈體

pop ebx;還原環境。注:若初次判斷就不符合迴圈條件,則直接跳過迴圈,不對暫存器入棧,因此也不需要出棧還原環境。

end:...;迴圈結束

c++中的陣列呼叫時,如name[i],table[j],在彙編**中顯示為

mov dl,[ecx+ebp];ebp中存放的是name的首位址

mov bl,[eax+405030];405030是資料表的首位址

;ecx和eax分別對應i和j,實際上為偏移位址

c.明日計畫

pyqt

彙編加密與解密

組合語言 直接定址表

assume cs code code segment a dw 1,2 3,4 5,6 7,8 a代表了code段的首位址code 00,由於dw,也代表了a開始的這一小段記憶體都是按照字單元儲存的。從code 0 code 15 也就是,a 0 a 15 a si 代表了從code 00開始的偏...

組合語言 直接定址表

assume cs code code segment 從code 0 code 15 也就是,a 0 a 15 a si 代表了從code 00開始的偏移量為si的記憶體單元。此記憶體單元是字單元,故si的偏移量是2個位元組。剩下的空間都是真正的cpu執行的 了。start mov si,0 mo...

組合語言 直接定址表

功能 將a位址中的1 8的數值相加,並儲存到b位址中。assume cs code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start mov si,offset a mov di,offset b mov ah,0 mov cx,8 s mov al,cs...