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


相关推荐

  • C# 通过 HtmlDocument 操作HTML节点

    C# 通过 HtmlDocument 操作HTML节点C#通过HtmlDocument操作HTML节点时,会发生不停地刷新的情况,在对html文档操作后加以判断即可解决这种问题。   PublicSubsetMainUlr(ByValWebBrowser1AsWebBrowser)           DimpElemAsHtmlElement=Nothing           即时信息页面          

    2022年7月19日
    15
  • es集群搭建_k8s和docker搭建es集群

    es集群搭建_k8s和docker搭建es集群单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。ES集群搭建_使用docker-海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点-单点故障问题:将分片数据在不同节点备份(replica)ES集群介绍为什么需要集群ES集群相关概念搭建ES集群集群职责划分集群脑裂问题…

    2022年10月12日
    6
  • oracle dba书籍推荐_推荐给大学生必读的书

    oracle dba书籍推荐_推荐给大学生必读的书推荐给DBA的Oracle书籍

    2022年9月26日
    2
  • ESlint 是什么? 有什么好处

    ESlint 是什么? 有什么好处ESlint是代码检查工具,用来检查你的代码是否符合指定的规范;写ESlint的好处是什么?

    2022年6月18日
    44
  • Matlab 2016a安装激活,启动显示License Manager Error-8,解决方法?

    描述:将Matlab2016aWin64Crack\R2016a\bin\win64下面的libmwservices.dll文件放到MATLAB\R2016a\bin\win64文件夹下(覆盖,替换);图示:1—2—小尾巴:同志们!一起学习,共同进步!

    2022年4月12日
    706
  • 深度学习 — BP算法详解(误差反向传播算法)「建议收藏」

    深度学习 — BP算法详解(误差反向传播算法)「建议收藏」本节开始深度学习的第一个算法BP算法,本打算第一个算法为单层感知器,但是感觉太简单了,不懂得找本书看看就会了,这里简要的介绍一下单层感知器:图中可以看到,单层感知器很简单,其实本质上他就是线性分类器,和机器学习中的多元线性回归的表达式差不多,因此它具有多元线性回归的优点和缺点。单层感知器只能对线性问题具有很好的解决能力,但是非线性问题就无法解决了,但是多层感知器却可以解决非线性问题,多层感…

    2022年5月3日
    95

发表回复

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

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