python dll注入监听_DLL注入和API拦截

python dll注入监听_DLL注入和API拦截读《Windows核心编程》笔记一DLL注入和API拦截在Windows中,每个进程相互独立,都有自己的私有的地址空间,程序中使用的指针都是进程自己地址空间的一个内存地址,无法创建也没法使用其他进程的指针。这种机制使得各个进程之间不会相互影响,万一自己出现了问题,也不会影响到其他的进程。对用户来说,系统更加的稳定了,但是对于开发人员来说,会使我们很难编写能够与其他进程通信的应用程序或对其他进程进…

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

读《Windows核心编程》笔记一 DLL注入和API拦截

在Windows中,每个进程相互独立,都有自己的私有的地址空间,程序中使用的指针都是进程自己地址空间的一个内存地址,无法创建也没法使用其他进程的指针。这种机制使得各个进程之间不会相互影响,万一自己出现了问题,也不会影响到其他的进程。对用户来说,系统更加的稳定了,但是对于开发人员来说,会使我们很难编写能够与其他进程通信的应用程序或对其他进程进行操控的引用程序。

程序运行是由dll/exe等文件加载并执行的,运行过程中也可以动态的加载其他的DLL。假如,我们可以使应用程序在加载dll时加载我们自己写的DLL,那么我们就可以在我们的DLL中做任何我们想做的事情,可以访问进程的任何私有地址空间。下面就来介绍如何让程序加载我们自己的DLL:

1.使用注册表

2.使用Windows挂钩

3.使用远程线程

4.使用木马DLL,即让程序加载我们伪装的DLL

5.通过修改线程内存地址的机器指令

1.使用注册表

这是最简单的方法,通过系统注册表来达到注入DLL的目的,系统注册表中有个AppInit_DLLs键值,在如下路径:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

AppInit_DLLs有可能包含一个或多个DLL的文件名(通过空格或逗号分隔),第一个DLL的文件名可以包含路径,但其他DLL包含的路径将被忽略。所以我们最好是将自己的DLL放在系统目录,然后在注册表中直接指定文件名即可。添加好DLL后,把键值LoadAppInit_DLLs也改为1.这样就大功告成了,每当新的进程启动的时候,会去加载系统的User32.dll,User32.dll在处理DLL_PROCESS_DETACH通知时,就会调用LoadLibrary来载入我们之前填写在AppInit_DLLs中的所有DLL,并调用每一个DLL的DllMain函数。

不过这样的注入方式只适用于那些GUI程序,因为需要依赖程序是否映射User32.dll,对于那些终端CUI应用程序则没法使用。

2.使用Windows挂钩

Windows提供的一种机制可以让我们的一个DLL注入到另一个进程的地址空间,那就是安装WH_GETMESSAGE挂钩,例如:

HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE, MyMsgProc, hInstDll, 0);

MyMsgProc是我们自己的消息处理过程,hInstDll的值是进程地址空间中DLL被映射后的虚拟内存地址,最后一个参数0表示给所有的GUI线程安装挂钩。假设有一个线程给某个窗口发一条消息,系统会先检查你有没有安装WH_GETMESSAGE挂钩,然后把MyMsgProc所在的DLL映射至进程空间,并调用MyMsyProc函数。由于系统将挂钩函数所在DLL映射到进程地址空间时,会映射整个DLL,而不仅仅只是MyMsgProc,这就意味着DLL内的所有函数都存在于进程B中。这时我们可以用SetWindowLongPtr去派生一个子类窗口,这样就可以截获窗口的处理过程。

3.使用远程线程来注入DLL

DLL注入技术唯一的目标就是让别的程序加载我们的DLL,这样我们就可以在我们自己的DLL中做任何我们想做的事情。但是我们无法轻易的控制别人进程的线程,因此就要求我们在目标进程中创建一个新的线程。幸运的是,微软直接给我们提供了这样的API,那就是CreateRemoteThread函数,它使得我们可以在别的程序中创建一个新的线程,函数原型如下:

HANDLE WINAPI CreateRemoteThread(

__in HANDLE hProcess,

__in LPSECURITY_ATTRIBUTES lpThreadAttributes,

__in SIZE_T dwStackSize,

__in LPVOID lpParameter,

__in DWORD dwCreationFlags,

__out LPDWORD lpThreadId

);

