Win 7系统——进程注入技术之PROPagate(32位和64位均可注入)

本文详述了PROPagate进程注入技术在Win 7系统中的应用,包括枚举指定窗口、覆盖窗口子类头部、编写回调函数及发送消息触发执行。通过示例代码展示了如何在32位和64位环境下注入到explorer.exe,并提到了注意事项,如payload匹配回调函数原型,以及使用WM_CLOSE消息触发执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本文是根据原创作者文章仔细学习之后编写的,有助于部分想要该项注入技术的人更加深入理解。在文章末尾我会放上原创作者博客链接,我也参考了先知社区的那篇译文,那篇译文翻译的确实不错,我也会放在文章末尾的参考链接中。

        这种技术最早在2017年10月出现,Hexacorn公司的安全研究人员Adam发表了一篇文章,详细介绍了一种名为PROPagate的新型进程注入技术。

PROPagate技术介绍:

通常是插入新的子类头部,或修改现有的、其中包含可以从另一个进程控制的回调函数的子类头部。我们可以使用SetProp API来更新子类窗口,这与使用SetWindowLong/SetWindowLongPtr API来更新Windows回调过程是非常相似的。在这篇文章中,我们不仅会介绍PROPagate注入技术的工作原理,同时,还会说明这种注入方法相较其他方法的优越之处。截至2018年8月,该注入技术已经被应用到了Smoke Loader和RIG Exploit Kit中。

一、枚举指定窗口(搜索指定子窗口)

Windows资源管理器广泛使用子类化窗口,并且通常以中等完整性级别运行它们,使得登录用户无需启用任何权限即可访问相应窗口的进程空间。鉴于此,Windows资源管理器更有可能成为该方法的注入目标。不过,攻击者仍然需要寻找相应的子类头部,因此,在注入到Windows资源管理器之前,首先需要寻找现有的窗口对象及其属性。

按照以下步骤在explorer.exe中查找有效的子类头部:

1、调用EnumWindows函数
2、从EnumWindowsProc函数中调用EnumChildWindows函数
3、从EnumChildWindowsProc函数中调用EnumProps函数
4、从EnumPropsProc函数中使用参数"UxSubclassInfo"调用GetProp函数,以获得窗口句柄
5、如果GetProp函数返回有效句柄,则将其视为一个潜在的注入向量

源代码如下

#define UNICODE
 
#include <windows.h>
 
#include <tlhelp32.h>
 
#include <psapi.h>
 
#pragma comment(lib, "user32.lib")
 
#include <iostream>
 
#include <vector>
 
#include <algorithm>
 
 
 
 
typedef struct _win_props_t {
 
  DWORD  dwPid;
 
  WCHAR  ImageName[MAX_PATH];
 
  HANDLE hProperty;
 
  HWND   hParentWnd;
 
  HWND   hChildWnd;
 
  WCHAR  ParentClassName[MAX_PATH];
 
  WCHAR  ChildClassName[MAX_PATH];
 
} WINPROPS, *PWINPROPS;
 
   
 
std::vector<WINPROPS> windows;
 
int maxName=16, maxClass=16;
 
bool bAll=false;
 
 
 
 
// we want to ignore duplicates
 
BOOL IsEntry(PWINPROPS e) {
 
    BOOL bFound = FALSE;
 
     
 
    for(int i=0;i<windows.size(); i++) {
 
      // same process id?
 
      if(e->dwPid == windows.at(i).dwPid) {
 
        // same property?
 
        if(e->hProperty == windows.at(i).hProperty) {
 
          bFound = TRUE;
 
          break;
 
        }
 
      }
 
    }
 
    return bFound;
 
}
 
 
 
 
BOOL GetProcessImageName(DWORD dwPid, LPWSTR ImageName, DWORD dwSize) {
 
    HANDLE         hSnap;
 
    PROCESSENTRY32 pe32;
 
    BOOL           bFound=FALSE;
 
     
 
    // create snapshot of system
 
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    if(hSnap == INVALID_HANDLE_VALUE) return 0;
 
     
 
    pe32.dwSize = sizeof(PROCESSENTRY32);
 
 
 
 
    // get first process
 
    if(Process32First(hSnap, &pe32)){
 
      do {
 
        if(dwPid == pe32.th32ProcessID) {
 
          lstrcpyn(ImageName, pe32.szExeFile, dwSize);
 
          bFound = TRUE;
 
          break;
 
        }
 
      } while(Process32Next(hSnap, &pe32));
 
    }
 
    CloseHandle(hSnap);
 
    return bFound;
 
}
 
 
 
 
// callback for property list
 
BOOL CALLBACK PropEnumProc(HWND hwnd,
 
  LPCTSTR lpszString, HANDLE hData)
 
{
 
    WINPROPS wp;
 
    HANDLE   hp;
 
     
 
    hp = GetProp(hwnd, L"UxSubclassInfo");
 
    if(hp==NULL) hp = 
### 如何在Logisim中使用两个32加法器构建一个64加法器 要在Logisim中构建一个64加法器,可以利用已经设计好的32加法器作为基础模块。以下是具体方法: #### 设计思路 为了实现64加法器的功能,需要将两个32加法器串联起来。低32的结果由第一个32加法器计算得出,而高32的结果则由第二个32加法器完成,并考虑到来自低32的进。 #### 实现步骤 1. **准备输入信号** - 输入信号包括两组64数据 \(A\) \(B\),分别表示被加数加数。 - 将每组数据分为高低两部分:\(A_{high}\), \(A_{low}\),以及 \(B_{high}\), \(B_{low}\)。其中下标 \(_{high}\) 表示高32,\(_{low}\) 表示低32[^4]。 2. **连接低32加法器** - 使用第一个32加法器处理低32的数据 \(A_{low}\) \(B_{low}\)。 - 输出结果为低32 \(S_{low}\) 以及向高的进 \(Cout_{low}\)[^4]。 3. **连接高32加法器** - 使用第二个32加法器处理高32的数据 \(A_{high}\) \(B_{high}\),并将 \(Cout_{low}\) 作为额外的进输入到此加法器中。 - 输出结果为高32 \(S_{high}\) 以及最终的进输出 \(Cout_{final}\)[^4]。 4. **组合输出** - 将 \(S_{low}\) \(S_{high}\) 组合形成完整的64 \(S\)。 - 如果需要,也可以保留 \(Cout_{final}\) 用于进一步扩展或错误检测。 #### 示例代码 以下是一个伪代码描述,展示如何在程序逻辑上实现这一过程: ```python def sixty_four_bit_adder(A_high, A_low, B_high, B_low): # 计算低32加法 (S_low, Cout_low) = thirty_two_bit_adder(A_low, B_low) # 计算高32加法,带进 (S_high, Cout_final) = thirty_two_bit_adder(A_high, B_high, Cin=Cout_low) # 返回总最终进 return concatenate(S_high, S_low), Cout_final ``` #### 时间延迟分析 由于采用了串行方式,在时间复杂度方面会受到进链的影响。假设单个32加法器的最大延迟时间为 \(T_{propagate} + T_{generate}\),那么整个64加法器的时间延迟大约为 \(2(T_{propagate} + T_{generate})\)。这表明随着宽增加,延时也会线性增长[^2]。 ### 结论 通过上述方法可以在Logisim中成功搭建基于两个32加法器的64加法器模型。这种方法不仅验证了基本逻辑门电路的工作原理,而且加深了对大规模集成电路内部结构的认识[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值