DLL注入和API拦截

免杀对抗—DLL劫持&白加黑&隐写分离&EDR&Syscall-hook 对于白加黑呢免杀效果是比较强的,关键是DLL后门的免杀,分离或者混淆都可以实现。至于这个Syscall,我是不会编写,只能玩一下别人的项目,而且这玩意挺难的我说实话,更加偏向于二进制那边的了。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。 阅读详情
在 Windows中,每个进程有自己的私有地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间中的一个内存地址。进程不能创建一个指针来引用属于其它进程的内存。因此,如果进程有一个缺陷会覆盖随机地址处的内存,那么这个缺陷不会影响到其它进程所使用的内存。
     独立的地址空间对开发人员和用户都是非常有利的。对开发人员来说,系统更有可能捕获错误的内存读/写。对用户来说,操作系统变得更加健壮了,因为一个应用程序的错误不会导致其它应用程序或操作系统崩溃。当然,这样的健壮性也是要付出代价的,因为它使我们很难编写能够与其它进程通信的应用程序或对其它进程进行操控的应用程序。
     应用程序需要跨越进程边界来访问另一个进程的地址空间的情况如下:
  • 我们想要从另一个进程创建的窗口派生子类窗口
  • 我们需要一些手段来辅助调试——例如,我们需要确定另一个进程正在使用哪些DLL
  • 我们想要给另一个进程安装挂钩    

1.DLL注入的一个例子 
    我们可以调用SetWindowLongPtr来让窗口在内存块中的窗口过程指向新的(我们自己的)WndProc。 
    SetWindowLongPtr(hWnd, GWLP_WNDPROC, MySubclassProc) ; 
    但是,从另一个进程创建的窗口派生子类窗口的问题在于,子类窗口的窗口过程在另一个地址空间中。这样,当函数成功,并去访问新的窗口过程 MySubclassProc ,这就出现了问题,因为 MySubclassProc 的地址将是无法预测的。
2.使用注册表来注入DLL 
    HKEY_LOCAL_MACHINE/Software/Microsoft /Windows NT/CurrentVersion/Windows/ 
    我们可以在注册表项中添加AppInit_Dlls键的值,可能会包含一个DLL的文件名或一组DLL的文件名(通过空格或逗号分隔),为了能让系统使用这个注册表项,我们还应该创建一个名为LoadAppInit_Dlls,类型为DWORD的注册表项,并将它的值宿设为1。
     当User.dll被映射到一个新的进程时,会收到DLL_PROCESS_ATTACH通知。当User.dll对它进行处理的时候,会取得上述注册表键的值,并调用LoadLibrary来载入这个字符串中的指定的每个DLL。当系统载入每个DLL的时候,会调用它们的DllMain函数并将参数 fdwReason的值设为DLL_PROCESS_ATTACH,这样每个DLL就能够对自己进行初始化。
     在用来注入DLL的所有方法中,这是最方便地一种。但这种方法也有一些缺点:

  • 我们的DLL只会被映射到那些使用了User.dll的进程中。所有基于GUI的应用程序都使用了User.dll,但大多数基于CUI的应用程序都不会使用它。
  • 我们的DLL回被映射到每个基于GUI的应用程序中,但我们可能只想把DLL注入到一个或少数几个应用程序中。
  • 我们的DLL回被映射到每个基于GUI的应用程序中,在应用程序终止之前,它将一直存在于进程的地址空间中。    

3.使用Windows挂钩来注入DLL 
    通过调用SetWindowsHookEx来安装挂钩:
     
HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,hInstDll, 0); 
    和用来注册表来注入DLL的方法相比,这种方法允许我们在不需要该DLL得时候从进程的地址空间中撤销对它的映射:
     
BOOL UnhookWindowsHookEx(HHOOK hHook); 
    具体是怎么一回事还不是很清楚,估计得看看程序实现。 
4.使用远程线程来注入DLL 
    注入DLL的第三种方法是使用远程线程(remote thread),它提供了最高的灵活性。
     从根本上说,DLL注入计数要求目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL。由于我们不能轻易地控制别人进程中的线程,因此这种方法要求我们在目标进程中创建一个新的线程。Windows提供了如下所示的CreateRemoteThread函数,它使得在另一个进程中创建线程变得非常容易:
     