其实这个函数与CreateThread函数是一样的,只不过多了一个hProcess参数。lpStartAddress这个函数的内存地址应该存在于远程进程空间中,因为线程函数不可能在别的进程的地址空间中。

好了,现在我们实现了在别的进程中创建一个线程,那么怎么让线程去执行LoadLibrary函数,又怎么加载我们自己的DLL呢?实际上我们可以让lpStartAddress参数直接就是LoadLibrary函数的地址,这样就不用担心线程怎么去执行了。

由于每一个进程在加载Kernel32.dll时,基本上都被映射到了同一个地址。这样我们可以使用GetProcAddress来获取LoadLibrary在Kernel32中的偏移地址,再加上kernel32在自己进程的base地址:

PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T(“Kernel32”)), “LoadLibraryW”);

HANDLE hThread = CreateRemoteThread(hProcessRemote, NULL, 0, pfnThreadRtn, “MyLib.Dll”, 0, NULL);

“MyLib.Dll”这串字符串需要通过VirtualAlloEx在远程进程中分配一块内存,然后通过WriteProcessMemory写入那块新申请的内存,然后把参数”MyLib.Dll”替换掉,这样就可以了,现在我们的DLL就已经进入到了远程的进程中,可以随心所欲了。

4.使用木马DLL,即让程序加载我们伪装的DLL

5.通过修改线程内存地址的机器指令

这两种方式下回分解

python dll注入监听_DLL注入和API拦截

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

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

(0)
上一篇 2022年5月16日 下午10:00
下一篇 2022年5月16日 下午10:00


相关推荐

  • dwr 全面解析

    dwr 全面解析转自文章 nbsp nbsp http blog csdn net zhaizhanpo article details DWR 的作用 DWR 是一个可以允许你去创建 AJAXWEB 站点的 JAVA 开源库 它可以让你在浏览器中的 Javascript 代码调用 Web 服务器上的 Java 代码 就像在 Java 代码就在浏览器中一样 在使用 dwr 前 先介绍下我们远程调用的方法 以方便下文解

    2026年3月19日
    18
  • linux安装mysql5.7.24

    linux安装mysql5.7.24linux安装mysql5.7.24一、卸载mysql安装有三种方式,包括二进制包安装(UsingGenericBinaries)、RPM包安装、源码安装。一般是前两种比较多卸载方法参考Linux->卸载Mysql方法总结,记得卸载干净二、安装建议路径设置按照写的来将下载的压缩包复制到linux服务器/usr/local/路径下(下载地址https://de…

    2022年5月9日
    39
  • Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片

    Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片这是属于我的第一篇博文,首先说明一下,文章属性为原创,其实不能说是原创,我是在学习的过程中根据自己的理解整理的。文章内容大多为书本上的内容,书本是郭霖的《第一行代码》。    正文:现在很多应用程序会调用摄像头的拍照功能,比如哪个程序要上传一张图片作为用户头像,这是启用摄像头拍照会很方便。当然,还有第二种方法,就是在本地图库选取已经被保存的图片。现在,我就根据自己学习的过程,将这部分

    2022年7月21日
    21
  • gbk编码表_河北十一选五五码基本分布图

    gbk编码表_河北十一选五五码基本分布图1.GBK码位分布图2.GBK码位说明GBK亦採用双字节表示,整体编码范围为8140-FEFE,首字节在81-FE之间,尾字节在40-FE之间,剔除xx7F一条线。总计23940

    2022年8月1日
    6
  • Linux SSHFS挂载验证-海思Linux系统

    Linux SSHFS挂载验证-海思Linux系统内核支持 CONFIG FUSE FS 查看 cat proc filesystemsn sysfsnodev rootfsnodev ramfsnodev bdevnodev procnodev cgroupnodev tmpfsnodev devtmpfsnode sockfsnodev pipefsnodev rpc pipefsnodev devpts ext3 ext2 ext4 cramfs vfat msdos

    2026年3月18日
    2
  • 【转载】数据库软件架构设计些什么

    【转载】数据库软件架构设计些什么

    2021年11月20日
    42

发表回复

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

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