通过直接读取修改exe文件的方式编写远控/木马配置器

一般的远控或木马都有配置器,主要是为了方便木马的受控端的管理,至于配置器的编写有很多的方式,主要是直接修改原始的受控端的程序,有的方式是把受控端和配置信息都放到控制端程序的内部,在需要配置受控端的时候直接输入配置信息,生成受控端;也有的方式是在外部直接修改未配置信息的受控端程序。

下面我先介绍与实现第二种方式:

为了演示这种反方式,我编写了一个受控端demo程序:

#include "stdafx.h"int main(int argc, char* argv[])
{char szIpAddress[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAA" ;char szPort[] =		 "BBBBBBBBBBBBBBBBBBBBBBBBBBBB" ;char szOtherInfo[] = "CCCCCCCCCCCCCCCCCCCCCCCCCCCC" ;printf("IP:%s\nPort:%s\nOther Information:%s\n" , szIpAddress , szPort , szOtherInfo  ) ;getchar() ;return 0;
}

这个程序很简单,主要是为了演示。在程序中有三个内存区块分别存放的是IP信息,端口信息以及其他信息,我们的目的就是修改这三个区块,把我们需要的IP和端口等信息替换到这三个部分。

我们先看看这个程序的机器码,使用C32ASM这个工具:


我们可以看到这三个内存区块在这个可执行程序中的情况。

修改这个exe程序的思路很简单,就是直接读取这个映像文件,然后进行匹配,这也是我们为何把这个是三个区块的消初始值弄得这么特别的原因。


下面是整个程序的代码:

void CTest_pe_buildDlg::OnButtonOk() 
{// TODO: Add your control notification handler code hereUpdateData(true ) ;BOOL bRet = false ;char szIpAddress[20] ;char * pFileData ;DWORD d_FileSize ;strcpy( szIpAddress , (LPSTR)(LPCTSTR)m_szIpAddress ) ;CFileDialog dlg(TRUE,_T("exe"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("可执行文件|*.exe||"),this);char path[260];if(dlg.DoModal() == IDOK){CString t;t = dlg.GetPathName();strcpy( path,(LPSTR)(LPCTSTR)t );}else{return;}// 读出文件内容并写入HANDLE hFile = CreateFile(path,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) ;d_FileSize = GetFileSize( hFile , NULL ) ;pFileData = new char[d_FileSize + 1] ;bRet = ReadFile( hFile , pFileData ,  d_FileSize , &d_FileSize , NULL ) ;if( 0 == bRet ){return ;}// 替换目标可执行文件中的指定信息:IP port 以及其他的信息char szIpStr[]    = "AAAAAAAAAAAAAAAAAAAAAAAAAAAA" ;char szPortStr[]  = "BBBBBBBBBBBBBBBBBBBBBBBBBBBB" ;char szOtherStr[] = "CCCCCCCCCCCCCCCCCCCCCCCCCCCC" ;int nLength ;char * pDst ;int i = 0 ;nLength = sizeof( szIpAddress ) ;// 处理IP字符串while( true ){if( strcmp( szIpStr , pFileData + i ) == 0 ){break ;}else{i++ ;}}pDst = pFileData + i ;strcpy( pDst , (LPSTR)(LPCTSTR)m_szIpAddress ) ;i = 0 ;nLength = sizeof( szPortStr ) ;// 处理端口字符串while( true ){if( strcmp( szPortStr , pFileData + i ) == 0 ){break ;}else{i++ ;}}pDst = pFileData + i ;strcpy( pDst , (LPSTR)(LPCTSTR)m_szPort ) ;i = 0 ;nLength = sizeof( szOtherStr ) ;// 处理其他信息字符串while( true ){if( strcmp( szOtherStr , pFileData + i ) == 0 ){break ;}else{i++ ;}}pDst = pFileData + i ;strcpy( pDst , (LPSTR)(LPCTSTR)m_szOtherInfo ) ;CloseHandle( hFile ) ;// 保存文件内容到新的exe文件中CFileDialog dlg2(FALSE,_T("exe"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("可执行文件|*.exe||"),this);char path2[260];if(dlg2.DoModal() == IDOK){CString t;t = dlg2.GetPathName();strcpy( path2,(LPSTR)(LPCTSTR)t );}else{return;}HANDLE hFile2 = CreateFile(path2,GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL) ;bRet = WriteFile( hFile2 , pFileData , d_FileSize , &d_FileSize , NULL ) ;if( bRet == 0 ){return ;}CloseHandle( hFile2 ) ;
}

下面我们看一看运行结果:

(1)控制端配置对话框,输入配置信息,如下:

(2)程序会让用户选择要配置的受控端的位置,使用的是打开对话框:

(3)在程序中修改成功了会弹出保存对话框,让用户选择把修改后的程序存放在哪一个地方,如下:

(4)下面是修改前的受控端的运行情况,可以看到是初始值:

(5)下面是修改后保存为2.exe程序的运行情况,可以看到已经修改完成了。

(6)我们再使用C32ASM这个工具打开2.exe程序,可以看到其的确是被修改了。



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部