赞!VC++编程创建远程线程式调用CALL_VirtualAllocEx_WriteProcessMemory_CreateRemoteThread_WaitForSingleObject

16!VC++编程创建远程线程式调用CALL

借箭源码:14.解密!远程CALL调用代码实现原理。

VirtualAllocEx 在指定进程里申请一块内存

LPVOID WINAPI VirtualAllocEx(

  __in      HANDLE hProcess, //进程句柄

  __in_opt  LPVOID lpAddress, //指定分配的内存地址 NULL 自动

  __in      SIZE_T dwSize, //分配内存大小

  __in      DWORD flAllocationType, //MEM_COMMIT |MEM_RESERVE

  __in      DWORD flProtect  //PAGE_EXECUTE_READWRITE  可读可写权限

);

MEM_COMMIT:为特定的页面区域分配内存中或磁盘的页面文件中的物理存储

MEM_RESERVE:保留进程的虚拟地址空间,而不分配任何物理存储。

返回的是 一块申请到的内存地址

WriteProcessMemory  向内存写入数据

BOOL WINAPI WriteProcessMemory(

  __in   HANDLE hProcess, //进程句柄

  __in   LPVOID lpBaseAddress,//要写入数据的内存地址

  __in   LPCVOID lpBuffer,//要写入的数据

  __in   SIZE_T nSize, //要写入的大小

  __out  SIZE_T *lpNumberOfBytesWritten //实际写入大小。NULL

);

写入成功返回 TRUE

CreateRemoteThread  创建远程线程

HANDLE WINAPI CreateRemoteThread(

  __in   HANDLE hProcess,   //进程句柄

  __in   LPSECURITY_ATTRIBUTES lpThreadAttributes,//安全结构指针 NULL

  __in   SIZE_T dwStackSize,  //无参数的CALL 填写0

  __in   LPTHREAD_START_ROUTINE lpStartAddress, //调用的CALL

  __in   LPVOID lpParameter, //传递参数的指针 NULL stdcall

  __in   DWORD dwCreationFlags, //0 线程创建后立即执行

  __out  LPDWORD lpThreadId  //输出一个 线程ID。&lpTId

);

返回值为null 创建进程失败

//VC以裸函数的形式内联汇编

__declspec(naked) void Fun()

{

 __asm

 {

  ....//汇编代码

 }

}

在函数名前声明__declspec(naked),表示以裸函数的形式内联汇编,裸函数是指编译器生成汇编代码时不添加任何额外的指令,对于一般的函数调用,编译器都会自动生成函数初始化代码,如压入和弹出

ebp指针,分配和清理局部变量等。

WaitForSingleObject   等待线程结束

DWORD WINAPI WaitForSingleObject(

  __in  HANDLE hHandle,  //线程句柄

  __in  DWORD dwMilliseconds  //INFINITE 无限-1

);

// #define INFINITE            0xFFFFFFFF  // Infinite timeout 无限超时

VirtualFreeEx 释放内存

BOOL WINAPI VirtualFreeEx(

  __in  HANDLE hProcess, //进程句柄

  __in  LPVOID lpAddress, //要释放的内存地址

  __in  SIZE_T dwSize, //释放内存大小

  __in  DWORD dwFreeType // MEM_RELEASE 释放指定页。这里填写这值,那么dwSize必须为0否则函数会调用失败。

);

CloseHandle 关闭句柄

BOOL WINAPI CloseHandle(

  __in  HANDLE hObject  //要关闭的句柄,进程句柄 or线程句柄等

);

mfc------------------------------------------------------------------

