首页
社区
课程
招聘
[求助](问题已解决)写了一段无dll的远程线程注入代码,可是为什么每次注入都会引发被注入程序的崩溃?一直没有找到原因,请大家帮个忙,谢谢!
发表于: 2018-8-18 19:35 5526

[求助](问题已解决)写了一段无dll的远程线程注入代码,可是为什么每次注入都会引发被注入程序的崩溃?一直没有找到原因,请大家帮个忙,谢谢!

2018-8-18 19:35
5526
代码更新:已关闭GS检查,64位编译与目标系统Win7 64bits 匹配,代码改为在目标进程中LoadLibrary,但是依然崩溃 QAQ ...
问题已解决:64位系统的内存地址应按64位存储,不能使用32位的DWORD类型存储,可改用LPVOID类型自适应系统给位元,代码已修改。

//////////////////////////////
//
// FileName : InjectProcess.cpp
// Creator : PeterZheng
// Date : 2018/8/18 0:35
// Comment : Inject Process Without Dll File
//
//////////////////////////////

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <string.h>
#include <windows.h>
#include <strsafe.h>
#include <tlhelp32.h>

#define MAX_LENGTH 50
#define NORMAL_LENGTH 20
#pragma warning(disable:4996)

using namespace std;

typedef struct _RemoteParam
{
	CHAR szOperation[NORMAL_LENGTH];
	CHAR szAddrerss[MAX_LENGTH];
	CHAR szLb[NORMAL_LENGTH];
	CHAR szFunc[NORMAL_LENGTH];
	LPVOID dwMLAAdress;
	LPVOID dwMGPAAddress;
	LPVOID dwSEAddress;
}RemoteParam;

DWORD WINAPI ThreadProc(RemoteParam *lprp)
{
	typedef HMODULE(WINAPI *MLoadLibraryA)(IN LPCTSTR lpFileName);
	typedef FARPROC(WINAPI *MGetProcAddress)(IN HMODULE hModule, IN LPCSTR lpProcName);
	typedef HINSTANCE(WINAPI *MShellExecuteA)(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
	MLoadLibraryA MLA;
	MGetProcAddress MGPA;
	MShellExecuteA MSE;
	MLA = (MLoadLibraryA)lprp->dwMLAAdress;
	MGPA = (MGetProcAddress)lprp->dwMGPAAddress;
	lprp->dwSEAddress = (LPVOID)MGPA(MLA(lprp->szLb), lprp->szFunc);
	MSE = (MShellExecuteA)lprp->dwSEAddress;
	MSE(NULL, lprp->szOperation, lprp->szAddrerss, NULL, NULL, SW_SHOWNORMAL);
	return 0;
}

DWORD GetProcessID(CHAR *ProcessName)
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(pe32);
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE)
	{
		printf("CreateToolhelp32Snapshot error");
		return 0;
	}
	BOOL bProcess = Process32First(hProcessSnap, &pe32);
	while (bProcess)
	{
		if (strcmp(strupr(pe32.szExeFile), strupr(ProcessName)) == 0)
			return pe32.th32ProcessID;
		bProcess = Process32Next(hProcessSnap, &pe32);
	}
	CloseHandle(hProcessSnap);
	return 0;
}

int EnableDebugPriv(const TCHAR *name)
{
	HANDLE hToken;
	TOKEN_PRIVILEGES tp;
	LUID luid;
	if (!OpenProcessToken(GetCurrentProcess(),
		TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
		&hToken))
	{
		printf("OpenProcessToken error\n");
		return 1;
	}
	if (!LookupPrivilegeValue(NULL, name, &luid))
	{
		printf("LookupPrivilege error!\n");
		return 1;
	}
	tp.PrivilegeCount = 1;
	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	tp.Privileges[0].Luid = luid;
	if (!AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
	{
		printf("AdjustTokenPrivileges error!\n");
		return 1;
	}
	return 0;
}

BOOL InjectProcess(const DWORD dwPid)
{
	if (EnableDebugPriv(SE_DEBUG_NAME)) return FALSE;
	HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
	if (!hWnd) return FALSE;
	RemoteParam rp;
	ZeroMemory(&rp, sizeof(RemoteParam));
	rp.dwMLAAdress = (LPVOID)GetProcAddress(LoadLibrary("Kernel32.dll"), "LoadLibraryA");
	rp.dwMGPAAddress = (LPVOID)GetProcAddress(LoadLibrary("Kernel32.dll"), "GetProcAddress");
	StringCchCopy(rp.szLb, sizeof(rp.szLb), "Shell32.dll");
	StringCchCopy(rp.szFunc, sizeof(rp.szFunc), "ShellExecuteA");
	StringCchCopy(rp.szAddrerss, sizeof(rp.szAddrerss), "https://www.baidu.com");
	StringCchCopy(rp.szOperation, sizeof(rp.szOperation), "open");
	RemoteParam *pRemoteParam = (RemoteParam *)VirtualAllocEx(hWnd, 0, sizeof(RemoteParam), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (!pRemoteParam) return FALSE;
	if (!WriteProcessMemory(hWnd, pRemoteParam, &rp, sizeof(RemoteParam), 0)) return FALSE;
	LPVOID pRemoteThread = VirtualAllocEx(hWnd, 0, 1024 * 4, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (!pRemoteThread) return FALSE;
	if (!WriteProcessMemory(hWnd, pRemoteThread, &ThreadProc, 1024 * 4, 0)) return FALSE;
	HANDLE hThread = CreateRemoteThread(hWnd, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, (LPVOID)pRemoteParam, 0, NULL);
	if (!hThread) return FALSE;
	return TRUE;
}

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
	CHAR szProcName[MAX_LENGTH] = "\0";
	StringCchCopy(szProcName, MAX_LENGTH, "explorer.exe");
	InjectProcess(GetProcessID(szProcName));
	ExitProcess(0);
	return 0;
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-8-19 20:11 被PeterZheng编辑 ,原因: 更新
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 217
活跃值: (134)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
代码看似没问题.
你这种函数作为shellcode的,最好不要用debug模式,优化模式要设置一下
写入大小=ThreadProc-GetProcessID
这试试吧
2018-8-18 21:44
0
雪    币: 1110
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在win7 64bits上LoadLibrary("Shell32.dll")报5号Windows Error(拒绝访问),但并不知道为什么。。。
2018-8-18 22:12
0
雪    币: 7527
活跃值: (5362)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
其实,你CE查看一下汇编,你会发现代码尾部有一个莫名其妙的CALL,这个叫安全检查CALL.
你要直接COPY函数作为shellcode,那你就关了安全检查,要不就自己搜索最后一个E8,改成5个NOP.
2018-8-18 22:28
0
雪    币: 8188
活跃值: (2842)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
/GS-
2018-8-18 22:33
0
雪    币: 345
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
你这直接拷贝函数体过去直接用很容易就有问题,最好自己写一下裸函数啥的,我一般这么拷贝都是写asm
2018-8-18 23:23
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
虽然在我vs08中编译 ThreadProc 没有调用checkesp,但最好还是将 缓冲区安全检查设置 否(/GS-)。
另外注意两个问题:
1. 你编译的程序为数,跟你 explorer.exe 是一致的,不然32位注入64位或者64位注入32位都是直接崩的。
2. shell32.dll 里面的 ShellExecuteA地址确定应该是
     枚举远程进程的shell32.dll模块地址 + (注入模块的ShellExecuteA地址 - 注入程序的shell32.dll模块地址)
2018-8-18 23:24
0
雪    币: 746
活跃值: (3395)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
8
64位系统的explorer肯定是64位的,所以你的程序也是64位编译的。
64位的指针你为何要转成DWORD?不崩才怪呢。
rp.dwMLAAdress = (DWORD)GetProcAddress(LoadLibrary("Kernel32.dll"), "LoadLibraryA");
建议使用ULONG_PTR或者LPVOID,自适应32/64系统长度。
2018-8-19 10:31
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
饭要一口一口吃,
先将你的代码弄成注入自己的进程中,这样方便自己看asm代码调试.
用x64dbg慢慢自己调试吧,不懂汇编?那,bug可就够你喝一壶的了
2018-8-19 14:05
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看不到生成的汇编代码,大家都是瞎猜的,
实际情况怎么回事,天知道了!
2018-8-19 14:06
0
雪    币: 1110
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
问题已解决,感谢8楼大佬,学艺不精,见笑!!64位系统内存索引应该是64位的,不能用DWORD。
2018-8-19 20:05
0
雪    币: 39
活跃值: (472)
能力值: ( LV9,RANK:155 )
在线值:
发帖
回帖
粉丝
13
感谢各位大佬指点 学到了
最后于 2018-8-20 10:23 被灬阑珊灬编辑 ,原因:
2018-8-20 10:22
0
雪    币: 746
活跃值: (3395)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
14
灬阑珊灬 感谢各位大佬指点 学到了
见过画眉大佬请大佬多多关照!
2018-8-20 10:25
0
游客
登录 | 注册 方可回帖
返回
//