屠夫科普 感染PE增加匯入項實現注入

2021-06-01 06:53:01 字數 4146 閱讀 2095

.

上篇文章<<【屠夫話題】關於mmrpg型輔助相對通用框架的討論》承諾放出原始碼分享.今天實現.  

之前有朋友說此方法還不夠通用.原因有個別國外遊戲會啟動後,對自身載入的所有檔案進行hash效驗,不過它可以檢測自帶的檔案.難道連系統檔案也效驗.先判斷當前系統.  

再取得微軟的效驗碼?這強度未免太大了吧. 我乙個人實在沒有那麼多精力測試.希望朋友們幫忙.  

微軟的detours也在使用這種方法注入,我的和它的有一點區別.它的比較溫柔.主要攻擊exe,啟動程序掛起.然後修改動態pe.我攻擊所有pe檔案.靜態修改.  

程式語言:c  

程式設計環境:microsoft visual studio 2008  

系統平台:windows server 2008  

實現原理: 啟動程序系統是通過其匯入表確定該為其載入那些動態連線庫.它是乙個陣列.每個成員代表乙個動態連線庫.我們要做的就是為這個陣列增加乙個成員. 

而這個成員就是我們的動態連線庫.只是這個陣列是固定大小的,它的前面後面.都沒有位置讓我們新增乙個成員.所以我們只能隨便找乙個空地新構造乙個這樣的陣列即可 

複製**

函式名稱:infectimport

函式返回:true or false

第一引數:目標檔案路徑

第二引數:將注入的動態連線庫

int infectimport(const char* path,const char* library)

;file*                    file=0x0;

char*                    buffer=0x0;

const char*                    test=text("butcher's");

unsigned long                 size=0;

unsigned long                offset=0;

image_dos_header                dos=;

image_nt_headers                nt=;

image_section_header            section=;

image_import_descriptor*             import=0;

image_data_directory*             directory=0;

//申請所需的區域性變數並為其初始化

if (fopen_s(&file,path,text("rb+"))!=0)

//以讀寫許可權開啟目標檔案

__try

//讀取檔案dos頭到快取,並判斷dos簽名

fseek(file,0x28,seek_set);

fread(sign,0x10,1,file);

if (strcmp(test,sign)==0)

//讀取檔案第28位元組處到快取,此為image_dos_header結構e_res2[10]域的位置.

//原為微軟定義的保留位.就是微軟還沒想好用這個地方做點什麼,只是空乙個空留著以後想到了再用.

//那它現在不用,我們就拿來用一下.用來做效驗.判斷當前檔案是否已經被感染過了.如沒有才繼續

fseek(file,dos.e_lfanew,seek_set);

fread(&nt,sizeof(image_nt_headers),1,file);

if (nt.signature!=image_nt_signature)

//讀取檔案nt頭到快取,並判斷nt簽名

fseek(file,dos.e_lfanew+sizeof(image_nt_headers)+sizeof(image_section_header),seek_set);

fread(§ion,sizeof(image_section_header),1,file);

if (section.virtualaddress!=nt.optionalheader.baseofdata)

//讀取檔案rdata節到快取,並判斷正確性.

size=nt.optionalheader.datadirectory[1].size;

if (size+0x20>section.sizeofrawdata-section.misc.virtualsize)

//獲取檔案匯入表尺寸,並判斷rdata節剩餘空間是否能容納新增乙個匯入項的新匯入表.

offset=section.pointertorawdata+section.misc.virtualsize;

//獲取節空隙起始位置

buffer=calloc(0x20,sizeof(char));

memset(buffer,0,0x20);

strcpy_s((char*)buffer,strlen(library)+1,library);

*(int*)((int)buffer+0x10)=0x80000001;

*(int*)((int)buffer+0x14)=0x0;

*(int*)((int)buffer+0x18)=0x0;

*(int*)((int)buffer+0x1c)=0x0;

//申請20位元組堆,用以構造新匯入項結構

fseek(file,offset,seek_set);

fwrite(buffer,sizeof(char),0x20,file);

//把新構造的匯入項結構寫入檔案rdata節空隙起始位置

import=malloc(sizeof(image_import_descriptor));

import->firstthunk            =offset+0x10;

import->forwarderchain        =0;

import->name            =offset;

import->originalfirstthunk        =offset+0x18;

import->timedatestamp        =0;

//申請堆,用以構造新匯入項.

fseek(file,nt.optionalheader.datadirectory[1].virtualaddress+size-0x14,seek_set);

fwrite(import,sizeof(image_import_descriptor),1,file);

//在檔案匯入表結尾處寫入新構造的匯入項

buffer=realloc(buffer,size);

memset(buffer,0,size);

fseek(file,nt.optionalheader.datadirectory[1].virtualaddress,seek_set);

fread(buffer,sizeof(char),size,file);

fseek(file,offset+0x20,seek_set);

fwrite(buffer,sizeof(char),size,file);

//複製新匯入表到新位置

directory=malloc(sizeof(image_data_directory));

directory->size                =size+0x14;

directory->virtualaddress            =offset+0x20;

fseek(file,dos.e_lfanew+sizeof(image_nt_headers)-0x78,seek_set);

fwrite(directory,sizeof(image_data_directory),1,file);

//修改檔案目錄使匯入表指向新位置,報告新尺寸

fseek(file,0x28,seek_set);

fwrite(test,strlen(test),1,file);

//成功後在檔案第28位元組處,也就是image_dos_header結構e_res2[10]域的位置

//寫入我們自定義的感染標誌.這裡標誌為:butcher's

}__except(exception_execute_handler)

}__finally

return 1;}

ps:此**居然破壞性.請先備份目標檔案再行使用 (使用前請把想要注入的動態連線庫放入與目標相同的資料夾內)

遞推演算法 狼與屠夫

題目 狼的洞穴與屠夫的家距離為c 當屠夫經過狼的洞穴時,狼需要t秒才能發現屠夫 當狼追上屠夫時,屠夫丟一塊骨頭給狼,狼把骨頭叼回洞穴,並花費f秒把骨頭藏起來,然後再去追屠夫 屠夫的速度為vp,狼的速度為vd 問屠夫要丟幾塊骨頭才能回到家?分析 1.用s表示屠夫的位置,則可以用s與c比較,來確定屠夫是...

轉SAP屠夫講的故事

說,某天老屠手頭緊,缺銀子花,於是找到一家erp公司,說,我給你一堆錢,給整個什麼傳說中的erp系統,好不好用不要緊,咱不差錢,也不要啥軟體,關鍵是那一堆錢你跟俺返還多少percent回來就行,這是關鍵,你們報個價吧,記註,多多的報!erp公司於是傻忽忽問你們要erp做什麼,老屠答 控制利潤!erp...

PE檔案感染

最近學習了一下pe檔案,看了份pe檔案感染原始碼,分析了一下,其實就是修改程序,拋磚引玉 本來想把整個 發下,但是太大了,只發函式的 讀取檔案pe資訊 bool readpeinfo file fp,mzheader outmz,pe header outpe,pe extheader outpex...