HANDLE CreateRemoteThread(
    HANDLE hProcess,
    PSECURITY_ATTRIBUTES psa,
    DWORD dwStackSize,
    PTHREAD_START_ROUTINE pfnStartAddr,
    PVOID pvParam,
    DWORD fdwCreate,
    PDWORD pdwThreadId);
 

    除了CreateRemoteThread有一个额外的参数hProcess之外,它与CreateThread完全相同。这个参数用来标识新创建的线程归哪个进程所有。参数pfnStartAddr是线程函数的内存地址。当然,这个内存地址应该在远程进程的地址空间中,因为线程函数的代码不能在我们自己进程的地址空间中。
     
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) 
                                            GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); 

     HANDLE hThread = CreateRemoteThread(hProcessRemote, NULL, 0, pfnThreadRtn, L"C://MyLib.dll", 0, NULL); 

    "C://MyLib.dll" 位于调用进程的地址空间中 ,我们把这个地址传给新创建的远程线程,远程线程去访问这个内存地址的时候,DLL的路径字符串并不在那里,远程进程的线程很可能会引发访问违规。为了解决这个问题,我们需要把DLL得路径字符串存放到远程进程的地址空间中去。我们可以调用VirtualAllocEx在远程进程的地址空间中为字符串分配一块内存,再把字符串从进程的地址空间复制到远程进程的地址空间中。
     
BOOL ReadProcessMemory( 
    HANDLE hProcess, 
    LPCVOID pvAddressRemote, 
    PVOID pvBufferLocal, 
    SIZE_T dwSize, 
    SIZE_T* pdwNumBytesRead); 

    BOOL WriteProcessMemory( 
    HANDLE hProcess, 
    PVOID pvAddressRemote, 
    LPCVOID pvBufferLocal, 
    SIZE_T dwSize, 
    SIZE_T* pdwNumBytesWritten); 

    让我们总结一下必须采取的步骤:
     1)用VirtualAllocEx 函数在远程进程的地址空间中分配一块内存。
     2)用 WriteProcessMemory 函数把DLL的路径名复制到第1步分配的内存中。
     3)用GetProcAddress 函数来得到LoadLibraryW 或LoadLibraryA 函数(在Kernel32.dll中)的实际地址。
     4)用
 
CreateRemoteThread 函数在远程进程中创建一个线程,让新线程调用正确的LoadLibrary函数并在参数中传             入第1步分配的内存地址。这时,DLL已经被注入到远程进程的地址空间中,DLL的DllMain函数会收到                               DLL_PROCESS_ATTACH 通知并且可以执行我们想要执行的代码。当DllMain返回的时候,远程线程会                         从LoadLibraryW/A调用返回到BaseThreadStart函数。
BaseThreadStart函数然后调用ExitThread,使远程线程             终止。 
    现在远程进程中有一块内存,它是我们在第1步分配的,DLL也还在远程进程的地址空间中。为了对它们进程清理,我们需要在远程线程退出之后执行后续步骤。 
    5)用VirtualFreeEx来释放第1步分配的内存。
     6)用GetProcAddress来得到FreeLibrary函数的实际地址。
     7)用CreateRemoteThread函数在远程进程中创建一个线程,让该线程调用FreeLibrary函数并在参数中传入远程                 DLL的HMODULE。
5.使用木马DLL来注入DLL
     
注入DLL的另一种方式是,把我们知道的进程必然会载入的一个DLL替换掉。

  • 修改DLL的名称
  • 修改应用程序的.exe模块的导入段。    

6.把DLL作为调试器来注入
     
7.使用CreateProcess来注入代码

8.API拦截的一个例子

  • 通过覆盖代码来拦截API
  • 通过修改模块的导入段来拦截API
  拦截函数(hook function)

通过覆盖代码来拦截API

1.定位要焊接的函数,得到它的内存地址;
2.把这个函数起始的几个字节保存到我们自己的内存中;
3.用CPU的一条JUMP指令来覆盖这个函数其实的几个字节,这条JUMP指令用来跳转到我们的替代函数的内存地址。我们的替代函数签名必须与要拦截的函数的函数签名完全相同:所有的参数必须相同,返回值必须相同,调用约定也必须相同。
4.当线程调用被拦截函数的时候,跳转指令实际上会跳转到我们的替代函数,这时,我们就可以执行自己想要执行的任何代码。
5.为了撤销对函数的拦截,我们必须把2中保存下来的字节放回被拦截函数起始的几个字节中。
6.我们调用被拦截函数,让该函数执行它的正常处理。
7.当原来的函数返回时,我们再次执行2、3,这样我们的替代函数将来还会被调用到。

这种方法已经基本过时淘汰,它对CPU有依赖性,而且这在抢占式、多线程环境中根本不能工作。

通过修改模块的导入段来拦截API

这种方法不仅容易实现,而且也相当健壮。我们从模块的导入段说起。。。

一个模块的导入段包含一组DLL,为了能让模块运行,这些DLL是必须的。此外,导入段还包括一个符号表,其中列出了该模块从各DLL中导入的符号。当该模块调用一个导入函数的时候,线程实际上会先从模块的导入表中得到相应的导入函数的地址,然后再跳转到那个地址。

