DLL注入原理分析

DLL注入原理分析所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程。1、附加到目标/远程进程hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|//允许远程创建线程PROCESS_VM_OPERATION |//允许远程VM操作PROCESS_VM_WRITE, //允许…

大家好,又见面了,我是你们的朋友全栈君。

所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程

1、附加到目标/远程进程

hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD | //允许远程创建线程

PROCESS_VM_OPERATION | //允许远程VM操作

PROCESS_VM_WRITE, //允许远程VM写

FALSE, dwRemoteProcessId)

由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)如果进程打不开,以后的操作就别想了。

OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。

2、在目标/远程进程内分配内存

char *pszLibFileName="my.dll";//注意,这个一定要是全路径文件名,除非它在系统目录里;原因大家自己想想。

//计算DLL路径名需要的内存空间

int cb = (1 + lstrlenA(pszLibFileName)) * sizeof(char);

//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区

pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);

VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0。

3、将DLL文件路径,或者DLL文件,复制到目标/远程进程的内存空间

//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间

iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);

WriteProcessMemory能写入某一进程的内存区域(直接写入会出Access Violation错误),故需此函数入口区必须可以访问,否则操作将失败。

4、控制进程来运行DLL文件

PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");

CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL);

LoadLibrary载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源。

GetProcAddress功能是检索指定的动态链接库(DLL)中的输出库函数地址。lpProcName参数能够识别DLL中的函数。

CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).。

LoadLibraryA这个函数是在Kernel32.dll这个核心DLL里的,而这个DLL很特殊,不管对于哪个进程,Windows总是把它加载到相同的地址上去。因此你的进程中LoadLibraryA的地址和目标进程中LoadLibraryA的地址是相同的(其实,这个DLL里的所有函数都是如此)。至此,DLL注入结束了。

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

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

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


相关推荐

  • tracker服务器地址(每日更新)_hypixel服务器地址

    tracker服务器地址(每日更新)_hypixel服务器地址https://dns.icoa.cn/tracker/udp://tracker.tiny-vps.com:6969/announcehttps://1337.abcvg.info/announcehttps://tracker.fastdownload.xyz:443/announcehttps://opentracker.xyz:443/announceh…

    2022年10月1日
    0
  • C#textBox变成密码框

    C#textBox变成密码框这不能说是技术了,也不能说是经验了,只能是提醒了。写C#基本都是用vs写吧,那在textBox对应的属性窗口里,有一个PasswordChar的属性,只要设置了对应的字符,那么textBox就成了密码框了。就是这么简单,浮云啊~

    2022年7月18日
    13
  • 太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]

    太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]最近心血来潮又想起了折腾自己的安卓手机,不由得就想起来了几年前的Xposed框架.于是又开始跃跃欲试起来然而在网上冲浪许久后,虽然人们七嘴八舌但我大概还是看出来了Xposed对于高版本android好像已经不太能用了,更何况我用的还是MIUI于是,我发现了一个新的玩意—-太极框架.(咳,应该也不是啥新东西了只不过我才关注到而已)当然,现在还有好多类似的东西,但这不是我们的主题….

    2022年6月4日
    163
  • 质量工具因果图_质量管理因果图例题

    质量工具因果图_质量管理因果图例题前言在项目中,我们经常需要用到不同的工具对项目质量进行评审。使用不同的质量工具可能得到的结果不太一样。下面简单说下项目中常用到的质量分析工具因果图。释义:什么是因果图因果图又称为石川图、Ishikawa或鱼骨图,它把影响质量诸因素之间的关系以树状图的方式表示出来,使人一目了然,便于分析原因并采取相应的措施。它是一种在问题发生后,寻找根本原因的一种方法。它取名石川图是因为它是由日

    2022年8月14日
    4
  • virsh命令杂记[通俗易懂]

    virsh命令杂记[通俗易懂]关机virshshutdowndomain开机virshstartdomain查看virsh的snapshot的帮助virshhelpsnapshotSnapshot(helpkeyword‘snapshot’):snapshot-createCreateasnapshotfromXMLsna

    2022年8月11日
    4
  • C#基本概念列举说明建议收藏

    1.关键字在C#代码中常常使用关键字,关键字也叫保留字,是对C#有特定意义的字符串。关键字在VisualStudio环境的代码视图中默认以蓝色显示。例如,代码中的using、namespace

    2021年12月21日
    40

发表回复

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

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