打造VC 偽裝器

2021-04-16 20:34:25 字數 4636 閱讀 2535

打造vc++偽裝器

楚茗前幾天,在乙個黑客站點看到vc++偽裝器這麼乙個小工具,突然感到很眼熟。對了,以前在看雪學院(www.pediy.com)看到過欺騙查殼工具的文章,趕緊去複習複習。當然了,現在我已經複習好了,這裡我就告訴大家原理和帶大家一起用vc打造乙個簡單的vc++偽裝器。

首先我們簡單的認識一下pe檔案。因為只有對pe檔案很熟悉的情況下讀本文才會更加游刃有餘。pe 的意思就是 portable executable(可移植的執行體)。它是 win32環境自身所帶的執行體檔案格式。大概的pe檔案格式如下:

dos mz header―所有pe檔案(甚至32位的dlls)必須以乙個簡單的dos mz header開始

dos stub-dos stub實際上是個有效的exe,大多數情況下它是由彙編器/編譯器自動生成

pe header-pe header是pe相關結構 image_nt_headers的簡稱

section table-image_section_header

section 1-pe檔案的真正內容劃分成塊,稱之為sections,同sections中的**/資料屬性相同

section 2

section ...

section n

上面的**就是pe檔案的物理結構。還有vc程式的基位址是 0x400000,也就是說exe程式執行時會被載入記憶體的該位址處。pe的各種結構中,涉及到很多位址,偏移。有些是指在檔案中的偏移,有的是指在記憶體中的偏移。一定要搞清楚了才能真正的理解本文,當然套用其中的一些**也是可以的。關於pe檔案的更多知識,大家可以到看雪學院的論壇上查詢。我在說下去就太多了。

其實大家在作木馬免殺時使用到的修改程式入口點和新增花指令技術就是手工偽造。呵呵,我們這裡就是用程式來做罷了。基本思路相同,就是先增加乙個節寫入vc++入口處的特徵**,然後jmp到原程式的入口點,最後修改程式的入口點到我們增加的那個節處。偵殼工具檢測到vc的特徵**就把殼識別為vc++了。木馬免殺中用到的g!x protector v1.2和木馬彩衣等可能也是這個原理。

程式語言:vc++

偵殼工具:peid

特徵碼提取工具:ollydbg

首先我們用od開啟乙個mfc程式,來到程式的入口點,**如下:

位址      16進製制             反彙編

00401d70   |  55                push ebp

00401d71   |.  8bec              mov ebp,esp

00401d73   |.  6a ff               push -1

00401d75   |.  68 50354000         push vc++偽裝.00403550

00401d7a   |.  68 f61e4000      push ;  se 控制代碼安裝

00401d7f   |.  64:a1 00000000     mov eax,dword ptr fs:[0]

00401d85   |.  50                   push eax

00401d86   |.  64:8925 00000000    mov dword ptr fs:[0],esp

00401d8d   |.  83ec 68              sub esp,68

00401d90   |.  53                  push ebx

cfile myfile;

_image_dos_header  mydosheader;

_image_nt_headers  myntheader;

_image_section_header  mysectionheader;

int numberofsections,mybufsize;

dword voffset=0,vsize=0,roffset=0,rsize=0,myvoffset=0,myroffset=0;

dword oldep,newep,jmp;

byte vcbuf[33]=;

byte mybuf[100]=;

cstring m_bakname=mumapath+".bak";

::copyfile((lpctstr)mumapath,(lpctstr)m_bakname,false);  //備份檔案

if (!myfile.open((lpctstr)mumapath,cfile::modereadwrite|cfile::typebinary,null))

return;

//判斷檔案的有效性

myfile.read(&mydosheader,sizeof(_image_dos_header));

if (mydosheader.e_magic!=image_dos_signature)

myfile.seek(mydosheader.e_lfanew,cfile::begin);

myfile.read(&myntheader,sizeof(_image_nt_headers));

if (myntheader.signature!=image_nt_signature)

numberofsections=myntheader.fileheader.numberofsections;

myntheader.fileheader.numberofsections++;//由於自定義了乙個段

myfile.seek(mydosheader.e_lfanew,cfile::begin);

myfile.write(&myntheader,sizeof(_image_nt_headers));

for (int i=0;ivoffset)

if (mysectionheader.pointertorawdata>roffset)

}//得到最大的offset

while (myvoffsetwhile (myroffset//為的定義的段隨便起個段名

for (i=0;i<8;i++)

mysectionheader.name[i]=0;

mysectionheader.name[0]=『c『;

mysectionheader.name[1]=『h『;

mysectionheader.name[2]=『u『;

mysectionheader.name[3]=『m『;

mysectionheader.name[3]=『i『;

mysectionheader.name[3]=『n『;

//增加乙個新段

mysectionheader.misc.virtualsize=0x1000;

mysectionheader.virtualaddress=myvoffset;

mysectionheader.sizeofrawdata=0x200;

mysectionheader.pointertorawdata=myroffset;

mysectionheader.characteristics=0xe0000020;

myfile.write(&mysectionheader,sizeof(_image_section_header));

//修改入口點到新入口點

oldep=myntheader.optionalheader.addressofentrypoint;//原入口點

newep=myvoffset;

myntheader.optionalheader.addressofentrypoint=newep;

myntheader.optionalheader.majorlinkerversion=6;

myntheader.optionalheader.minorlinkerversion=0;  

myntheader.optionalheader.sizeofimage=myvoffset+0x1000;

myfile.seek(mydosheader.e_lfanew,cfile::begin);

myfile.write(&myntheader,sizeof(_image_nt_headers));

//寫入特徵碼

mybufsize=sizeof(vcbuf);

memcpy(mybuf,vcbuf,mybufsize);

myfile.setlength(myroffset+0x200);

myfile.seek(-0x200,cfile::end);

myfile.write(&mybuf,mybufsize);

//跳回原入口點

jmp=oldep-(newep+mybufsize)-5;

byte jmpbuf=0xe9;

myfile.write(&jmpbuf,1);

myfile.write(&jmp,sizeof(jmp));

afxmessagebox("偽裝成功!",mb_ok|mb_iconinformation,0);    

原理和**就是這樣。大家現在知道為什麼要熟悉pe檔案了?要正確的定址當然要熟悉pe的結構了。如果看的不是很明白就去了解和熟悉pe檔案格式吧。

我們拿delphi和vb寫的程式做測試,修改後,用偵殼工具peid看看,顯示「microsoft visual c++」,成功!而且該偽裝對一些壓縮殼也有作用哦,upx加過殼的作測試,也顯示。根據上面的原理,你不是還可以作出偽裝delphi等的偽裝工具呢?趕快動手試試吧。 

爬蟲瀏覽器偽裝

先引入模組 urllib.request和re import requests import re定義乙個url鏈結 url 瀏覽器偽裝,定義乙個headers頭 headers user agent 將headers新增到真實的報頭中去,首先建立乙個opener物件,再將其新增進去 opener ...

python瀏覽器偽裝技術

整理的python在進行爬蟲時,進行瀏覽器偽裝import urllib.request 以字典的形式設定headers accept language zh cn,zh q 0.8,en us q 0.5,en q 0.3 connection keep alive referer 設定cooki...

打造最強的VC6

你是否覺得vc.net或者vs2005太過龐大?你是否用慣了vc6不願意離開它,但卻總是苦於它對c 標準庫支援得不好?你是否覺得vc6的 提示功能很不完善?喜歡vc6的朋友,不用憂愁。採用下面的方法,我們將改造vc6為最強 大的編譯器。開始改造!一 準備 二 支援c 標準 安裝intel c 8.0...