1. 程式人生 > >2018/10/03-字符串指令(重復指令、操作數據緩沖區指令)、rep與movx指令-《惡意代碼分析實戰》

2018/10/03-字符串指令(重復指令、操作數據緩沖區指令)、rep與movx指令-《惡意代碼分析實戰》

分析 casb 形式 使用 如果 常見 緩沖區 字符串 osb

  重復指令是一組操作數據緩沖區的指令。數據緩沖區通常是一個字節數組的形式,也可以是單字或者雙字。(Intel‘稱這些指令為字符串指令)

  最常見的數據緩沖區操作指令是movsx、cmps、stosx和scasx,其中x可以是b、w後者d,分別表示字節、字和雙字。這些指令對任何形式的數據都有效。

  在這些操作中,使用ESI和EDI寄存器。ESI是源索引寄存器,EDI是目的索引寄存器。還有ECX用作計數的變量。

  這些指令還需要一個前綴,用於對長度超過1的數據做操作。movsb指令本身只會移動一個字節,而不使用ECX寄存器。

  在x86下,使用重復前綴來做多字節操作。rep指令會增加ESI和EDI這兩個偏移,減少ECX寄存器。rep前綴會不斷重復,直至ECX=0。repe/repz和repne/repnz前綴則不斷重復,直至ECX=0或直至ZF=1或0。在大部分的數據緩沖區操作指令中,ESI、EDI和ECX必須為rep指令的生效而進行適當的初始化。

  mvosb指令用於將一串字節從一個位置移動到另一個位置。rep前綴經常與movsb一起使用,從而賦值一串長度由ECX決定的字節。從邏輯上說,rep movsb指令等價於C語言的memcpy函數。movsb指令從ESI指向地址取出一個字節,將其存入EDI指向地址,然後根據方向標誌(DF)的設置,將ESI和EDI的值加1或者減1。若果DF=0,則加,否則減。

  cmpsb指令用於比較兩串字節,以確定其是否是相同的數據。它經常與repe前綴一起使用,此時,cmpsb指令逐一比較兩串字節,直至發現一處不同或比較到頭。ECX=0或者ZF=0,就停止重復。相當於C語言中memcp函數。

  scasb指令用於從一串字節中搜索一個值。這個值有AL寄存器給出。它的工作方式與cmpsb一樣,但是它是將ESI指向地址的字節與AL進行比較,而不是與EDI指向地址的字節比較。repe操作會使得這個比較不斷繼續,知道找到該字節,或者ECX=0。如果在這串字節中找到了那個值,其位置會被存儲在ESI中。

  stosb指令用於將值存儲到EDI指向的地址。它與scasb一樣,但不是去搜索,而是將指定的字節存入EDI指向的地址。rep前綴與scasb一起使用後,就初始化了一段內存緩沖區,其中的每個字節都是相同的值。這等價於C語言的memset函數。

  rep指令實例:

  repe cmpsb  用於比較兩塊數據緩沖區。EDI和ESI必須被設為兩端緩沖區的地址,ECX必須被設為緩沖區長度。當ECX=0或者發現緩沖區不一致的時候,停止比較。

  rep stosb  用於用一個給定的值初始化一塊緩沖區所有字節。EDI包含了緩沖區地址,AL則包含初始值。這個指令通常與xor eax, eax一起使用。

  rep movsb  一般用於賦值緩沖區中的字節。ESI需要被設為緩沖區地址,EDI被設為目的緩沖區地址,ECX則必須為要復制的長度。會逐字節復制,直至ECX=0。

  rep scasb  用於在一段數據緩沖區中搜索一個字節。EDI需指向緩沖區地址,AL則包含要找的字節,ECX設為緩沖區長度。當ECX=0或找到該字節時,比較停止。

2018/10/03-字符串指令(重復指令、操作數據緩沖區指令)、rep與movx指令-《惡意代碼分析實戰》