用WriteProcessMemory做进程注入 (非DLL注入)

用WriteProcessMemory做进程注入 (非DLL注入)今天要完成一个项内容,运行另一个应用程序abc.exe,实现它的父进程是explorer.exe。最开始的思路是获得explorer.exe的句柄,用ShellExecute启动abc.exe。但是用explorer.exe的句柄创建的进程的父进程依然是调用和进程,而不是传入句柄的进程。看来直接的不行,只能用间接的了。把运行abc.exe的代码段写到explorer.exe的内存里面去。然后让explorer来运行这段代码。static DWORD CALLBACK ThreadProc()…{    

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

今天要完成一个项内容,运行另一个应用程序abc.exe,实现它的父进程是explorer.exe。

最开始的思路是获得explorer.exe的句柄,用ShellExecute启动abc.exe。但是用explorer.exe的句柄创建的进程的父进程依然是调用和进程,而不是传入句柄的进程。

看来直接的不行,只能用间接的了。把运行abc.exe的代码段写到explorer.exe的内存里面去。然后让explorer来运行这段代码。

用WriteProcessMemory做进程注入 (非DLL注入)
用WriteProcessMemory做进程注入 (非DLL注入)
static
 DWORD CALLBACK ThreadProc()

{

用WriteProcessMemory做进程注入 (非DLL注入)    ::ShellExecute(NULL,”open”,”abc.exe”,NULL,NULL,SW_SHOW);
用WriteProcessMemory做进程注入 (非DLL注入)    
return
 TRUE;
用WriteProcessMemory做进程注入 (非DLL注入)}

但是现在就出现问题了,ShellExecute在shell32模块里,还需要LoadLibrary和GetProcAddress。同时它也用了两个字符串常量,这些字串会出现在本进程的内存中,在explorer中运行代码就会出错,系统把它关掉。所以改用了WinExec来代替 ShellExecute,同时要把需要的字串和函数指针都写到explorer的内存区里。

用WriteProcessMemory做进程注入 (非DLL注入)
typedef UINT (WINAPI 
*
 WINEXEC)(LPCSTR,UINT);
用WriteProcessMemory做进程注入 (非DLL注入)
用WriteProcessMemory做进程注入 (非DLL注入)用WriteProcessMemory做进程注入 (非DLL注入)typedef 

struct
 tagTHREADDATA

{

用WriteProcessMemory做进程注入 (非DLL注入)    TCHAR            fileName[
20];
用WriteProcessMemory做进程注入 (非DLL注入)    WINEXEC            pWinexec;
用WriteProcessMemory做进程注入 (非DLL注入)}

THREADDATA, 
*
LPTHREADDATA;
用WriteProcessMemory做进程注入 (非DLL注入)
用WriteProcessMemory做进程注入 (非DLL注入)用WriteProcessMemory做进程注入 (非DLL注入)

static
 DWORD CALLBACK ThreadProc(LPTHREADDATA pData)

{

用WriteProcessMemory做进程注入 (非DLL注入)    pData
->pWinexec(pData->fileName,SW_SHOW);
用WriteProcessMemory做进程注入 (非DLL注入)    
return TRUE;
用WriteProcessMemory做进程注入 (非DLL注入)}

获得explorer进程PID的方法

用WriteProcessMemory做进程注入 (非DLL注入)
用WriteProcessMemory做进程注入 (非DLL注入)
DWORD getExplorerPID()

{

用WriteProcessMemory做进程注入 (非DLL注入)    HWND startButtonHandle;
用WriteProcessMemory做进程注入 (非DLL注入)    DWORD processID;
用WriteProcessMemory做进程注入 (非DLL注入)    startButtonHandle 
= ::FindWindow (TEXT(Shell_TrayWnd),NULL);
用WriteProcessMemory做进程注入 (非DLL注入)    ::GetWindowThreadProcessId( startButtonHandle, &processID );
用WriteProcessMemory做进程注入 (非DLL注入)    
return processID;
用WriteProcessMemory做进程注入 (非DLL注入)}

注入内存的过程:

用WriteProcessMemory做进程注入 (非DLL注入)
user32Handle 
=
 ::GetModuleHandle(TEXT(

kernel32

));
用WriteProcessMemory做进程注入 (非DLL注入)

//
得到kernel32模块句柄

用WriteProcessMemory做进程注入 (非DLL注入)

processHandle 
=
 ::OpenProcess(PROCESS_CREATE_THREAD 
|
 PROCESS_QUERY_INFORMATION 
|
 PROCESS_VM_OPERATION 
|
 PROCESS_VM_WRITE 
|
 PROCESS_VM_READ,FALSE,getExplorerPID());
用WriteProcessMemory做进程注入 (非DLL注入)

//
用explorer的PID来打开进程,并得到创建线程和写的权限。

用WriteProcessMemory做进程注入 (非DLL注入)

dataAddr 
=
 ::VirtualAllocEx(processHandle,
0
,
sizeof
(THREADDATA),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
用WriteProcessMemory做进程注入 (非DLL注入)

//
在explorer的内存内里申请一块内存来存所用的数据

用WriteProcessMemory做进程注入 (非DLL注入)用WriteProcessMemory做进程注入 (非DLL注入)

THREADDATA data 
=
 

{TEXT(a.exe),(WINEXEC)GetProcAddress(user32Handle,WinExec),}
;
用WriteProcessMemory做进程注入 (非DLL注入)WriteProcessMemory(processHandle,dataAddr,

&
data,
sizeof
(THREADDATA),
&
byteWrited);
用WriteProcessMemory做进程注入 (非DLL注入)

//
把数据写到申请的内存中

用WriteProcessMemory做进程注入 (非DLL注入)

codeAddr 
=
 ::VirtualAllocEx(processHandle,
0
,sizeOfThreadProc,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
用WriteProcessMemory做进程注入 (非DLL注入)

//
申请代码的内存区

用WriteProcessMemory做进程注入 (非DLL注入)

WriteProcessMemory(processHandle,codeAddr,
&
ThreadProc,sizeOfThreadProc,
&
byteWrited);
用WriteProcessMemory做进程注入 (非DLL注入)

//
把代码写进去,这时我们己经把我们要用的代码和数据都准备好了。

用WriteProcessMemory做进程注入 (非DLL注入)

threadHandle 
=
 CreateRemoteThread(processHandle,NULL,
0
, LPTHREAD_START_ROUTINE)codeAddr,dataAddr,
0
,(LPDWORD)threadID);
用WriteProcessMemory做进程注入 (非DLL注入)

//
在explorer中创建一个线程,来执行启动abc.exe的代码。所需的数据都己经在explorer的内存块中,所以不会出问题。

用WriteProcessMemory做进程注入 (非DLL注入)

WaitForSingleObject(threadHandle, INFINITE);
用WriteProcessMemory做进程注入 (非DLL注入)VirtualFreeEx(processHandle,dataAddr,

0
,MEM_RELEASE);
用WriteProcessMemory做进程注入 (非DLL注入)VirtualFreeEx(processHandle,codeAddr,

0
,MEM_RELEASE);
用WriteProcessMemory做进程注入 (非DLL注入)CloseHandle(threadHandle);
用WriteProcessMemory做进程注入 (非DLL注入)CloseHandle(processHandle);
用WriteProcessMemory做进程注入 (非DLL注入)

//
等待执行完毕,释放内存,关闭句柄。

 

这就完成了代码的注入与执行。

英语还算不错的推荐去看看这篇文章,帮助很大。

Three Ways to Inject Your Code into Another Process

http://www.codeproject.com/threads/winspy.asp

文章引用自:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1124852

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197565.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于DLL注入的理解

    关于DLL注入的理解DLL注入方式较多,包括API拦截与替换、消息钩子、远程进程。这些注入都是针对第三方程序(下面简称目标程序)的操作。目标程序主要分为两种,解释型和编译型。解析型可以在解释权解释之前做很多事情,比较简单,也比较可行。编译型则无法在编译前做任何事情,因为目标程序一般是第三方编译完成之后发布出来的。编译完成后就是二进制代码(即使能反汇编),就不存在变量名、函数名等标识符,因为这些标识符已经转换成响应的地址。这种情况下,如果拿不到真正的地址,则即使注入到主线程(UI线程)中,依然没有任何作用。除非程序调用的dll包

    2022年5月13日
    29
  • ZigBee协议栈解析

    ZigBee协议栈解析ZigBee技术是物联网领域最常用的无线技术之一,如果我们要做基于ZigBee技术的物联网应用,最好对ZigBee协议栈有一个基本的了解。这篇文章对ZigBee协议栈做一个简单明了的介绍。概述本文准备介绍的ZigBee协议栈是ZigBee2007,也是目前业界最常用的标准版本,对于ZigBee协议栈的演进历程,可以参加《5分钟了解Zigbee的前世今生》。Zi…

    2022年5月8日
    54
  • 12306网上购票进行身份核验的步骤「建议收藏」

    12306网上购票进行身份核验的步骤「建议收藏」12306自从开始身份核验后,引起很多争议,而且新的政策出来后总要去研究解读,导致很多人不知如何去做。相信很多人会问“12306注册之后,账号激活了,但是身份有待核验,请问这个需要多长时间呢”?然后很

    2022年8月4日
    3
  • I.MX6 AW-NB177NF WIFI 驱动移植问题

    I.MX6 AW-NB177NF WIFI 驱动移植问题

    2021年9月16日
    59
  • ST-Link SWD接口接线

    ST-Link SWD接口接线1、实验目的:实现通过st-link调试stm32芯片2、实验环境:stm32开发板留有20pin的调试接口,可接jlink和stlink调试工具使用st-linkv23、接线方式SWD接口需要连接四根线:VCCGNDSWDIOSWCLK20pin调试接口对应的pin脚关系:Pin1–VCC:ThisisthetragetboardVcc.Itisusedbythe

    2022年5月20日
    63
  • 神经网络的优化算法_梯度下降优化算法

    神经网络的优化算法_梯度下降优化算法最近回顾神经网络的知识,简单做一些整理,归档一下神经网络优化算法的知识。关于神经网络的优化,吴恩达的深度学习课程讲解得非常通俗易懂,有需要的可以去学习一下,本人只是对课程知识点做一个总结。吴恩达的深度

    2022年8月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号