【滴水逆向P77】加载进程(PE查看器)应用程序源码解析(下)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【滴水逆向P77】加载进程(PE查看器)应用程序源码解析

GetDlgItem函数

MSDN官方文档解释GetDlgItem函数

函数功能:获取指定对话框中控件的句柄。

函数原型:

HWND GetDlgItem(
  [in, optional] HWND hDlg,
  [in]           int  nIDDlgItem
);

参数说明:

  • hDlg:对话框句柄,我们需要获取哪个对话框中控件的句柄,就把这个对话框的句柄写入
    nIDDlgItem:要检索的控件标识符
    返回值:函数成功,则返回控件的句柄。

ListView_InsertColumn宏

MSDN官方文档解释ListView_InsertColumn宏

功能:在列表视图控件中加入新列

宏原型:

void ListView_InsertColumn(
   hwnd,
   iCol,
   pcol
);

参数说明:

hwnd:列表视图控件的句柄。

iCol:新列的索引。

pcol:包含指向新列属性的LVCOLUMN结构体指针。

5.初始化模块列表

VOID InitMoudleListView(HWND hDlg) {
  //设置窗口风格需要调用结构体
  LV_COLUMN lv;
  HWND hListMoudles;
  //初始化
  memset(&lv, 0, sizeof(LV_COLUMN));
  //获取模块列表句柄
  hListMoudles = GetDlgItem(hDlg, IDC_LIST_MOUDLE);
  //设置整行选中
  SendMessage(hListMoudles, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
  //第一列:
  lv.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
  lv.pszText = (LPWSTR)TEXT("模块名称");
  lv.cx = 330;
  lv.iSubItem = 0;
  //ListView_Insertcolumn(hListMoudles,0,&lv);
  SendMessage(hListMoudles, LVM_INSERTCOLUMN, 0, (DWORD)&lv);
  //第二列:
  lv.pszText = (LPWSTR)TEXT("模块位置");
  lv.cx = 330;
  lv.iSubItem = 1;
  SendMessage(hListMoudles, LVM_INSERTCOLUMN, 0, (DWORD)&lv);
}

这段代码使用的函数和宏跟初始化进程的相差不多,这里不做过多赘述。

我们来看看初始化过后的窗口:

5.向列表视图控件中展示数据

由于我们还没有了解加载windows所有进程的API,所以我们先来学习一下如何让列表视图控件中显示数据:

这段代码中是向列表视图控件中加入了假的数据,是我们指定的数据,下一篇文章将会向大家介绍加载Windows所有进程的API:

VOID EnumProcess(HWND hListProcess) {
  LV_ITEM vitem;
  //初始化,第一个进程
  memset(&vitem, 0, sizeof(LV_ITEM));
  vitem.mask = LVIF_TEXT;
  //假数据:
  vitem.pszText = (LPWSTR)TEXT("csrss.exe");
  vitem.iItem = 0;
  vitem.iSubItem = 0;
  //ListView_Insertem(hListProcess,*vitem);
  SendMessage(hListProcess, LVM_INSERTITEM, 0, (DWORD)&vitem);
  vitem.pszText = (LPWSTR)TEXT("448");
  vitem.iItem = 0;
  vitem.iSubItem = 1;
  SendMessage(hListProcess, LVM_SETITEM, 0, (DWORD)&vitem);
  //ListView_SetItem(hListProcess, &vitem);
  vitem.pszText = (LPWSTR)TEXT("56590000");
  vitem.iItem = 0;
  vitem.iSubItem = 2;
  ListView_SetItem(hListProcess, &vitem);
  vitem.pszText = (LPWSTR)TEXT("000F0000");
  vitem.iItem = 0;
  vitem.iSubItem = 3;
  ListView_SetItem(hListProcess, &vitem);
  //第二个进程假数据:
  vitem.pszText = (LPWSTR)TEXT("QQ.exe");
  vitem.iItem = 1;
  vitem.iSubItem = 0;
  SendMessage(hListProcess, LVM_INSERTITEM, 0, (DWORD)&vitem);
  vitem.pszText = (LPWSTR)TEXT("153");
  vitem.iItem = 1;
  vitem.iSubItem = 1;
  ListView_SetItem(hListProcess, &vitem);
  vitem.pszText = (LPWSTR)TEXT("65580000");
  vitem.iItem = 1;
  vitem.iSubItem = 2;
  ListView_SetItem(hListProcess, &vitem);
  vitem.pszText = (LPWSTR)TEXT("001E0000");
  vitem.iItem = 1;
  vitem.iSubItem = 3;
  ListView_SetItem(hListProcess, &vitem);
  //第三个进程假数据:
  vitem.pszText = (LPWSTR)TEXT("WeChat.exe");
  vitem.iItem = 2;
  vitem.iSubItem = 0;
  SendMessage(hListProcess, LVM_INSERTITEM, 0, (DWORD)&vitem);
  vitem.pszText = (LPWSTR)TEXT("256");
  vitem.iItem = 2;
  vitem.iSubItem = 1;
  ListView_SetItem(hListProcess, &vitem);
  vitem.pszText = (LPWSTR)TEXT("75960000");
  vitem.iItem = 2;
  vitem.iSubItem = 2;
  ListView_SetItem(hListProcess, &vitem);
  vitem.pszText = (LPWSTR)TEXT("015B0000");
  vitem.iItem = 2;
  vitem.iSubItem = 3;
  ListView_SetItem(hListProcess, &vitem);
}

LV_ITEM结构体

向列表视图控件中加入数据的时候,我们使用到了该结构体。

MSDN官方文档解释LV_ITEM结构体

结构体用途:用于指定或接收列表视图项的属性。

这个结构和前面的哪个LV_COLUMN结构体很像。实际上就是为了满足各种消息的需求,定义了不同的结构体。

结构体原型:

typedef struct tagLVITEMA {
  UINT   mask;
  int    iItem;
  int    iSubItem;
  UINT   state;
  UINT   stateMask;
  LPSTR  pszText;
  int    cchTextMax;
  int    iImage;
  LPARAM lParam;
  int    iIndent;
  int    iGroupId;
  UINT   cColumns;
  PUINT  puColumns;
  int    *piColFmt;
  int    iGroup;
} LVITEMA, *LPLVITEMA;

参数说明:

  • mask:指定有效的成员,比如我们需要使用pszText字段,就要声明LVIF_TEXT。
    iItem:此结构引用的项从零开始的索引。
    iSubItem:此结构引用的子项的一个基于索引,如果此结构是引用项而不是子项,则为0。
    state:指示项的状态,状态图像和覆盖图像。
    stateMask:指定将检索或修改 状态 成员的位的值。
    pszText:指向包含结束符文本的字符串。
    cchTextMax:pszText指向的缓冲区的大小。
    iImage:控件图像列表中的项图标的索引。
    lParam:特定于项的值。
    iIndent:要缩进项的图像宽度数。。
    iGroupId:项所属的组的标识符。

ListView_SetItem宏

MSDN官方文档解释ListView_SetItem宏

宏功能:设置列表视图项的某些或全部属性。

宏原型:

void ListView_SetItem(
   hwnd,
   pitem
);

参数解释:

  • hwnd:列表视图控件的句柄。
  • pitem:指向包含项属性的LVITEM结构体。

这里必须得提一句,只有在列表视图控件增添第一行的时候,使用ListView_InsertItem宏,在添加子项的时候,要使用ListView_SetItem宏!!!

如果使用错误,则不能成功添加子项。

向模块列表视图控件中展示数据

VOID EnumMoudles(HWND hListProcess, WPARAM wParam, LPARAM lParam) {
  DWORD dwRowId;
  TCHAR szPid[21];
  LV_ITEM lv;
  //初始化
  memset(&lv, 0, sizeof(LV_ITEM));
  //获取选择行
  dwRowId = SendMessage(hListProcess, LVM_GETNEXTITEM,-1 , LVNI_SELECTED);
  if (dwRowId == -1) {
    MessageBox(NULL, TEXT("请选择进程"), TEXT("出错啦"), MB_OK);
    return;
  }
  //获取PID
  lv.iSubItem = 1;
  lv.pszText = szPid;
  lv.cchTextMax = 0x20;
  SendMessage(hListProcess, LVM_GETITEMTEXT, dwRowId, (DWORD)&lv);
  MessageBox(NULL, szPid, TEXT("PID"), MB_OK);
}

这里需要注意一点,我们要获取进程使用的模块,必须根据PID来获取,所以当点击进程模块中的项目的时候,要想办法把PID传过来。

函数使用的跟前面的差不多,不做过多赘述了。

我们来看看最后的效果:



相关文章
|
14天前
|
PHP 开发者
PHP 7新特性深度解析与实践应用
【9月更文挑战第17天】本文将深入探讨PHP 7的新特性及其对开发者的实际影响,同时通过实例演示如何有效利用这些特性优化代码和提高性能。我们将从类型声明的增强开始,逐步深入到其他关键改进点,最后通过一个综合案例展示如何将这些新特性应用于日常开发中。
|
16天前
|
安全 网络协议 应用服务中间件
AJP Connector:深入解析及在Apache HTTP Server中的应用
【9月更文挑战第6天】在Java Web应用开发中,Tomcat作为广泛使用的Servlet容器,经常与Apache HTTP Server结合使用,以提供高效、稳定的Web服务。而AJP Connector(Apache JServ Protocol Connector)作为连接Tomcat和Apache HTTP Server的重要桥梁,扮演着至关重要的角色
40 2
|
11天前
|
传感器 C# Android开发
深度解析Uno Platform中的事件处理机制与交互设计艺术:从理论到实践的全方位指南,助您构建响应迅速、交互流畅的跨平台应用
Uno Platform 是一款开源框架,支持使用 C# 和 XAML 开发跨平台原生 UI 应用,兼容 Windows、iOS、Android 及 WebAssembly。本文将介绍 Uno Platform 中高效的事件处理方法,并通过示例代码展示交互设计的核心原则与实践技巧,帮助提升应用的用户体验。事件处理让应用能响应用户输入,如点击、触摸及传感器数据变化。通过 XAML 或 C# 添加事件处理器,可确保及时反馈用户操作。示例代码展示了一个按钮点击事件处理过程。此外,还可运用动画和过渡效果进一步增强应用交互性。
118 57
|
18天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
18天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
172 37
|
2天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
5天前
|
数据可视化 Python
Python绘制基频曲线——实例解析与应用探讨
Python绘制基频曲线——实例解析与应用探讨
30 9
|
3天前
|
算法 调度
操作系统的心脏:深入解析进程调度算法
本文旨在深入探讨现代操作系统中的核心功能之一——进程调度。进程调度算法是操作系统用于分配CPU时间片给各个进程的机制,以确保系统资源的高效利用和公平分配。本文将详细介绍几种主要的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及优先级调度(PS)。我们将分析每种算法的基本原理、优缺点及其适用场景。同时,本文还将讨论多级反馈队列(MFQ)调度算法,并探讨这些算法在实际应用中的表现及未来发展趋势。通过深入解析这些内容,希望能够为读者提供对操作系统进程调度机制的全面理解。
|
10天前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
53 12
|
9天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
30 6

热门文章

最新文章

推荐镜像

更多