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到彙編時的那麼框架 ...