用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【P4论文分享】基于P4的可编程数据平面研究及其应用

    【P4论文分享】基于P4的可编程数据平面研究及其应用P4综述论文学习,了解P4架构和发展前景,文章发布于2019年,仅具有一定的参考价值

    2022年5月8日
    48
  • Numpy中Meshgrid函数介绍及2种应用场景

    Numpy中Meshgrid函数介绍及2种应用场景近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法。但总觉得印象不深刻,不是太了解meshgrid的应用场景。所以,本文将进一步介绍Numpy中meshgrid的用法

    2022年7月1日
    18
  • Delphi中谨慎使用QuotedStr、QuotedString、DequotedString相关的函数

    Delphi中谨慎使用QuotedStr、QuotedString、DequotedString相关的函数//以下测试代码vars,ss:string;begin//1.添加定界符(内容中含定界符的要转义)ss:=QuotedStr(s);//单引号ss:=s.QuotedString(””);//单引号//2.添加指定的定界符(内容中含定界符的要转义)ss:=AnsiQuotedStr(s,'”‘);//双引号ss:=s.QuotedString(‘”‘);//双引号//3.去掉定界符(内容中含连续两个定界符的要反转义)…

    2022年10月18日
    2
  • 卡商卡盟在线批发平台_卡盟总控源码

    卡商卡盟在线批发平台_卡盟总控源码源码介绍:该源码对接宝塔API实现秒搭建主站功能,包括分站开通等都无需人工操作源码价值:****.**¥我也不知道值多少钱,反正修了很久才对接好宝塔接口跟各种问题,搞了好多天,时间长达3个月,不过不是连续修2个月,反正开始搞到现在搞了3个月多吧没有接好支付通道,想要运营的可以找我对接或者找别人对接安装说明服务器系统:Linux+Centos7.x+宝塔亲测环境:Nginx1.1…

    2022年8月12日
    4
  • 图形界面JAVA_aardio plus

    图形界面JAVA_aardio plus前阵子在用python写一些小程序,写完后就开始思考怎么给python程序配一个图形界面,毕竟控制台实在太丑陋了。于是百度了下python的图形界面库,眼花缭乱的一整页,拣了几件有“特色”有“噱头”的下载下来做了个demo,仍旧不是很满意,不是下载安装繁琐,就是界面丑陋或者难写难用,文档不齐全。后来那天,整理电脑文件发现了6年前下载的aatuo(现已更名aardio),顿时一阵惊喜。先说说aard…

    2025年8月12日
    2
  • python画地形地貌图_opencv检测瑕疵python

    python画地形地貌图_opencv检测瑕疵python我们可以使用basemap这个工具包来实现中国地图的绘制首先需要加载一些包:importnumpyasnpimportmatplotlib.pyplotaspltfrommpl_toolkits.basemapimportbasemapbasemap包就是气象画图的利器,现在我们就可以愉快的画图了!plt.figure(1)map=basemap()map.drawcoastli…

    2025年6月20日
    2

发表回复

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

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