概述
//远程线程需要的数据
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版本所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复