国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【轉(zhuǎn)】CE自動(dòng)匯編的一些常用命令收集及講解

2022-11-24 21:34 作者:繽紛顏色  | 我要投稿

I. 介紹
------------------------------
'喲,我猜你在讀這個(gè)是因?yàn)橄旅鎯杉轮械囊粋€(gè)。
1) 你正在試圖學(xué)習(xí)自動(dòng)匯編 (我不會(huì)叫你菜鳥(niǎo),因?yàn)槊總€(gè)人都是從哪里開(kāi)始的,對(duì)吧 =) )
or
2) 你想測(cè)試你的自動(dòng)匯編知識(shí) (作為擴(kuò)展)。
那么,如果你是前者,那就慢慢的體會(huì)好每個(gè)部分,并且在繼續(xù)進(jìn)行前確認(rèn)自己已經(jīng)明白了這章。
Dark Byte wrote:
大多數(shù)人都認(rèn)為AA很難,其實(shí)它可容易了。
來(lái)自CE作者自己的話
如果是后者,那我不會(huì)給你提任何的建議,即使我想幫忙。如果你發(fā)現(xiàn)有什么錯(cuò)了,或者含糊或者認(rèn)為我可以做的更好,請(qǐng)告訴我。我一直處于自我學(xué)習(xí)的狀態(tài)! 等等!別問(wèn),我知道你在想什么。
You wrote:
為什么我非要聽(tīng)一個(gè)還在學(xué)習(xí)的人的話?
好,我來(lái)告訴你,我的朋友。即使我仍然在學(xué)習(xí),我了解AA,并且我認(rèn)為與你分享知識(shí)是一件很棒的事。 =)
Edit: 這個(gè)是很久以前寫(xiě)的,但是現(xiàn)在我學(xué)到了很多,并且已經(jīng)重新檢查了。
現(xiàn)在,讓我們投身入奇幻的電腦世界。

------------------------------
II. 寄存器
------------------------------
這些也許你已經(jīng)在一些腳本中看到過(guò),它們被非常廣泛的使用。有兩種寄存器被使用,接下來(lái)來(lái)進(jìn)行講解。
---------------
II.a 32 Bit
---------------
首先,我將解釋每個(gè)寄存器是如何得到它們的名字的,這會(huì)幫助你記住它們哪個(gè)是哪個(gè)。首先,以E開(kāi)頭 (如果你注意了下面,你會(huì)發(fā)現(xiàn)所有的寄存器都是以E開(kāi)頭的) 它告訴你這個(gè)寄存器是32位寄存器。而A,B,C,D的含義你看完描述就能明顯得體會(huì)到了。像SI, DI, BP,SP,IP也是一樣。在 EAX, EBX, ECX, EDX后面的X,他簡(jiǎn)單的表示已經(jīng)沒(méi)有更多的字母了。有點(diǎn)像一個(gè) NOP 命令 (之后你將讀到)。如果你注意了,你會(huì)發(fā)現(xiàn)每個(gè)32位寄存器都是3個(gè)字母。
EAX: 累加器(Acculmulator register)。能夠用來(lái)當(dāng)存儲(chǔ)器
EBX: 從前, 它是個(gè)基礎(chǔ)寄存器,但現(xiàn)在只是個(gè)閑著的存儲(chǔ)器
ECX: 計(jì)數(shù)器(Counting register)。也能用來(lái)當(dāng)存儲(chǔ)器
EDX: 數(shù)據(jù)寄存器(Data register)。 跟之前三個(gè)一樣,能用來(lái)當(dāng)存儲(chǔ)器。
ESI: 源址變址寄存器(SourceIndex register)。 是字符串形式的指針變量,但你現(xiàn)在還不用擔(dān)心那部分。 能夠用來(lái)當(dāng)存儲(chǔ)器。
EDI: 目的變址寄存器(DestinyIndex register)。又一次,能夠當(dāng)作存儲(chǔ)器,并且是個(gè)字符串形式的指針變量, 但別擔(dān)心。
EBP: 機(jī)制指針寄存器(Base Pointer register)。 是用來(lái)臨時(shí)存儲(chǔ)ESP, 當(dāng)然也可以像常規(guī)的存儲(chǔ)器那樣使用。
ESP: 原址指針寄存器(Source Pointer register)。它在堆棧里指向寄存器和地址(這個(gè)內(nèi)容待會(huì)再說(shuō))。
EIP: 指令指針寄存器(Instruction Pointer register)。 錯(cuò)誤的使用會(huì)使你正在試圖修改的程序崩潰。
---------------
II.b 16 Bit
---------------
16位寄存器和32位寄存器很相似,他們間有兩個(gè)區(qū)別。一是,32位寄存器名字是三個(gè)字母,而16位寄存器是兩個(gè)字母。