因此,为了拦截一个特定的函数,我们所需要做的就是修改它在模块的导入段中的地址。

完全不存在对CPU的依赖性,而且由于我们并没有修改函数的代码,不必担心线程同步的问题。
 
《Windows核心编程》读书笔记二十二章 DLL注入和API拦截 第22章  DLL注入和API拦截 本章内容 22.1 DLL注入的一个例子 22.2 使用注册表来注入DLL 22.3 使用Windows挂钩来注入DLL 22.4 使用远程线程来注入DLL 22.5 使用木马DLL来注入DLL 22.6 把DLL作为调试器来注入 22.7 使用CreateProcess来注入代码 22.8 API拦截的例子 通常在操作系统中 阅读详情

相关推荐

Rust实战:通过DLL注入与IAT Hook技术拦截Windows API调用

本文详细介绍了如何使用Rust语言实现Windows平台下的DLL注入与IAT Hook技术,以拦截并修改目标进程对特定API(如MessageBoxW)的调用。通过实战代码解析,阐述了Rust在系统编程中的内存安全优势、DLL入口点编写、IAT遍历与地址替换原理,以及远程线程注入的具体步骤,为开发者提供了一套安全、高效的API拦截解决方案。

ol789012345的博客 708

[笔记]Windows核心编程《二十二》注入DLL和拦截API

文章目录前言一、插入DLL:一个例子二、使用注册表来插入DLL三、使用Windows挂钩来插入DLL四、使用远程线程来插入DLL4.1 Inject Library示例应用程序4.2 Image Walk DLL五、使用特洛伊DLL来插入DLL六、将DLL作为调试程序来插入七、用Windows 98上的内存映射文件插入代码八、用CreateProcess插入代码九、挂接A P I的一个示例9.1 通过改写代码来挂接API、9.2 通过操作模块的输入节来挂接API9.3 LastMsgBoxInfo示例应用程

二次元怪兽的博客 2040

DLL注入技术与API拦截实战指南

动态链接库(DLL)是Windows操作系统中一种重要的模块,它允许程序共享代码和资源。DLL注入技术是一种高级技术,它允许我们将DLL强制加载到一个正在运行的进程的地址空间内。这一过程不仅涉及对操作系统底层的理解,还需要掌握进程管理和内存操作的知识。DLL注入技术的历史可以追溯到早期的Windows系统,当时被广泛用于扩展应用程序的功能和性能优化。随着时间的推移,这项技术被广泛应用于各种场景,包括但不限于游戏作弊、恶意软件攻击以及合法的系统级调试和软件开发。

weixin_42560991的博客 1062

Windows核心编程:DLL注入和API拦截

 作者:shenzi链接:http://blog.youkuaiyun.com/shenzi Windows核心编程:DLL注入和API拦截     在Windows中,每个进程有自己的私有地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间中的一个内存地址。进程不能创建一个指针来引用属于其它进程的内存。

shenzi的天空 1万+

纯C#封包拦截源代码

纯C#封包拦截源代码vs2012winform

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

Windows抓包方法-通过DLL注入拦截系统API实现

一.DLL注入 为什么要注入DLL呢? 因为我们想在一个进程中做我们想要做的操作。而在Windows中,系统为每个进程都虚拟出了私有的地址空间。例如指针,它指向的只是本进程的内存,这使得很难对另一个进程进行操作和控制。但是通过注入DLL,我们可以在目标进程中执行DLL中的代码,从而达到操控目标进程的效果。 这里只详细说一下远程线程注入的方法,注入的方法还有很多,不再详细介绍。 首先准备好需要注入的DLL,注意DLL的指令集与目标程序是否兼容。 我们要通过CreateRemoteThread在目标进程创建一个

qq_40012479的博客 2217

ENSP:小型企业网络拓扑设计

包含的技术:ospf、dhcp中继、ac+ap、vrrp+mstp、acl、浮动路由、静态路由、vlan划分

weixin_45921302的博客 1万+

Dll注入与API拦截

Dll注入与API拦截

539

Yolov5自学笔记之一--从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

零基础自学yolov5,学会简单使用和训练自己的数据集,在自己工作中使用

qq_41597915的博客 1万+

kaggle项目:纽约出租车行程时间NYC Taxi Trip Duration

纽约出租车形成时间预测(NYC Taxi Trip Duration)是Kaggle中的一个Playground竞赛。比赛数据集基于2016年纽约市黄色出租车行程记录数据,需要建立一个模型,根据单个行程属性,预测测试集中每次行程的持续时间。Kaggle项目模型XGBoost,评价指标RMSLE。