__declspec(naked) void beibaoyongwupincall()
{
	__asm
	{
			push ebx
			push 4
			push 1
			push 0
			mov eax, 0x007C00B0
			call eax
			pop ebx
			ret
	}
}
void chuangjianyuanchengxiancheng()//创建远程线程
{
	SIZE_T xierudaxiao = 0;
	LPVOID calldizhi1 = ::VirtualAllocEx(jinchengjubing, NULL, 0x40900, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (calldizhi1 == NULL)
	{
		AfxMessageBox(L"内存申请失败");
	}
	BOOL a = WriteProcessMemory(jinchengjubing, calldizhi1, beibaoyongwupincall, 0x40900, &xierudaxiao);
	if (a == 0)
	{
		AfxMessageBox(L"数据写入失败");
	}
	DWORD id_xiancheng = 0;
	HANDLE xianchengjubing = ::CreateRemoteThread(jinchengjubing, NULL, 0, (LPTHREAD_START_ROUTINE)calldizhi1, NULL, 0, &id_xiancheng);//创建远程线程
		if (xianchengjubing==0)
		{
			AfxMessageBox(_T("创建远程线程失败"));
		}
		WaitForSingleObject(xianchengjubing, INFINITE);
		VirtualFreeEx(jinchengjubing, calldizhi1, 0, MEM_RELEASE);
}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 示例代码:#include <windows.h> #include <stdio.h> #include <tlhelp32.h> // 远程线程注入dll BOOL InjectDLL(DWORD dwPID, char *szDLLName); int main(int argc, char *argv[]) { printf("远程线程注入dll演示程序\n"); if (argc == 3) { DWORD dwPID = atoi(argv[1]); char *szDLLName = argv[2]; InjectDLL(dwPID, szDLLName); } else { printf("用法:InjectDLL.exe <PID> <DLLName>\n"); } return 0; } // 远程线程注入dll BOOL InjectDLL(DWORD dwPID, char *szDLLName) { HANDLE hProcess, hThread; LPVOID lpBaseAddress; LPTHREAD_START_ROUTINE lpStartAddress; DWORD dwSize, dwThreadId; char szPath[256]; char szBuffer[1024]; // 打开进程 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID); if (hProcess == NULL) { printf("OpenProcess() Error: %d\n", GetLastError()); return FALSE; } // 获取DLL的完整路径 GetFullPathName(szDLLName, 256, szPath, NULL); // 在进程中申请虚拟内存 dwSize = strlen(szPath) + 1; lpBaseAddress = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE); if (lpBaseAddress == NULL) { printf("VirtualAllocEx() Error: %d\n", GetLastError()); return FALSE; } // 将DLL路径写入到虚拟内存 int nBytesWritten; WriteProcessMemory(hProcess, lpBaseAddress, szPath, dwSize, &nBytesWritten); if (nBytesWritten != dwSize) { printf("WriteProcessMemory() Error: %d\n", GetLastError()); return FALSE; } // 加载Kernel32.dll HMODULE hKernel32 = GetModuleHandle("Kernel32"); if (hKernel32 == NULL) { printf("GetModuleHandle() Error: %d\n", GetLastError()); return FALSE; } // 获取LoadLibraryA函数地址 lpStartAddress = GetProcAddress(hKernel32, "LoadLibraryA"); if (lpStartAddress == NULL) { printf("GetProcAddress() Error: %d\n", GetLastError()); return FALSE; } // 创建远程线程 hThread = CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, lpBaseAddress, 0, &dwThreadId); if (hThread == NULL) { printf("CreateRemoteThread() Error: %d\n", GetLastError()); return FALSE; } // 等待远程线程结束 WaitForSingleObject(hThread, INFINITE); // 读取线程退出码 DWORD dwExitCode; GetExitCodeThread(hThread, &dwExitCode); if (dwExitCode == 0) { printf("LoadLibrary() Error: %d\n", GetLastError()); return FALSE; } // 关闭句柄 CloseHandle(hProcess); CloseHandle(hThread); return TRUE; }我不能帮助你编写代码,但是我可以提供一些参考资料,帮助你编写远程线程注入dll代码。 ### 回答2: 远程线程注入DLL是一种技术,用于在目标进程中注入自定义的动态链接库(DLL)并执行其中的代码。以下是一个使用C语言编写的远程线程注入DLL的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { // 目标进程的进程ID DWORD pid = 1234; // 加载要注入的DLL路径 char dllPath[] = "C:\\path_to_dll\\mydll.dll"; // 获取目标进程句柄 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (hProcess == NULL) { printf("无法打开目标进程"); return -1; } // 在目标进程中为DLL路径分配内存 LPVOID dllPathAddr = VirtualAllocEx(hProcess, NULL, sizeof(dllPath), MEM_COMMIT, PAGE_READWRITE); if (dllPathAddr == NULL) { printf("无法在目标进程中分配内存"); CloseHandle(hProcess); return -1; } // 在目标进程中写入DLL路径 if (!WriteProcessMemory(hProcess, dllPathAddr, dllPath, sizeof(dllPath), NULL)) { printf("无法写入DLL路径到目标进程"); VirtualFreeEx(hProcess, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hProcess); return -1; } // 获取Kernel32.dll中LoadLibrary函数的地址 HMODULE kernel32 = GetModuleHandle("kernel32.dll"); FARPROC loadLibrary = GetProcAddress(kernel32, "LoadLibraryA"); // 创建远程线程在目标进程中执行LoadLibrary函数,将DLL路径作为参数 HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibrary, dllPathAddr, 0, NULL); if (hThread == NULL) { printf("无法在目标进程中创建远程线程"); VirtualFreeEx(hProcess, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hProcess); return -1; } // 等待远程线程执行结束 WaitForSingleObject(hThread, INFINITE); // 清理资源 VirtualFreeEx(hProcess, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hProcess); printf("远程线程注入DLL成功"); return 0; } ``` 这段代码首先通过`OpenProcess`函数打开目标进程,然后使用`VirtualAllocEx`在目标进程中为DLL路径分配内存,并使用`WriteProcessMemory`将DLL路径写入目标进程内存。接着,使用`GetModuleHandle`和`GetProcAddress`获取`LoadLibrary`函数的地址,然后使用`CreateRemoteThread`在目标进程中创建一个远程线程,让其执行`LoadLibrary`函数,将DLL路径作为参数传递给它。最后,使用`WaitForSingleObject`等待远程线程执行完毕,并释放之前分配的资源。 ### 回答3: 使用C语言编写远程线程注入DLL的代码可以通过以下步骤实现: 1. 首先,需要创建一个目标进程的句柄。可以使用`OpenProcess`函数来打开目标进程,并获得进程的句柄。 2. 接下来,需要在目标进程中分配一块内存空间,用于存储DLL的路径和名称。可以使用`VirtualAllocEx`函数在目标进程内部分配内存。 3. 在分配的内存空间中写入DLL的路径和名称。可以使用`WriteProcessMemory`函数将DLL的路径和名称写入到目标进程的内存中。 4. 使用`GetProcAddress`函数获取`LoadLibraryA`函数的地址,该函数用于加载DLL。可以使用`GetModuleHandle`函数获取kernel32.dll的句柄,然后再调用`GetProcAddress`函数来获取`LoadLibraryA`函数的地址。 5. 使用`CreateRemoteThread`函数在目标进程中创建一个远程线程,将`LoadLibraryA`函数地址作为线程的入口点,将DLL的路径和名称作为线程的参数传递。这样,在目标进程中就会自动加载并执行DLL。 完整的代码示例如下: ```c #include <windows.h> int main() { // Step 1: 打开目标进程句柄 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PROCESS_ID); // Step 2: 分配内存空间 LPVOID lpRemoteBuffer = VirtualAllocEx(hProcess, NULL, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); // Step 3: 写入DLL路径和名称 char dllPath[] = "C:\\path\\to\\dll.dll"; WriteProcessMemory(hProcess, lpRemoteBuffer, (LPVOID)dllPath, sizeof(dllPath), NULL); // Step 4: 获取LoadLibraryA函数地址 HMODULE hKernel32 = GetModuleHandleA("kernel32.dll"); FARPROC lpLoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA"); // Step 5: 创建远程线程注入DLL HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpLoadLibraryA, lpRemoteBuffer, 0, NULL); // 关闭句柄 CloseHandle(hThread); CloseHandle(hProcess); return 0; } ``` 以上就是使用C语言编写远程线程注入DLL的代码。请注意,使用远程线程注入DLL可能存在一些安全风险,请谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值