---------------

III.a JMP

---------------
JMP 命令是最常使用的命令之一 (就如同 MOV 那樣, 接下來(lái)會(huì)講)。 也許你在操作碼和腳本里看到的"JMP" 不像"MOV" 那么多,那是因?yàn)?JMP 命令有很多變種。下面就是列表。
JMP: 始終跳轉(zhuǎn)(Always jump to)
JE/JZ: 相等則跳轉(zhuǎn)(Jump to if equal)
JNE/JNZ: 不等則跳轉(zhuǎn)(Jump to if not equal)
JA: 無(wú)符號(hào)大于則跳轉(zhuǎn)( Jump to if Above)
JG: 有符號(hào)大于則跳轉(zhuǎn)(Jump to if Greater)
JNA: 無(wú)符號(hào)不大于則跳轉(zhuǎn)(Jump to if not Above)
JNG: 有符號(hào)不大于則跳轉(zhuǎn)(Jump to if not Greater)
JB: 無(wú)符號(hào)小于則跳轉(zhuǎn)(Jump to if Below)
JL: 有符號(hào)小于則跳轉(zhuǎn)(Jump to if Lower)
JNB: 無(wú)符號(hào)不小于則跳轉(zhuǎn)(Jump to if not Below)
JNL: 有符號(hào)不小于則跳轉(zhuǎn)(Jump to if not Lower)
JAE: 無(wú)符號(hào)大于等于則跳轉(zhuǎn)(Jump to if Above or Equal)
JGE: 有符號(hào)大于等于則跳轉(zhuǎn)(Jump to if Greater orEqual)
JNAE: 無(wú)符號(hào)不大于等于則跳轉(zhuǎn)(Jump to if not Above orEqual (即 JB) )
JNGE: 有符號(hào)不大于等于則跳轉(zhuǎn)(Jump to if not greaterthan or Equal (即JL) )
現(xiàn)在你大致了解了,應(yīng)該有些疑惑。 "Jump to if greater"或者JG都是條件跳轉(zhuǎn)。 條件跳轉(zhuǎn)都如同它們名字所描述的那樣,會(huì)在條件成立的情況下跳轉(zhuǎn)。通常,都會(huì)有CMP或者其他的比較函數(shù)在上面,這個(gè)待會(huì)再提。以上大抵就是JMP的故事。

---------------
III.d Alloc/Label/RegisterSymbol
---------------
我一般喜歡用兩種方法來(lái)區(qū)分Auto Assembler腳本
1) 簡(jiǎn)單的地址改變
如同下面的簡(jiǎn)單代碼:
Code:
[enable]
00ABC123:
mov eax,ebx
[disable]
00ABC123:
mov ebx,eax
這是在改變地址00ABC123里面的操作碼。
但是也有非常復(fù)雜的腳本,就如同dICE 或 pID00的腳本。 (我不會(huì)在這里介紹, 因?yàn)槟钦娴臎](méi)什么必要去學(xué))
在非常復(fù)雜的腳本當(dāng)中,你會(huì)在最頂上看到某些函數(shù),(注意,我并沒(méi)有經(jīng)常使用)在一個(gè)復(fù)雜的腳本當(dāng)中通常會(huì)出現(xiàn)"alloc","label"函數(shù),有時(shí)還會(huì)出現(xiàn)"registersymbol"。
````````````
Label
````````````
我認(rèn)為"label"函數(shù)是三個(gè)函數(shù)中最有重要的。 他能夠允許你用在腳本中使用"label"定義的變量,如同下面這樣。 (摸丸:label用于定義用于跳轉(zhuǎn)的標(biāo)簽)
Code:
label(Continue)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
//...
//...
SayWhat:
jmp 0 //insta-crash! =D
首先應(yīng)該注意此腳本的一些問(wèn)題,這個(gè)腳本沒(méi)有 "alloc" 函數(shù), 之后我就講
接著,如果你明白為什么程序執(zhí)行了對(duì)應(yīng)jne的label,那你做得不錯(cuò)。
注意所有的labels(跳轉(zhuǎn)標(biāo)簽)都在我的腳本中定義了,否則他們不會(huì)編譯。
````````````
Alloc
````````````
現(xiàn)在開(kāi)始講解"alloc"函數(shù)。 它是用來(lái)按照你的設(shè)想來(lái)分配X量的內(nèi)存的函數(shù) (hence,alloc,allocate)。 這些內(nèi)存不是那些用過(guò)的, 而是那些你在運(yùn)行程序中可以覆蓋的沒(méi)有被使用的內(nèi)存。 就如同我說(shuō)的,它會(huì)分配X量的內(nèi)存。 X是個(gè)字節(jié)數(shù)的變量。1024bytes, 或者1 kb(kilobyte) 一般就足夠你用了。現(xiàn)在我們了解了alloc函數(shù),讓我來(lái)演示下如何來(lái)使用。

