- 浏览: 2037146 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
进程注入的研究与实现(上)
为了对内存中的某个进程进行操作,并且获得该进程地址空间里的数据,或者修改进程的私有数据结构,必须将自己的代码放在目标进程的地址空间里运行,这时就避免不了使用进程注入方法了。
进程注入的方法分类如下:
带DLL的注入
利用注册表注入
利用Windows Hooks注入
利用远程线程注入
利用特洛伊DLL注入
不带DLL的注入
直接将代码写入目标进程,并启动远程线程
1. 利用注册表注入
在Windows NT/2000/XP/2003中,有一个注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs。当某个进程加载User32.dll时,这里面列出的所有的DLL都将User32.dll利用LoadLibrary函数加载到该进程空间中。我们可以把自己的代码放在一个DLL中,并加入该键值,这样就可以注入到所有使用User32.dll的进程中了。
当DLL以LoadLibrary的方式加载时,DllMain会被以DLL_PROCESS_ATTACH为原因调用,实际上我们也只需要关心DLL_PROCESS_ATTACH
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { HANDLE f = CreateFile(L"D:\\InjectSuccess.txt", FILE_ADD_FILE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); CloseHandle(f); } return TRUE; }
2. 利用Windows Hooks注入
Windows系统给我们提供了一些挂钩函数,使得被挂钩的进程可以在自己处理接收到的消息之前,先执行我们的消息处理函数,而这个消息处理函数一般会放在DLL中,来让目标进程加载,这实际上已经达到了注入代码的效果。
一般情况下,我们把挂钩函数和消息处理函数都放在dll中:
HHOOK g_hHook = NULL; HINSTANCE hInst; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { hInst = (HINSTANCE)hModule; return TRUE; } LRESULT myKeyBrdFuncAd (int code, WPARAM wParam, LPARAM lParam) { // To be nice, your rootkit should call the next-lower // hook, but you never know what this hook may be. //::MessageBoxA(NULL, "Hello Injection", "Injection", MB_OK); return CallNextHookEx(g_hHook, code, wParam, lParam); } #ifdef __cplusplus // If used by C++ code, extern "C" { // we need to export the C interface #endif __declspec(dllexport) bool SetHook(DWORD dwThreadId) { g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)myKeyBrdFuncAd, hInst, dwThreadId); if (g_hHook == NULL) { return false; } return true; } #ifdef __cplusplus } #endif
注入进程要加载这个DLL,然后执行里面的SetHook函数,传入的参数为被注入线程的ID
typedef bool (*MYPROC) (DWORD dwThreadId); ...... HANDLE hLib = LoadLibraryA("D:\\source\\rootkits\\injecting\\InjectDll\\Debug\\InjectDll.dll"); if (hLib == NULL) { printf("LoadLibrary Error!\n"); } MYPROC myProc = (MYPROC)GetProcAddress((HMODULE)hLib,"SetHook"); if (myProc != NULL) { if ((*myProc)((DWORD)4860) == false) { printf("loose: %d", GetLastError()); } } else { printf("GetProcAddress error: %d", GetLastError()); }
3. 利用远程线程注入DLL
1)、取得远程进程的进程ID;
2)、在远程进程空间中分配一段内存用来存放要注入的DLL完整路径;
3)、将要注入的DLL的路径写到刚才分配的远程进程空间;
4 )、从Kernel32.dll中取得LoadLibray的地址;
5)、调用CreateRemoteThread函数以从Kernel32.dll中取得的LoadLibrary函数的地址为线程函数的地址,以我们要注入的DLL文件名为参数,创建远程线程;
在第二三步中,为什么要把我们要注入的DLL的文件名写到远程进程的地址空间进行操作,《WINDOWS核心编程》中是这样描述的:
“(要注入的DLL文件名)字符串是在调用进程的地址空间中。该字符串的地址已经被赋予新创建的远程线程,该线程将它传递给L o a d L i b r a r y A。但是,当L o a d L i b r a r y A取消对内存地址的引用时, D L L路径名字符串将不再存在,远程进程的线程就可能引发访问违规”;
至于第四步中为什么不直接对LoadLibrary进行调用,《WINDOWS核心编程》中是这样描述的:
“如果在对C r e a t e R e m o t e T h r e a d的调用中使用一个对L o a d L i b r a r y A的直接引用,这将在你的模块的输入节中转换成L o a d L i b r a r y A的形实
替换程序的地址。将形实替换程序的地址作为远程线程的起始地址来传递,会导致远程线程开始执行一些令人莫名其妙的东西。其结果很可能造成访问违规。”
我在DLL中只是做一些简单的处理以显示注入成功。
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { hInst = (HINSTANCE)hModule; if (ul_reason_for_call == DLL_PROCESS_ATTACH) { HANDLE f = CreateFile(L"D:\\InjectSuccess.txt", FILE_ADD_FILE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); CloseHandle(f); hInst = (HINSTANCE)hModule; } return TRUE; }
按照上面的4个步骤,注入进程的代码如下:
LPWSTR lpszLibName = L"D:\\source\\rootkits\\injecting\\InjectDll\\Debug\\InjectDll.dll"; HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE,FALSE, 3256); LPWSTR lpszRemoteFile = (LPWSTR)VirtualAllocEx(hProcess, NULL, sizeof(WCHAR) * lstrlenW(lpszLibName) + 1, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess, lpszRemoteFile,(PVOID)lpszLibName, sizeof(WCHAR) * lstrlenW(lpszLibName) + 1, NULL); PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "LoadLibraryW"); HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, // LoadLibrary地址 lpszRemoteFile, // 要加载的DLL名 0, NULL);
在上面的过程中,实际上我们做了一个假设,就是所有进程中的kernel32.dll和user32.dll都被映射到了同一段虚拟地址上。
4. 利用特洛伊DLL进行注入
这种方法的原理就是由自己写一个与原有进程调用的DLL具有相同接口函数的DLL,再用我们的DLL替换原有的DLL。在替换的过程中,由我们自己编写感兴趣的函数替换原有函数,而对其它不感兴趣的函数,则以函数转发的形式调用原有DLL中的函数。这里面有个前提,就是你在编写DLL时你必须知道原有DLL中的函数都有哪些,以免导至其它进程调用DLL时找不到相应的API函数,特别是在替换系统DLL文件时更要小心。
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1593__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2926解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1654RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1482使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1220使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20331、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1519防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5273// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1805VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3735深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4018原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3155获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7879VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18175SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1960解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7990字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115581.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2342下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1548BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2469对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ...
相关推荐
### 进程注入的研究与实现 #### 概述 进程注入是计算机安全领域的一个重要概念,主要用于调试、监控以及恶意软件开发等场景。通过进程注入技术,可以将一段代码或库(如DLL)插入到另一个正在运行的进程中,进而...
### 进程注入的研究与实现 #### 一、概述 进程注入是一种技术手段,通过它可以在其他进程中执行自己的代码或DLL。这种技术广泛应用于软件开发、调试、安全测试以及恶意软件开发等领域。根据不同的实现机制,进程...
进程注入是一种技术,它允许一个进程的代码在另一个进程中运行,从而实现跨进程通信或对目标进程进行监控、调试或篡改。这种技术在软件开发、调试和恶意软件中都有应用,但通常需要谨慎处理,因为不恰当的使用可能会...
同时,你需要编写用户空间的程序与这个内核驱动交互,实现进程注入的操作。 总的来说,这个工具为高级Linux开发者提供了一个强大的手段,能够进行深度系统操作,但也要求使用者具备相当的技能和谨慎,因为误操作...
总的来说,这个项目提供了一个学习和研究进程注入技术的机会,特别是对于C++开发者来说,它可以帮助理解如何在实际环境中操作和控制其他进程。不过,要注意的是,进程注入技术也可能被滥用,例如在恶意软件中,因此...
游戏外挂是指修改游戏规则或增强玩家能力的非法程序,它们通常利用进程注入技术在游戏进程中插入代码,以实现诸如自动瞄准、透视、无限生命等功能。这种行为不仅破坏了游戏的公平性,也违反了游戏公司的用户协议,...
监视新进程注入(Monitoring New Process Injection)则是连环注入的一种变体,主要目标是检测和控制其他进程中的注入行为。 连环注入的核心在于分步骤地执行注入操作,每个步骤都可能涉及不同的注入技术,如DLL...
在进程注入中,如果注入的代码包含获取更高权限的逻辑,就可能实现提权。这在系统安全中是个严重问题,因为一旦攻击者获得管理员权限,他们可以访问系统的所有资源,进行恶意操作。 这些技术在系统调试、软件开发、...
在实际应用中,进程间注入可能用于测试、调试、安全研究甚至恶意行为。例如,开发者可能会使用它来测试某个服务在被注入代码后的行为,或者在不修改原应用代码的情况下增强其功能。但是,不恰当的使用可能导致隐私...
远程进程注入的技术有多种,如使用API钩子、使用SetWindowsHookEx函数、利用CreateRemoteThread函数等。其中,CreateRemoteThread是最常见的一种方法,它直接在目标进程中创建一个新线程,该线程从指定的内存地址...
2. **Windows API**:在Windows平台上,实现进程注入通常会用到一些特定的API函数,如`CreateProcess`创建新进程,`OpenProcess`获取已有进程的句柄,`VirtualAllocEx`在目标进程中分配内存,`WriteProcessMemory`...
综上所述,"进程注入小工具"是一个用于学习和实践DLL注入技术的实用程序,可以帮助开发者了解和掌握Windows系统下的底层编程,尤其是在进程控制和钩子技术方面的应用。同时,它也是进行软件测试和调试的强大辅助工具...
本资源“易语言源码易语言创建进程注入DLL源码.rar”提供了一种使用易语言实现进程注入DLL技术的示例代码,这对于理解和学习易语言以及系统级别的编程概念非常有帮助。 首先,我们需要理解什么是进程注入。进程注入...
对于开发者而言,它允许他们以代码注入的方式,快速实现程序功能的动态扩展和优化,同时通过进程管理功能,对这些被注入的进程进行精确控制和状态监控,从而在开发和测试阶段更加高效地进行问题定位和性能调试。...
**进程注入工具DllInject详解** 进程注入是一种在计算机科学领域广泛应用的技术,主要用于改变或扩展一个正在运行的进程的行为。DllInject工具就是实现这一技术的一种实用软件。它允许用户将动态链接库(DLL)注入...
在IT领域,Windows进程注入是一种技术,用于将代码或数据注入到另一个正在运行的Windows进程中。...不过,要注意,未经授权的进程注入行为是违反法律的,只应在合法和透明的环境中进行研究和应用。
在易语言中进行进程注入,主要涉及以下几个步骤: 1. **打开进程**:使用`OpenProcess` API函数获取目标进程的句柄,这需要进程的PID(进程标识符)和适当的访问权限。 2. **分配内存**:使用`VirtualAllocEx` API...
手工DLL注入检测方法的研究与实现,主要是针对数据防泄漏的一种技术手段。DLL注入是一种常见的技术手段,通过将动态链接库(Dynamic Link Library,DLL)加载到另一个程序的地址空间中,从而在不重新编译的情况下...
综上所述,这是一个涉及内核编程、进程注入、DLL注入和Ring3函数Hook的复杂系统。这种技术通常用于系统监控、性能分析、安全检测等领域,但同时也可能被滥用,用于创建恶意软件。理解和掌握这些技术对于系统级程序员...