`

进程注入的研究与实现(下)

    博客分类:
  • VC
阅读更多

进程注入的研究与实现(下)

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

分享到:
评论

相关推荐

    进程注入的研究与实现1

    进程注入的方法分类如下: 带DLL的注入 利用注册表注入 利用Windows Hooks注入 利用远程线程注入 

    进程注入的研究与实现-上下

    详细介绍了几种不同的注入进程的方法,可以给你绝对的参考

    【国赛】材料基因创新研究平台.zip

    通过与企业的深度合作,平台将加速新型材料的商业化进程,为市场提供具有竞争力的产品。同时,平台还将积极寻求政府和社会各界的支持,为创业团队提供资金、政策等方面的帮助,助力他们实现创业梦想。此外,平台还将...

    不同权限下远程注入技术研究 (2008年)

    针对用户模式下管理员用户和受限用户实现远程注入技术的不同点予以研究。通过计算机编程实践可知,不同权限用户在未使用提权函数时,具有相同的运行现象,在使用提权函数后产生不同的结果。针对这一现象分析原因,并...

    frida面向开发人员逆向工程师和安全研究人员的动态检测工具包.zip

    将您自己的脚本注入黑盒进程。挂接任何函数,监视加密API或跟踪私有应用程序代码,无需源代码。编辑,点击保存,并立即看到结果。所有这些都无需编译步骤或程序重新启动。适用于 Windows、macOS、GNU/Linux、iOS、...

    煤炭地下气化理论与技术研究进展-论文

    集成现代钻井技术、先进的石油装备及井下测量技术而形成,其气化炉主要由长距离定向钻井构成,通过地面远程可控多介质集成注入装备及探测装备,实现煤层火区的精准控制,以及气化参数的实时调控。该工艺用于深部煤层...

    python灰帽子包含高清扫描和可复制两个版本.zip

    构建自己的调试工具,如何自动化实现烦琐的逆向分析任务,如何设计与构建自己的fuzzing工具,如何利用fuzzing测试来找出存在于软件产品中的安全漏洞,一些小技巧诸如钩子与注入技术的应用,以及对一些主流Python安全...

    面向安腾架构的分层内存故障注入方法 (2012年)

    为研究内存故障对高可用服务器的影响,针对安腾架构的计算机提出一种多层次的内存故障注入方法,设计并实现一种新的故障注入器(HMFI),通过在物理层、操作系统内核层和进程层注入内存故障,考察目标系统对内存故障的...

    Python灰帽子-黑客与逆向工程师的Python编程之道[简体中文版]

    逆向工程与漏洞挖掘,并向读者呈现了几乎每个逆向工程师或安全研究人员在日常工作中所面临的各种场景,其中包括:如何设计与构建自己的调试工具,如何自动化实现烦琐的逆向分析任务,如何设计与构建自己的fuzzing...

    中小企业ERP系统设计与开发毕业设计.doc

    ERP作为计算机技 术与企业管理技术结合的杰作,为企业注入活力、增强竞争力提供了源泉。随着ERP的发 展和在各行业的应用,实施ERP成为企业目前的首要要求。 中国大多数企业多是中小企业,作为全国经济活跃地区之一的...

    基于SaaS模式的应用集成平台的设计与开发

    在系统实现部分,通过RESTLET开源架构实现用户之间的统一认证与单点登录,完成分散在不同应用中用户资源的整合。服务集成中件间模块通过REST和SPRING开源架构完成应用集成平台上不同系统间的消息传输。页面集成模块...

    asp.net知识库

    在ASP.NET 1.1下实现模板化站点的新思路 在ASP.Net中两种利用CSS实现多界面的方法 用于弹出ModalDialog进行数据选择的控件 使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能...

    加密解密.技术内幕.chm

    3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程中注入代码3.2 利用调试API编写脱壳机 ...

    软件加密技术内幕 chm

    3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 ...

    软件加密技术内幕

    3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 ...

    云计算发展白皮书(2020年)

    随着“新基建”的推进,云计算必将加快应用落地进程,在各个行业实现快速发展。 本白皮书是继《云计算白皮书(2012年)》之后,中国信息通信研究院第6次发布云计算白皮书。本白皮书在前几版的基础上,聚焦过去一年多...

    java开源包101

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics