.
上篇文章<<【屠夫話題】關於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...