你的位置:首页 > 软件开发 > 操作系统 > 使用CreateRemoteThread把代码远程注入指定exe执行

使用CreateRemoteThread把代码远程注入指定exe执行

发布时间:2015-11-17 13:00:09
由于本人也是新手,如果有朋友不懂windows api相关知识,我相信查阅书籍或者百度会比我说有帮助的多,下面就我所做简单复述一下过程。效果图示如下:做的这个例子首先是创建了一个MFC 对话框程序,然后自己创建了一个 带有导出函数 (简单的减法) 的DLL , 这个Calc按键就 ...

使用CreateRemoteThread把代码远程注入指定exe执行

由于本人也是新手,如果有朋友不懂windows api相关知识,我相信查阅书籍或者百度会比我说有帮助的多,下面就我所做简单复述一下过程。

效果图示如下:

做的这个例子首先是创建了一个MFC 对话框程序,然后自己创建了一个 带有导出函数 (简单的减法) 的DLL , 这个Calc按键就是调用自己DLL里面的减法函数 计算1 - 1, 其次创建一个拥有能够修改进程中某函数的入口代码功能的DLL(为什么是DLL,网上有大量详细的资料,), 然后我们还创建一个windows控制台程序 也就是 调用CreateRemoteThread  让Calc 加载我们准备好的DLL(修改函数入口代码), 因为DLL被加载时我们可以在DLLMain中指定要执行的代码。

未注入代码之前:

使用CreateRemoteThread把代码远程注入指定exe执行

 

执行我的 注入程序createremotethread.exe 之后 如下图:

 

使用CreateRemoteThread把代码远程注入指定exe执行

可以看到注入成功了, 注入的是什么呢? 这就是 CreateRemoteThread的作用了, 我们向Calc.exe 注入了一个线程,然后这个线程执行了LoadLibrary 函数,

我告诉Calc 要Load 我指定的 DLL, 为什么呢? 因为 我指定的这个DLL 是我们自己创建的, 它里面的函数代码能找到Calc进程中 原来sub函数的地址,然后并

修改sub函数地址处的入口代码,也就是改成 jmp xxx 使Calc 执行我们指定的代码。

 

最重要的CreateRemoteThread:

  HANDLE hThread;  char szLibPath[_MAX_PATH] = "E:\\vs2010project\\InjectDll\\Release\\InjectDll.dll"; //指定注入之后目标进程要加载的DLL  DWORD hLibModule;  HANDLE hProcess = NULL;  hProcess = GetProcessByName("Calc.exe");  DWORD ERRO = GetLastError();  if(hProcess == NULL)    return 0;  HMODULE modHandle = GetModuleHandle(_T("Kernel32")); //因为kernel32 每一个windows程序进程空间中都有 所以让他调用LOADLIBRARY不成问题void* pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(szLibPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE);  LPTHREAD_START_ROUTINE addr = (LPTHREAD_START_ROUTINE)GetProcAddress(modHandle, "LoadLibraryA");  WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath, sizeof(szLibPath), NULL);   hThread = CreateRemoteThread(hProcess, NULL, 0,                addr,                pLibRemote,                0,                NULL);    WaitForSingleObject(hThread, INFINITE);  CloseHandle(hThread);
//修改mySub入口处代码void modify(){ assert(hProcess != NULL); DWORD dwTemp=0; DWORD dwOldProtect; VirtualProtectEx(hProcess, pfar_sub, 5, PAGE_READWRITE, &dwOldProtect); //将内存保护模式改为可读写,原保护模式保存入dwOldProtect WriteProcessMemory(hProcess, pfar_sub, NewCode, 5, 0); VirtualProtectEx(hProcess, pfar_sub, 5, dwOldProtect, &dwTemp); //恢复内存保护模式}int new_sub(int x,int y){ return 1;}int inject(){ DWORD dwPid = ::GetCurrentProcessId(); hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid); int addr_farpointer = 0; //获取add.dll中的add()函数 HMODULE hmod = ::LoadLibrary(_T("E:\\vs2010project\\My_Sub\\Debug\\My_Sub.dll")); mySub = (getsub)::GetProcAddress(hmod, "mySub"); pfar_sub=(FARPROC)mySub; addr_farpointer = (int)pfar_sub; if (pfar_sub == NULL) { MessageBox(NULL, TEXT("no locate add!!"), TEXT("info"), MB_OK); return FALSE; } NewCode[0] = 0xe9;//0xe9 == jmp _asm { lea eax, new_sub mov ebx, pfar_sub sub eax, ebx sub eax, 5 mov dword ptr [NewCode + 1],eax } modify(); MessageBox(NULL, TEXT("Modified SUCCESSFULLY!!"), TEXT("info"), MB_OK); return TRUE;}

原标题:使用CreateRemoteThread把代码远程注入指定exe执行

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录