strcpy 彙編的過程

2021-08-18 11:31:38 字數 2690 閱讀 5736

00401191       mov edi,dword ptr ss:[esp+0x8]           ;  buffer陣列位址

00401195 jmp short test.00401201

...00401201 mov ecx,dword ptr ss:[esp+0xc] ; cpy的數的位址

00401205 test ecx,0x3 ; 判斷cpy數的位址是否正確

0040120b je short test.00401226

...00401226 mov edx,0x7efefeff

0040122b mov eax,dword ptr ds:[ecx] ; eax儲存buffer中四個位元組

0040122d add edx,eax ; eax+7efefeff

0040122f xor eax,-0x1 ; 對eax取反

00401232 xor eax,edx ; eax取反 xor (7efefeff+eax)

00401234 mov edx,dword ptr ds:[ecx] ; 儲存buffer四個位元組

00401236 add ecx,0x4 ; ecx-->buffer+4

00401239 test eax,0x81010100 ; **見註解**

0040123e je short test.00401221

00401240 test dl,dl

00401242 je short test.00401278 ; 第乙個位元組為00

00401244 test dh,dh

00401246 je short test.0040126f ; 第二個位元組為00

00401248 test edx,0xff0000

0040124e je short test.00401262 ; 第三個位元組為00

00401250 test edx,0xff000000

00401256 je short test.0040125a ; 第四個位元組為00

00401258 jmp short test.00401221

0040125a mov dword ptr ds:[edi],edx

0040125c mov eax,dword ptr ss:[esp+0x8]

00401260 pop edi ; 0012fb20

00401261 retn

00401262 mov word ptr ds:[edi],dx

00401265 mov eax,dword ptr ss:[esp+0x8]

00401269 mov byte ptr ds:[edi+0x2],0x0

0040126d pop edi ; 0012fb20

0040126e retn

0040126f mov word ptr ds:[edi],dx

00401272 mov eax,dword ptr ss:[esp+0x8]

00401276 pop edi ; 0012fb20

00401277 retn

00401278 mov byte ptr ds:[edi],dl

0040127a mov eax,dword ptr ss:[esp+0x8]

0040127e pop edi ; 0012fb20

0040127f retn

註解:同於0x81010100做或運算來判斷改陣列中存在00,分別有四個情況

第乙個位元組為00:則0040122d add edx,eax處,edx的最後乙個位元組必為ff,同時不會產生進製,那麼第二個位元組數處為(xx-2)xor(!xx),第八位必然為1,如果不為0,那麼該處(xx-1)xor(!xx)第八位必然為0。同理第二個,第三個。

第四個位元組為00,同理在add edx,eax處 edx的第乙個位元組必定為7f(7e+00+第三位的進製),那麼7f xor (!00)=0x1000 0000

所以只有當四個位元組中存在00時 test 0x81010100才可能不為1,跳出迴圈,接下來判斷為00的位元組位數。

程式的彙編,鏈結過程

code.c源 彙編檔案包含各種宣告,包括以下幾行 每個 對應一句彙編指令。使用 c 命令產生目標 檔案code.o,因為是二進位制檔案,所以無法檢視。不過,要檢視目標 的內容,可以使用反彙編器 disassembler 在linux系統中,帶 d 命令列標誌的程式objdump可以充當這個角色.注...

組合語言的執行過程

編寫源程式 生出.asm彙編檔案 編譯器編譯 生成.obj目標檔案 聯結器鏈結 生成.exe可執行檔案 通過command載入 送往記憶體 cpu執行程式 源程式 包含著偽指令和彙編指令和一些標號,偽指令就是由編譯器執行的指令,編譯器根據偽指令進行相應的的編譯工作比如assume segment e...

使用C和彙編混合實現strcpy 歡迎扔磚

我們經常使用的strcpy,相信很多人都知道它的實現了,那麼有沒有想過自己寫乙個strcpy呢?在c下面,據說這是很經典的實現方法哦,簡潔而乾淨 char strcopy2 char szdst,const char szsrc 不過由於使用的c語言的實現,那麼就不可避免會造成c到彙編時的那麼框架 ...