直接讀取修改exe文件


1、 前言

配置器的編寫有很多的方式,主要是直接修改原始的受控端的程序,有的方式是把受控端和配置信息都放到控制端程序的內部,在需要配置受控端的時候直接輸入配置信息,生成受控端;也有的方式是在外部直接修改未配置信息的受控端程序。

2、編程思路

  • 服務端設置變量,然后讀取變量的值。

  • 配置端讀取服務端的PE文件,找到變量初始值清空寫入新設置的值。

3、實踐代碼

  • 服務端

聲明三個已經初始化值的變量

// URL配置器.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include "stdafx.h"  

int main(int argc, char* argv[])
{
	TCHAR szIpAddress[] = L"AAAAAAAAAAAAAAAAAAAAAAAAAAAA";                                 // IP地址
	TCHAR szPort[] = L"BBBBBBBBBBBBBBBBBBBBBBBBBBBB";                                      // 端口號
	TCHAR szOtherInfo[] = L"CCCCCCCCCCCCCCCCCCCCCCCCCCCC";                                 // 其他信息

	printf("IP:%ls\nPort:%ls\nOther Information:%ls\n", szIpAddress, szPort, szOtherInfo); // 打印信息

	getchar();

	return 0;
}

通過010editor編輯器可以看到變量在字符串里的位置,在PE文件里的存儲形式如下圖。

因為存放的IP信息,端口信息以及其他信息是存在固定位數的,這個固定的位數也就是AAAAAA....,BBBBB....,CCCCCC三個數組字符串的固定長度。

生成配置端就是要用同等的數據替換掉原先的信息。

  • 配置器

三個編輯框分別對應着IP地址、端口號、其他信息。變量名分別為m_szIpStr、m_szPortStr、m_szOtherStr。

MFC回車會關閉掉程序,需要重寫一下PreTranslateMessage虛函數。

BOOL CMFC配置端Dlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加專用代碼和/或調用基類
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
	{
		if (GetFocus()->GetDlgCtrlID() == IDC_szIP)//按下回車,如果當前焦點是在自己期望的控件上
		{
			// 你想做的事,如果按下回車時焦點在你想要的控件上
			OnBnChangePE();
		}
		return TRUE;
	}
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
		return TRUE;
	return CDialogEx::PreTranslateMessage(pMsg);
}

按鈕對應的事件函數名是OnBnChangePE();

UpdateData(true); 是讀取數據,False是更新數據。


void CMFC配置端Dlg::OnBnChangePE()
{
	// TODO: 在此添加控件通知處理程序代碼
	UpdateData(true);

	BOOL bRet = false;     // 打開狀態標志
	TCHAR * pFileData;     // 文件流內容
	DWORD d_FileSize;      // 文件大小
	TCHAR chPath[MAX_PATH];  // 配置文件路徑


	// 打開要修改的PE文件
	CFileDialog dlg(TRUE, _T("exe"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("可執行文件|*.exe||"), this);
	dlg.m_ofn.lpstrTitle = L"打開URL配置器.exe";
	if (dlg.DoModal() == IDOK)
	{
		CString szPE_Path;
		szPE_Path = dlg.GetPathName();
		wmemset(chPath, 0, szPE_Path.GetLength() + 1);
		wmemcpy(chPath, szPE_Path, szPE_Path.GetLength()+1);
	}
	else
	{
		return;
	}


	// 讀出文件內容並寫入  
	HANDLE hFile = CreateFile(chPath, GENERIC_READ, 0, NULL, OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL, NULL);

	d_FileSize = GetFileSize(hFile, NULL);
	pFileData = new TCHAR[d_FileSize + 1];

	bRet = ReadFile(hFile, pFileData, d_FileSize, &d_FileSize, NULL);
	if (0 == bRet)
	{
		return;
	}

	// 替換目標可執行文件中的指定信息:IP port 以及其他的信息  
	TCHAR szIpStr[] =    L"AAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	TCHAR szPortStr[] =  L"BBBBBBBBBBBBBBBBBBBBBBBBBBBB";
	TCHAR szOtherStr[] = L"CCCCCCCCCCCCCCCCCCCCCCCCCCCC";

	TCHAR * pDst;
	int i = 0;

	// 處理IP字符串  
	while (true)
	{
		if (wcscmp(szIpStr, pFileData + i) == 0)
		{
			break;
		}
		else
		{
			i++;
		}
	}

	// 找到IP地址字符串對應的地址偏移
	pDst = pFileData + i;

	//CString轉char 將原先的AAAAA...替換成現在我們要設定的IP地址
	wmemset(pDst, 0, wcslen(szIpStr)+1);                       // 清空原先AAAA字符串
	wmemcpy(pDst, m_szIpStr, m_szIpStr.GetLength() + 1);       // 把設定的IP字符串復制到內存中

	// 處理端口字符串  
	while (true)
	{
		if (wcscmp(szPortStr, pFileData + i) == 0)
		{
			break;
		}
		else
		{
			i++;
		}
	}
	pDst = pFileData + i;
	//CString轉char 將原先的BBBBB...替換成現在我們要設定的IP地址
	wmemset(pDst, 0, wcslen(szPortStr) + 1);                       // 清空原先BBBB字符串
	wmemcpy(pDst, m_szPortStr, m_szPortStr.GetLength() + 1);       // 把設定的端口字符串復制到內存中

	// 處理其他信息字符串
	while (true)
	{
		if (wcscmp(szOtherStr, pFileData + i) == 0)
		{
			break;
		}
		else
		{
			i++;
		}
	}
	pDst = pFileData + i;
	//CString轉char 將原先的BBBBB...替換成現在我們要設定的IP地址
	wmemset(pDst, 0, wcslen(szOtherStr) + 1);                      // 清空原先CCCCC字符串
	wmemcpy(pDst, m_szOtherStr, m_szOtherStr.GetLength() + 1);     // 把設定的端口字符串復制到內存中

	CloseHandle(hFile);                                            //關閉句柄



	//////////////////////////////////
	// 保存文件內容到新的exe文件中 /// 
	//////////////////////////////////


	// 保存新PE文件路徑
	CFileDialog dlg_NewSavePath(TRUE, _T("exe"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("可執行文件|*.exe||"), this);
	dlg_NewSavePath.m_ofn.lpstrTitle = L"保存的路徑.exe";
	if (dlg_NewSavePath.DoModal() == IDOK)
	{
		CString szPE_Path;
		szPE_Path = dlg_NewSavePath.GetPathName();
		wmemset(chPath, 0, szPE_Path.GetLength() + 1);               
		wmemcpy(chPath, szPE_Path, szPE_Path.GetLength() + 1);
	}
	else
	{
		return;
	}

	// 新建文件
	hFile = CreateFile(chPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
		FILE_ATTRIBUTE_NORMAL, NULL);
	
	// 寫入文件
	bRet = WriteFile(hFile, pFileData, d_FileSize, &d_FileSize, NULL);
	if (bRet == 0)
	{
		return;
	}
	// 關閉句柄
	CloseHandle(hFile);
}

3、修改后的效果對比

4、參考

通過直接讀取修改exe文件的方式編寫遠控/木馬配置器

http://blog.csdn.net/junbopengpeng/article/details/37915133


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM