我是靠谱客的博主 现代大雁,最近开发中收集的这篇文章主要介绍线程代码注入 无dll版本,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


//远程线程需要的数据
typedef  struct __shared
{
	//kernel32
	DWORD loadlib;
	DWORD getprocaddr;
	DWORD getmodulefilename;

	//user32
	char user32dll[20];
	char msgbox[20];
	char output[20];
} shared;

//远程线程代码
DWORD  __stdcall  rthread(void * param)
{
    //函数定义
	typedef HMODULE(WINAPI *LoadLibFunc)(LPCSTR);
	typedef FARPROC(WINAPI * GetProcAddrFunc)(HMODULE,LPCSTR);
	typedef DWORD(WINAPI *GetModuleFileNameFunc)(HMODULE, LPSTR, DWORD);
	typedef int(WINAPI * MsgBoxFunc)(HWND,LPSTR,LPSTR,UINT);

	shared * pshared = (shared*)param;
    //LoadLibraryA
	LoadLibFunc LoadLib = (LoadLibFunc)pshared->loadlib;

    //GetProcAddress
	GetProcAddrFunc procFunc = (GetProcAddrFunc)pshared->getprocaddr;

    //GetModuleFileNameA
	GetModuleFileNameFunc moduleName = (GetModuleFileNameFunc)pshared->getmodulefilename;
	char filename[MAX_PATH];
	moduleName(NULL, filename, MAX_PATH);

    //加载user32
	HMODULE hUser32 = LoadLib(pshared->user32dll);
	MsgBoxFunc msgBox = (MsgBoxFunc)procFunc(hUser32, pshared->msgbox);
	msgBox(NULL, pshared->output, filename, MB_OK);
	

	return 0;
}
void test_remote3(DWORD pid)
{
	HANDLE hPro = OpenProcess(PROCESS_CREATE_THREAD |
		PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE,
		FALSE, pid
		);
	if (INVALID_HANDLE_VALUE == hPro)
		return;
	shared sh = {0};

    //获取kernel32 中的函数地址
	sh.loadlib = (DWORD)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")),"LoadLibraryA");
	sh.getprocaddr = (DWORD)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "GetProcAddress");
	sh.getmodulefilename = (DWORD)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "GetModuleFileNameA");

    //复制线程中使用的模块和函数
	strcpy(sh.user32dll, "user32.dll");
	strcpy(sh.msgbox, "MessageBoxA");
	strcpy(sh.output, "hey,fuck u");

    //申请内存页
	void* alloc = VirtualAllocEx(hPro, NULL, sizeof(shared), MEM_COMMIT, PAGE_READWRITE);
	printf("alloc:%pn", alloc);
	DWORD writeBytes = 0;
        
    //把数据写入对方进程中
	BOOL ret = WriteProcessMemory(hPro, alloc, (void*)&sh, sizeof(shared), &writeBytes);
	printf("writebytes : %d, ret:%dn", writeBytes, ret);

	DWORD codeSize = 1<<15;

    //申请线程代码块的空间
	void *lpcode = VirtualAllocEx(hPro, NULL,codeSize ,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
	printf("lpcode:%pn", lpcode);
	ret = WriteProcessMemory(hPro, lpcode,&rthread, codeSize, &writeBytes);
	printf("writebytes:%d , ret = %dn ", writeBytes, ret);
	if (!ret){
		printf("err:%dn", GetLastError());
	}
	HANDLE th = CreateRemoteThread(hPro, NULL, 0, 
		(LPTHREAD_START_ROUTINE)lpcode, alloc, 0, NULL);
	if (INVALID_HANDLE_VALUE == th){
		printf("thread :%pn", th);
	}
	WaitForSingleObject(th, -1);
}

 

最后

以上就是现代大雁为你收集整理的线程代码注入 无dll版本的全部内容,希望文章能够帮你解决线程代码注入 无dll版本所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部