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

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 【滴水逆向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传过来。

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

我们来看看最后的效果:



相关文章
|
7月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
141 20
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
360 2
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
854 29
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
350 4
|
9月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
9月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
10月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
2496 1
|
9月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
12月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多
  • DNS