那我們?yōu)槭裁床话褜W(xué)的加進(jìn)腳本里呢?
Code:
[ENABLE]
alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
alloc(WooHoo,1024)
label(Continue)
registersymbol(WooHoo)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
cmp eax,[WooHoo]
[DISABLE]
dealloc(AutoAssembler)
dealloc(SayWhat)
dealloc(WooHoo)
unregistersymbol(WooHoo)
哦這兒...還有個(gè)問(wèn)題。
You wrote:
為什么你不用那個(gè)"1024"了?
因?yàn)橛?jì)算機(jī)知道你分配的AutoAssembler是大小為1024 bytes 的 (我們就把它當(dāng)個(gè)例子試一試吧),你只是需要deallocAutoAssembler,它就知道應(yīng)該取消分配AutoAssembler的全部1024 bytes了。(很抱歉,解釋的有些迷糊)


---------------
III.e Call and Ret
---------------
Call 函數(shù)和JMP 函數(shù)很相似。 唯一的不同是Call有個(gè)返回到之前代碼的功能。這個(gè)簡(jiǎn)單例子利用了下面的兩個(gè)函數(shù)。
Code:
mov [0100579C],10 //把地址的值改成10
cmp [0100579C],0 //把它和0進(jìn)行比較
call NameGoesHere //調(diào)用或者跳轉(zhuǎn)到 NameGoesHere
jmp 01002FF5
NameGoesHere:
dec [0100579C] //地址的值減1
cmp [0100579C],0 //跟0進(jìn)行比較
jne NameGoesHere //如果不相等就返回到
//NameGoesHere的開(kāi)始,否則 繼續(xù)
ret //返回到之前,剛好是調(diào)用(call)函數(shù)之后
---------------
III.f Others
---------------
現(xiàn)在,很顯然,在Auto Assembler還有很多很多其他的函數(shù),不然它就是個(gè)很局限的語(yǔ)言。
我會(huì)繼續(xù)盡我所能解釋更多的函數(shù)。 (哦,老兄...)
`````
Nop
`````
Nop: 這個(gè)我之前提過(guò)。 它意味著 "無(wú)操作", 大體上它可以抵消它之前的代碼。
`````
Inc/Dec
`````
Inc: 加一。 用于給寄存器或地址加一。 用法如下。
Code:
inc eax
Dec: 減一,跟Inc似的
`````
Add/Sub
`````
Add: 加法。 用法如下。
Code:
add eax,02 //給eax加2,并且將結(jié)果保存在eax中
Sub: 減法,用法類似Add
`````
Lea
`````
這個(gè)有點(diǎn)讓人迷糊, 但還是繼續(xù)吧。看下邊的腳本。
Code:
mov eax,00123ABC
lea ebx,[eax+DEF]
也許你分不清楚,[eax+DEF] 是一個(gè)指針。 LEA把后面被指向的[eax+DEF]的地址替換給前面被指向的ebx里。
`````
And/Or/Xor
`````

好,我不知道如何清晰的說(shuō)明“異或(xor)”在英文中的含義 –很多網(wǎng)站都只是用幾行字這么描述的...
Them wrote:
我估計(jì)你明白這些邏輯操作符的行為
如果誰(shuí)能給我用英文為XOR做個(gè)定義我將感激不盡。即使如此,我還是不需要幫助就能解釋它們是如何在匯編中工作的。 ;)
首先,它們都有著類似于add、sub命令一樣的語(yǔ)法,如下。
Code:
and eax,ebx
每個(gè)eax 和 ebx 都可能是任何東西。哦不對(duì), 他不可能是 "mymom"。 -。-;
回到腳本。來(lái)處理這個(gè),(對(duì),我知道我們都不是電腦...) 我們先要給兩個(gè)寄存器值。就把12給eax,把27給ebx吧。下面,我們把它換成二進(jìn)制的—那個(gè)零和一的語(yǔ)言。 =O 有問(wèn)題嗎?
You wrote:
怎么把十進(jìn)制轉(zhuǎn)成二進(jìn)制啊?
我的傻朋友啊, 你怎么把你的好友計(jì)算器給忘了,用十進(jìn)制把數(shù)輸入,然后再點(diǎn)二進(jìn)制啊! 有些事情需要注意,計(jì)算器不允許輸入小數(shù),它會(huì)簡(jiǎn)單的四舍五入下然后再轉(zhuǎn)成二進(jìn)制。
我搞出了:
Code:
EAX = 1100
&
EBX = 11011
好,還能回想起小學(xué)時(shí)做的數(shù)學(xué)填空題嗎?讓我們?cè)谶@兒做下。
Code:
and eax,ebx
EAX = 1100
EBX = 11011
------------
現(xiàn)在,ADD(與)方法是如果都是1則是1,否則就是0。那就讓我們來(lái)做出這道題吧。
Code:
and eax,ebx
EAX = 01100 (加個(gè)0更輕松)? ? ?注:這里是二進(jìn)制換成十進(jìn)制也就是12
EBX = 11011?????????????????????????????注:這里是二進(jìn)制換成十進(jìn)制也就是27
-----------------
01000
現(xiàn)在我們把01000改成十進(jìn)制,我們就會(huì)得到8,那個(gè)被存在EAX里的值。

