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


相关推荐

  • BoundsChecker用法「建议收藏」

    最近我发现我那个程序泄露严重,手动也查不出来。指针乱指。所以刚下了个BoundChecker6.0版的嘿嘿ie在网上看到了它的用法,感觉还不错。BoundsChecker用法http://blog.sina.com.cn/u/53d9f7e9010007fzBoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发…

    2022年4月8日
    42
  • 正则化的作用以及L1和L2正则化的区别

    正则化的作用以及L1和L2正则化的区别0正则化的作用正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。常用的正则化方法有L1正则化和L2正则化。L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归。但是使用正则化来防止过拟合的原理是什么?L1和L…

    2022年7月13日
    13
  • halcon联合C#_halcon调用自己的模型

    halcon联合C#_halcon调用自己的模型20210221版最新C#联合halcon开发框架源码,傻瓜式拖拽,匹配,测量,条码识别,ocr,定位引导,对位等,支持plc通讯,支持相机sdk无缝对接

    2025年7月2日
    3
  • nexus

    nexus

    2021年5月28日
    124
  • cnpm安装与vue安装[通俗易懂]

    cnpm安装与vue安装[通俗易懂]首先是cnpm安装,在安装之前首先确定安装好了nodejs并且配置好了环境终端cmd后输入npm查看版本确定结果正确后进行cnpm安装终端输入npminstall-gcnpm–registry=https://registry.npm.taobao.org这里安装的是淘宝的镜像,等待安装完成后输入cnpm-v查看版本如果出现不是命令检查你的path路径确定安装成功后,终端键入:cnpminstallvue等待安装完成键入vue-V查看安装是否成功默认安装

    2022年10月15日
    3
  • linux用netstat查看服务及监听端口

    linux用netstat查看服务及监听端口

    2021年10月27日
    60

发表回复

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

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