1. 程式人生 > 實用技巧 >php-可變,匿名函式,偽型別

php-可變,匿名函式,偽型別

0x01 通用暫存器

暫存器是在記憶體中的
32位通用暫存器
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
EIP是儲存下次cpu下次要執行的指令,不能用作他用,所以不能是通用暫存器

0x02 MOV指令

1.立即數到暫存器
2.暫存器到暫存器

彙編其實本質就是暫存器和暫存器或者暫存器和記憶體之間資料的來回流動

執行一下F8

可以看到1這個立即數存放在這兩個暫存器去了,也可以把暫存器的值存放在暫存器裡面
MOV EDX,EAX

32位的:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
16位的:AX,CX,DX,BX,SP,BP,SI,DI
8位的:AL,CL,DL,BL,AH,CH,DH,BH

只有EAX,ECX,EDX,EBX有8位的,ESP,EBP,ESI,EDI沒有八位的
比如EAX等於FFFF0201,02就是AH,01就是AL

比如我們先把EAX設定為-1(FFFFFFFF)
我們在執行一下
MOV AX,1
現在EAX為FFFF0001,所以說其實一個暫存器我們你可以按照不同的段使用它,其實我們想用16位的暫存器其實就是把原來的一半給他了
現在我們想用8位的暫存器,把EAX設定為-1
MOV AL,2執行一下,EAX為FFFFFF02,可以看到只變了8位一個位元組

0x03 記憶體

如果我們y要儲存的資料很多就單靠cpu中的暫存器是不夠的,每個應用程式都會有自己的獨立的4G記憶體空間

假如我們記憶體只有2G但是兩個程序加起來就8G了這明顯不科學,其實這裡可以理解為空頭支票,也就是說把這4G給你了,你可以在這裡面隨便用,但是隨便用意為著當你某個時刻真的要用作業系統就會把你擁的記憶體給對映到真正的記憶體裡面,實體記憶體也不是我們的所謂記憶體條,他們之間也存在這一個對映

0x04 記憶體地址

記憶體太大沒法起名字,所以只能用編號。當我們想向記憶體中儲存資料,或者從記憶體中讀取資料時,必須用到編號,就想寫信必須要知道地址一樣
這個編號又稱為記憶體地址(32位,前面0可以省略),這個編號也叫記憶體地址
我們在寫入記憶體必須告訴它我們的寬度,比如mov 記憶體,1 我們必須告訴把這個1寫多大進去,比如我們寫如一位元組

mov byte ptr ds:[0049B000],1

這裡的記憶體地址我們不能亂寫,因為必須要這個程式申請過了的才能使用,這裡有個小技巧,我們可以看這一塊的就是申請過的

如果我們寫兩位元組就word,四位元組就dword

這裡我們是立即數寫到記憶體,現在來暫存器寫到記憶體

可以看到暫存器EAX為0019FFCC

mov dword ptr ds:[0019FF74],eax

可以看到記憶體地址為0019FF74也變成了EAX的值,我們可以把立即數寫入記憶體中,也可以把暫存器寫入記憶體中,前提就是資料長度必須一樣,如果前面是dword後面寫1也是一樣的,實際上1前面預設補了7個0,但是如果前面是DWORD後面是AX就不行了,但是編譯器會自動調整為WORD
記憶體一樣可以移動到暫存器

mov dword ptr ds:[0019FF74],eax

但是不能直接記憶體到記憶體

0x05 記憶體地址的5種表示形式

1.形式一:【立即數】
讀取記憶體的值:
mov eax,dword ptr ds:[0x13ffc4]
向記憶體中寫入值:
mov dowrd ptr ds:[0x13ffc4],eax
2.形式二:【reg】reg代表暫存器,可以是8個通用暫存器中的任意一個
讀取記憶體的值
mov ecx,0x13FFD0
mov eax,dword ptr ds:[ecx]
向記憶體中寫入資料
mov edx,0x13FFD0
mov dword ptr ds:[edx],0x87654321
比如我們可以把EAX寫為0019FF74,然後再命令寫為MOV DWORD PTR DS:[EAX],12345678
執行結果如圖

3.形式三:【reg+立即數】
讀取記憶體的值:
mov ecx,0x13FFD0
mov eax,dword ptr ds:[ecx+4]
向記憶體中寫入資料:
mov edx,0x13FFD8
mov dword ptr ds:[edx+0xC],0x87654321

4.形式四【reg+reg{1,2,4,8}】
讀取記憶體的值:
mov eax,13FFC4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx
4]
向記憶體中寫入資料:
mov eax,13FFC4
mov ecx,2
mov dword ptr ds:[eax+ecx*4],87654321

5.形式五【reg+reg{1,2,4,8}+立即數】
讀取記憶體的值:
mov eax,13FFC4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx
4+4]
向記憶體中寫入資料:
mov eax,13FFC4
mov ecx,2
mov dword ptr ds:[eax+ecx*4+4],87654321

0x06 資料的儲存模式

move byte ptr ds:[0x00000000],0x1A
move word ptr ds:[0x00000000],0x1A2C
move dword ptr ds:[0x00000000],0x1A2C3D4E

我們知道0x1A就是1A,但是0X1A2C是1A在上面還是2C在上面,所以這裡就分為兩類:
大端模式:資料高位在低位,資料低位在高位
小端模式:資料低位在低位,資料高位在高位
這裡的0x1A2C就是1A在高位,2C在低位,所以按照大端模式的話就是1A在上面2C在下面,按照小端模式的話最後一個從上到下的就是:
4E->3D->2C-1A

0x07 dtdebug一些操作

檢視記憶體,比如說我想看19DBC4,假如我想看一個位元組就

db 19DBC4

如果我們想兩個位元組的來檢視的話就

dw 19DBC4

如果想4個位元組的來看

dd 19DBC4

但是我們自己存入記憶體是什麼模式呢,這裡來看一下

我們這裡可以看到0019DBAC這裡已經存放了11223344了但是我們不知道到底AC存放的是11還是44所以這裡我們可以用db一個位元組來看

這裡就可以看到AC是44,AD是33,AE是22,AF是11,AF是記憶體地址最高位,然後11也是最高位,所以我們這裡是小端模式的儲存方式