weixin_42113929的博客 2790

22 DLL注入和API拦截

ndzjx的专栏 244

【N32L40X】学习笔记12-规则组+注入组+外部触发启动

使用定时器触发规则通道开始采集数据,采集完成后使用dma传输数据,并启动注入通道转换数据,注入通道转换完成后产生中断,中断中读物注入通道数据。

Car12 422

【Windows核心编程笔记】第二十二章 DLL注入和API拦截

Dll注入的一个例子 从其他进程创建的窗口派生子类窗口 SetWindowSubclass GetWindowSubclass RemoveWindowSubclass DefSubclassProc 使用注册表来注入dll 整个系统的配置在注册表中 HLM\SoftWare\Microsoft\Windows NT\CurrentVersion\Windows\ A...

半雨微凉 775

抑制电磁干扰(EMI)的实用电路技术

抑制电磁干扰(EMI)的实用电路技术 qtFK_EMC_EMI 【导读】本系列文章的第 1 部分至第 4 部分详细介绍了开关电源稳压器引起的传导发射和辐射发射,包括噪声产生机制、测量要求、频率范围、适用的测试限值、传播模式和寄生效应。在第 5 部分中,我将基于这一理论基础介绍抑制电磁干扰 (EMI) 的实用电路技术。 一般来说,电路原理图和印刷电路板 (PCB) 对于实现出色的 EMI 性能至关重要。第 3 部分重点强调通过谨慎的元器件选型和 PCB 布局尽量减小“功率回路”寄生电感的重要性。电源转换

学海无涯的专栏 1189

把事务数据变成可分析数据:用 ABAP CDS 构建 Cube View 与 Query View,并拆解 OData 取数的底层路径

ABAP CDS分析建模:Cube与Query视图的实践解析 本文探讨了ABAP CDS分析建模中Cube View与Query View的核心区别与应用场景: 架构定位 Cube View作为分析型数据源,定义维度和度量的基础语义 Query View作为消费投影,控制查询可见字段和聚合逻辑 关键实现 通过@Analytics.dataCategory: #CUBE声明分析数据源 使用@DefaultAggregation确保指标口径一致性 @Analytics.query: true启用分析引擎特性 运

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 141

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

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

weixin_39576336的博客 663

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

第二十一章 DLL注入和API拦截

一、DLL注入         让另一个进程执行此进程以外的代码。         1、使用注册表注入:当User32.Dll 被映射到进程中时,会寻找AppInit_Dlls 注册表项,导入其中的DLL。         2、使用挂钩注入:调用SetWindowsHookEx。         3、使用远程线程注入:调用CreateRemoteThread。         4、使用木

江淋的专栏 539

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

windows核心编程---DLL注入和API拦截

-派生子类窗口,要派生窗口属于另一个进程 SetWindowLongPtr会检查一个进程试图修改的WndProc是否是另一个进程的窗口的,如果是,忽略调用。可以在进程A获得进程B窗口的句柄。 FindWindow(xx); // 派生子类窗口,现在应用: SetWindowSubclass GetWindowSubclass RemoveWindowSubclass DefSubcla

x13262608581的博客 2337

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Windows下Dll注入与API拦截

让我们来看一个例子。当这个通知被处理时,U s e r 3 2 . d l l便检索保存的这个关键字中的值,并且为字符串中指定的每个D L L调用L o a d L i b r a r y函数。当每个库被加载时,便调用与该库相关的D l l M a i n函数,其f d w R e a s o n的值是D L L _ P R O C E S S _ AT TA C H,这样,每个库就能够对自己进行初始化。在理想的情况下,你的D L L只应该映射到需要的进程中,同时,它应该以尽可能少的时间映射到这些进程中。

qiexinyueaifei的博客 1597

DLL注入和API 拦截

一.注册表注入 AppInit_DLLs值在以下注册表项中找到: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows 在此值中指定的所有 Dll 都被加载的每个基于 Windows 的应用程序中。当User32.dll被影射到一个新的进程的时候,会收到DLL_PROCESS_ATTACH通知。

asfdasfdsf的专栏 980

dll注入与API拦截

DLL注入 1.注册表注入          为所有的进程注入我们自己编写的DLL,然后通过另一个进程改变消息接收函数。此种方式由于没有细粒度的控制,不推荐使用。 2.挂钩注入          通过setwindowhook(****)函数将消息类型、处理函数、所在的DLLMODULE和所要安装钩子的线程(0代表操作系统内所有的线程)。g_hInstDll动态库句柄可在dllMain获取

zhengdongshiwo的博客 760
上一篇: Hook技术简介
下一篇: 用Socket实现PC和手机的文件传输
zm_21
博客等级 码龄14年 147粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值