竅門:為了方便記憶我們可以記住AND都假才假,看不懂也不要緊,確實(shí)需要一點(diǎn)編程基礎(chǔ)。
接下來(lái), 是OR(或) 函數(shù)。 現(xiàn)在讓我們用相同的方法來(lái)輕松一下
Code:
or eax,ebx
EAX = 01100????????????????????????????????注:這里是二進(jìn)制換成十進(jìn)制也就是12
EBX = 11011????????????????????????????????注:這里是二進(jìn)制換成十進(jìn)制也就是27

-----------------
OR函數(shù)的功能與AND函數(shù)正相反。都是0,則得0, 否則就得1。
Code:
or eax,ebx
EAX = 01100
EBX = 11011
------------------

11111
把11111轉(zhuǎn)成十進(jìn)制,那會(huì)得到31,是EAX里存的值。
最后,是XOR(異或)函數(shù)。還是用那個(gè)方法。
Code:
xor eax,ebx
EAX = 01100
EBX = 11011
-----------------
好,XOR函數(shù)是如果兩個(gè)數(shù)相同就得0,不同就得1。
Code:
xor eax,ebx
EAX = 01100
EBX = 11011
-----------------
10111

總結(jié):亦或,不難理解,編程經(jīng)常用到,沒(méi)基礎(chǔ)的小伙伴可以記住XOR:比真為真
我們把它轉(zhuǎn)換成23,而23就是儲(chǔ)存在EAX里的值。順便一提,無(wú)論當(dāng)我們寫(xiě)的是腳本、代碼還是別的什么,你都不需要考慮EAX里面裝的什么BlahBlahBlah的東西, 我之所以這么做是讓你知道它是如何工作的。
`````
好,這就是你所有需要知道的命令,(伙計(jì),這可真長(zhǎng)...) 讓我們開(kāi)始下一章節(jié)吧...

------------------------------
Bonus. Writing a Script
------------------------------
既然你讀了教程,那也應(yīng)該很了解了,但你還是想知道更多。 我明白, 就如同我體會(huì)過(guò)的—遺憾。我不認(rèn)為有任何關(guān)于寫(xiě)腳本的教程是我用的上的。
Code:
[ENABLE]
alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
alloc(WooHoo,1024)
label(Continue)
registersymbol(WooHoo)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
cmp eax,[WooHoo]
SayWhat:
jmp 0
[DISABLE]
dealloc(AutoAssembler)
dealloc(SayWhat)
dealloc(WooHoo)
unregistersymbol(WooHoo)
還記得之前的這個(gè)腳本嗎? 現(xiàn)在讓我們用我們所學(xué)的大量?jī)?nèi)容把它弄完整。
Code:
[ENABLE]
alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
alloc(WooHoo,1024)
label(Continue)
registersymbol(WooHoo)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
cmp eax,[WooHoo]
SayWhat:
jmp 0
[DISABLE]
dealloc(AutoAssembler)
dealloc(SayWhat)
dealloc(WooHoo)
unregistersymbol(WooHoo)
對(duì)于腳本你需要有些東西, 一個(gè)你試圖hack的程序的真實(shí)內(nèi)存的地址。 無(wú)論如何, 它都不能是一個(gè)隨機(jī)的地址, 或者是一些你不希望它發(fā)生但是會(huì)導(dǎo)致其發(fā)生的地址(崩潰,也許)。

這個(gè)地址對(duì)于這件事很重要。
但是為什么我們需要一個(gè)地址? 就如同之前我所說(shuō)的,alloc 函數(shù)在你的程序中分配一塊未使用內(nèi)存。因?yàn)檫@是未使用的,程序不會(huì)訪問(wèn)這里,所以,你要讓程序訪問(wèn)它。
當(dāng)你干預(yù)這些地址時(shí),你需要注意一些至關(guān)重要的事情。第一, 你必須用與源碼相同總量的字節(jié)。 如何知道一個(gè)操作碼字節(jié)的數(shù)量呢? 簡(jiǎn)單,看在地址和操作碼中間,那兒應(yīng)該有一堆兩個(gè)一組兩個(gè)一組的字符,他們被稱為Array of Bytes。
nop 函數(shù)對(duì)于這種情況非常有幫助。就如同我之前解釋的那樣,它的含義是“無(wú)操作”。并且它只用一個(gè)字節(jié)。這意味著,如果你用不了所有的字節(jié)位置,那你就可以用nop把它填滿。
當(dāng)填字節(jié)時(shí)你可能會(huì)遇到三種情況。我已經(jīng)描述了第一種你的代碼比源碼少的情況。剩下兩種情況的一個(gè)是,你的代碼所占的字節(jié)數(shù)和源碼字節(jié)數(shù)相等,一切剛剛好。
但最后一種情況有些令人困惑,那就是你的代碼的字節(jié)比源碼的多?,F(xiàn)在,你的代碼的字節(jié)會(huì)把下面的代碼字節(jié)覆蓋,直到字節(jié)的位置夠用。
為什么我們不玩Minesweeper呢? 一段時(shí)間之前,我還在學(xué)習(xí)寫(xiě)腳本的時(shí)候,我寫(xiě)了一小段代碼(我還是我,但那時(shí)我還知道的很少)。
Code:
[enable]
alloc(WhatNowMinesweeper,256) //分配...
alloc(ChiliDog,4)
label(ReturnHere)
registersymbol(ChiliDog) //注冊(cè)...
ChiliDog:
dd 0 //用于參考引用,表示ChiliDog的值是從0開(kāi)始
01002FF5: //這個(gè)地址是為MineSweeper寫(xiě)入時(shí)間的
jmp WhatNowMinesweeper //我重寫(xiě)了操作碼,讓它跳轉(zhuǎn)到我的腳本
nop //填充了最后的字節(jié)
ReturnHere: //這個(gè)是干什么的我待會(huì)告訴你
WhatNowMinesweeper: //我的實(shí)際代碼
push eax //保存eax, 我們不這么做就會(huì)有問(wèn)題
mov eax,[ChiliDog] //把ChiliDog的值傳入eax
mov [0100579C],eax //把存有ChiliDog值的eax存入時(shí)間
pop eax //讓eax出棧,因?yàn)槲覀円呀?jīng)用完了

jmp ReturnHere //跳轉(zhuǎn)到ReturnHere, 待會(huì)解釋
[disable]
dealloc(WhatNowMinesweeper) //取消分配內(nèi)存
dealloc(ChiliDog)
unregistersymbol(ChiliDog) //反注冊(cè)標(biāo)識(shí)
01002FF5: //這是我修改來(lái)跳入我的代碼的地址
inc [0100579C] //這是源操作碼用以防止崩潰
現(xiàn)在,最最先要做的。我要告訴你"ReturnHere"是什么。 如你所知,一個(gè)被告知要執(zhí)行一個(gè)操作碼的程序進(jìn)程,他們會(huì)自動(dòng)移動(dòng)到下一個(gè)操作碼,然后繼續(xù)。 這就如同一個(gè)無(wú)限的輪回。這樣,如果我們弄了條死路,即代碼之后已經(jīng)沒(méi)有代碼了,那這個(gè)程序幾乎就會(huì)崩潰。因此, 我們要讓它執(zhí)行過(guò)我們的代碼之后再返回到調(diào)用跳轉(zhuǎn)之后的位置上,這樣代碼就可以繼續(xù)了—并且我們也不會(huì)崩潰! =D

【轉(zhuǎn)】CE自動(dòng)匯編的一些常用命令收集及講解的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
乐昌市| 交城县| 三都| 阆中市| 会同县| 博野县| 蓬安县| 清丰县| 安乡县| 天台县| 中江县| 会东县| 页游| 连南| 平罗县| 巴楚县| 大荔县| 潞西市| 剑阁县| 遂平县| 平阳县| 耿马| 班玛县| 石嘴山市| 太白县| 宁南县| 长治市| 仲巴县| 十堰市| 理塘县| 安义县| 苗栗市| 修文县| 天长市| 克拉玛依市| 根河市| 溆浦县| 安塞县| 长丰县| 红河县| 阳高县|