- 浏览: 2031267 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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组件
进程注入的研究与实现(下)
5. 无DLL注入
在第三中方法中,我们启动远程线程时,线程函数是我们从Kernel32.dll中取得的LoadLibrary函数的地址为线程函数的地址,其实我们可以直接将线程函数体和函数参数写入目标进程的地址空间,然后创建远程线程。
使用这个方法时,需要注意以下几个问题:
(1) 远程线程函数体不得使用kernel32.dll,user32.dll以外的函数。因为这个两个模块在各个进程的相对地址是一样的,如果一定要使用其它函数,则必须将函数体写入目标进程空间。
(2) 不能使用任何字符串常量,因为字符串常量是存放在PE文件里.data这个段里面的,函数里保存的只是相对地址。
(3) 去掉编译器的/GZ编译选项,这个选项是用来Enable Stack Frame Run-Time Error Checking。当这个选项打开时,编译器会在每个函数中加入一些代码,用来检验ESP在函数体中是否被改变,但是这些检验函数的地址在不同PE文件中有可能是不一样的。
(4) 不得使用增量链接(incremental linking)。增量链接是编译器为了减少链接时间做的处理,把函数体用一个JMP指令代替,这样就可以随意改变函数的内容,而不用修改CALL指令。
(5) 不要在函数体内使用超过4kb的局部变量。局部变量是存放在栈中的,例如下面这个函数
void Dummy(void) {
BYTE var[256];
var[0] = 0;
var[1] = 1;
var[255] = 255;
}
在分配局部变量空间时是这样的
:00401000 push ebp
:00401001 mov ebp, esp
:00401003 sub esp, 00000100 ; change ESP as storage for
; local variables is needed
:00401006 mov byte ptr [esp], 00 ; var[0] = 0;
:0040100A mov byte ptr [esp+01], 01 ; var[1] = 1;
:0040100F mov byte ptr [esp+FF], FF ; var[255] = 255;
:00401017 mov esp, ebp ; restore stack pointer
:00401019 pop ebp
:0040101A ret
但是当局部变量的大小超过4kb时,栈指针并不直接改版,而是调用另一个函数来分配内存,这个函数有可能在不同进程中的地址不一样。
(6) 函数体内switch语句中的case不要超过3个,否则编译器会在PE文件中使用跳转表,而这个跳转表有可能在目标进程中并不存在。
下面是一个无DLL注入的例子:
//参数结构 ;
typedef struct _RemotePara{
PVOID dwMessageBox;
wchar_t strMessageBox[12];
}RemotePara;
// 远程线程执行体
DWORD __stdcall ThreadProc(RemotePara *Para)
{
typedef int (/*__stdcall*/ *PMessageBox) ( HWND , LPCTSTR , LPCTSTR , UINT );
PMessageBox MessageBoxFunc = (PMessageBox)Para->dwMessageBox;
MessageBoxFunc(NULL, Para->strMessageBox, Para->strMessageBox, MB_OK);
return 0 ;
}
DWORD THREADSIZE=1024;
DWORD pID = 4688;
DWORD byte_write;
HANDLE hRemoteProcess,hThread;
RemotePara myRemotePara,*pRemotePara;
void *pRemoteThread;
HINSTANCE hUser32 ;
hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);
if(!hRemoteProcess)return 0;
// 在远程进程地址空间分配虚拟内存
pRemoteThread = VirtualAllocEx(hRemoteProcess, 0, THREADSIZE, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(!pRemoteThread)return 0;
// 将线程执行体ThreadProc写入远程进程
if(!WriteProcessMemory(hRemoteProcess, pRemoteThread, &ThreadProc, THREADSIZE,0))return 0;
ZeroMemory(&myRemotePara,sizeof(RemotePara));
hUser32 = LoadLibrary(L"user32.dll");
myRemotePara.dwMessageBox = (PVOID)GetProcAddress(hUser32, "MessageBoxW");
wcscat(myRemotePara.strMessageBox,L"Hello!"); //复制MessageBox函数的参数
//写进目标进程
pRemotePara =(RemotePara *)VirtualAllocEx (hRemoteProcess ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);
if(!pRemotePara)return 0;
if(!WriteProcessMemory (hRemoteProcess ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))return 0;
// 启动线程
hThread = CreateRemoteThread(hRemoteProcess ,0,0,(LPTHREAD_START_ROUTINE)pRemoteThread ,pRemotePara,0,&byte_write);
FreeLibrary(hUser32);
CloseHandle(hRemoteProcess);
参考文献:
http://www.codeproject.com/threads/winspy.asp?df=100&forumid=16291&select=1025152&msg=1025152#section_2
http://hi.baidu.com/sunshineboys/blog/item/828f4136c46534dda2cc2b35.html
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1578__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2906解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1647RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1474使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1215使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20221、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1512防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5265// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1799VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3726深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4011原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3146获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7862VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18142SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1953解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7979字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115391.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2336下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1539BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2457对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ...
相关推荐
### 进程注入的研究与实现 #### 概述 进程注入是计算机安全领域的一个重要概念,主要用于调试、监控以及恶意软件开发等场景。通过进程注入技术,可以将一段代码或库(如DLL)插入到另一个正在运行的进程中,进而...
### 进程注入的研究与实现 #### 一、概述 进程注入是一种技术手段,通过它可以在其他进程中执行自己的代码或DLL。这种技术广泛应用于软件开发、调试、安全测试以及恶意软件开发等领域。根据不同的实现机制,进程...
进程注入是一种技术,它允许一个进程的代码在另一个进程中运行,从而实现跨进程通信或对目标进程进行监控、调试或篡改。这种技术在软件开发、调试和恶意软件中都有应用,但通常需要谨慎处理,因为不恰当的使用可能会...
同时,你需要编写用户空间的程序与这个内核驱动交互,实现进程注入的操作。 总的来说,这个工具为高级Linux开发者提供了一个强大的手段,能够进行深度系统操作,但也要求使用者具备相当的技能和谨慎,因为误操作...
游戏外挂是指修改游戏规则或增强玩家能力的非法程序,它们通常利用进程注入技术在游戏进程中插入代码,以实现诸如自动瞄准、透视、无限生命等功能。这种行为不仅破坏了游戏的公平性,也违反了游戏公司的用户协议,...
监视新进程注入(Monitoring New Process Injection)则是连环注入的一种变体,主要目标是检测和控制其他进程中的注入行为。 连环注入的核心在于分步骤地执行注入操作,每个步骤都可能涉及不同的注入技术,如DLL...
总的来说,这个项目提供了一个学习和研究进程注入技术的机会,特别是对于C++开发者来说,它可以帮助理解如何在实际环境中操作和控制其他进程。不过,要注意的是,进程注入技术也可能被滥用,例如在恶意软件中,因此...
在进程注入中,如果注入的代码包含获取更高权限的逻辑,就可能实现提权。这在系统安全中是个严重问题,因为一旦攻击者获得管理员权限,他们可以访问系统的所有资源,进行恶意操作。 这些技术在系统调试、软件开发、...
在实际应用中,进程间注入可能用于测试、调试、安全研究甚至恶意行为。例如,开发者可能会使用它来测试某个服务在被注入代码后的行为,或者在不修改原应用代码的情况下增强其功能。但是,不恰当的使用可能导致隐私...
远程进程注入的技术有多种,如使用API钩子、使用SetWindowsHookEx函数、利用CreateRemoteThread函数等。其中,CreateRemoteThread是最常见的一种方法,它直接在目标进程中创建一个新线程,该线程从指定的内存地址...
7. **调试与逆向工程**:进程注入常用于调试工具,因为它能帮助开发者在不修改目标程序的情况下对其进行测试和分析。然而,这也使得进程注入成为逆向工程师研究软件行为的重要手段。 8. **合法应用示例**:例如,...
标题中的"进程注入小工具"是一个命令行应用程序,其核心功能是实现DLL的注入和卸载。DLL注入是通过调用Windows API函数,如`CreateRemoteThread`和`VirtualAllocEx`,将自定义的DLL加载到目标进程中。这个小工具可以...
综上所述,"注入器进程管理器"是一个强大的工具,它结合了代码注入和进程控制的能力,对开发者和安全研究人员来说非常有价值。不过,由于注入技术的两面性,使用时应遵守法律法规,确保在合法和安全的范围内进行操作...
本资源“易语言源码易语言创建进程注入DLL源码.rar”提供了一种使用易语言实现进程注入DLL技术的示例代码,这对于理解和学习易语言以及系统级别的编程概念非常有帮助。 首先,我们需要理解什么是进程注入。进程注入...
**进程注入工具DllInject详解** 进程注入是一种在计算机科学领域广泛应用的技术,主要用于改变或扩展一个正在运行的进程的行为。DllInject工具就是实现这一技术的一种实用软件。它允许用户将动态链接库(DLL)注入...
在IT领域,Windows进程注入是一种技术,用于将代码或数据注入到另一个正在运行的Windows进程中。...不过,要注意,未经授权的进程注入行为是违反法律的,只应在合法和透明的环境中进行研究和应用。
在易语言中进行进程注入,主要涉及以下几个步骤: 1. **打开进程**:使用`OpenProcess` API函数获取目标进程的句柄,这需要进程的PID(进程标识符)和适当的访问权限。 2. **分配内存**:使用`VirtualAllocEx` API...
在Linux操作系统中,进程注入和持久化是高级渗透测试和安全研究的重要技术。emp3r0r是一个针对Linux平台的框架,其持久化模块专注于实现这一目标。Linux的特性使得进程注入成为可能,如通过procfs(进程文件系统)和...
手工DLL注入检测方法的研究与实现,主要是针对数据防泄漏的一种技术手段。DLL注入是一种常见的技术手段,通过将动态链接库(Dynamic Link Library,DLL)加载到另一个程序的地址空间中,从而在不重新编译的情况下...