1. 程式人生 > >2018/10/03-字串指令(重複指令、操作資料緩衝區指令)、rep與movx指令-《惡意程式碼分析實戰》

2018/10/03-字串指令(重複指令、操作資料緩衝區指令)、rep與movx指令-《惡意程式碼分析實戰》

  重複指令是一組操作資料緩衝區的指令。資料緩衝區通常是一個位元組陣列的形式,也可以是單字或者雙字。(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或找到該位元組時,比較停止。