Win32简单图形界面程序逆向
Win32简单图形界面程序逆向
- 前言
- 为了了解与学习底层知识,从 汇编开始 -> C语言 -> C++ -> PE文件 ,直至今天的Win32 API,着实学的令我头皮发麻(笑哭)。
- 就在昨天的课程中,老师布置了一个作业:逆向一个简单的Win32程序。
- 本着总结与分享知识的心态,便有了这篇文章,希望能够帮到大家。
- 本文章所逆向的Win32程序:https://files.cnblogs.com/files/02SWD/ReverseTraining_1.rar?t=1663236309
1 首先介绍一下这个win32程序
1.1 简单介绍
该程序是经 release版本 进行编译的。
打开该程序之后,使用 鼠标左键 点击窗口,会弹出标题和内容均为 1 的窗口;使用 鼠标右键 点击窗口,会弹出标题和内容均为 2 的窗口。
打开该程序之后,选中窗口,当我们按下正确的键盘按键时,会弹出该按键的键盘码,否则便会弹出Error窗口。正确的键盘码有3个。下图以其中一个按键“A”为例,请找出剩余的2个(当然你要是一个个试那就没意思了)
1.2 逆向目标任务
- 通过逆向,找到该程序的窗口回调函数对鼠标左/右键进行处理的代码。
- 通过逆向,找到另外2个正确的键盘按键。
2 “窗口回调函数WindowProc()”的定位思路
2.1 逆向思路剖析
- 要想完成上面的2个目标,我们要做的第一件事就是:定位“窗口消息处理程序(窗口回调函数)”的位置,而若想定位“窗口回调函数”,我们就需要知道该函数的函数地址,那么我们要如何得知该函数的函数地址呢?
- 我们知道:“窗口回调函数”的函数地址保存在一个名为 WNDCLASS结构体 的 lpfnWndProc属性 中,找到了该结构体就等于找到了回调函数,那么我们如何定位WNDCLASS结构体呢?
- 我们可以从RegisterClass()函数入手,WNDCLASS结构体的首地址是RegisterClass()函数的参数。那这就意味着:如果我们找到了RegisterClass()函数,就相当于找到了WNDCLASS结构体的首地址,那么我们又如何定位RegisterClass()函数的位置呢?
- 由于在这个程序中,RegisterClass()函数是由WinMain()函数所调用的,所以我们只要找到WinMain()函数,就自然而然的可以定位RegisterClass()函数了。
- 而 WinMain()函数就是win32应用程序的入口函数。
2.2 逆向思维概括
- 定位WinMain()函数 -> 定位RegisterClass()函数 -> 定位WNDCLASS结构体 -> 得知窗口回调函数的函数地址,以致定位到回调函数的代码
3 定位回调函数的具体操作
3.1 步骤1:定位WinMain()函数
- 先将待逆向程序拖入OD,此时要注意:
- 现在的代码所停的位置并不是WinMain()函数的入口点,而是WinMain()函数的 父函数的 入口点,那我们该如何定位WinMain()函数呢?
- 首先我们要清楚 WinMain()函数的必要特点:
- 第一个参数为 hInstance(代表的是该应用程序的imageBase)
- 该函数的调用约定为 __stdcall(即:参数的压栈顺序为:从右至左,平栈方式为内平栈)
- 这就意味着,hInstance参数是最后一个被压栈的,即 在call WinMain指令位置的上方一定会有一个instance参数的压栈。
- 并且 由于WinMain()函数的参数有4个,那么在 内平栈 时,应该使用指令:retn 0x10。
- 定位过程如下图:
3.2 步骤2:定位RegisterClass()函数
- 该函数比较好定位:当我们进入WinMain函数后,向下寻找,根据OD给我们提供的注释,可以轻松的找到:WinMain函数 在0x401055位置处执行了call指令,调用了RegisterClass()函数
3.3 步骤3:定位WNDCLASS结构体
- 在步骤3我们成功定位了WinMain函数调用RegisterClass函数的位置,由此我们便可以轻松的找到 RegisterClass函数的参数:
- 0x401050位置处的指令 便为RegisterClass()函数的 传参指令,而 eax寄存器 中存储的便是 WNDCLASS结构体的地址。
3.4 步骤4:获得“窗口回调函数”的函数地址,以致定位其代码
- 由步骤3我们已经知道 WNDCLASS结构体的数据。根据该结构体的定义,我们可以得知 WNDCLASS结构体的第二个属性 存储的便是 “窗口回调函数”的函数地址,跟进该地址,我们便可以找到回调函数的代码。(WNDCLASS结构体的定义可以通过MSDN查询得知)
4 “窗口回调函数”代码分析的具体操作
4.1 目标1:找到该程序对鼠标左/右键进行处理的代码
定位程序对于鼠标左键的处理代码,过程如下图:
定位程序对于鼠标右键的处理代码,过程如下图:
4.2 目标2:找到另外2个正确的键盘按键
- 分析过程如下图:
4.3 在这里,对上述分析过程做一个简要说明
- 对于回调函数WindowProc的参数做一个简单说明,详情可在MSDN中查询:
LRESULT CALLBACK WindowProc(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
){...}
- 当在窗口中按下 鼠标左键 时,该函数的 uMsg参数 会被赋值为 0x0201
- 当在窗口中按下 鼠标右键 时,该函数的 uMsg参数 会被赋值为 0x0204
- 当在窗口中按下 键盘按键 时,该函数的 uMsg参数 会被赋值为 0x0100,wParam参数 会被赋值为 按键对应的键盘码。
- 对于 0x4010F0位置处 的汇编指令:mov eax,dword ptr ss:[esp+0x8],ss:[esp+0x8]中存储的是什么?或者说它指的是什么?
- 对于 0x401120位置处 的汇编指令:mov eax,dword ptr ss:[esp+0x30],ss:[esp+0x30]中存储的是什么?或者说它指的是什么?
答:首先我们要知道,本次分析的程序是 release版 的,也就是说此时 对于参数和局部变量 所采用的 寻址方式 不再是 ebp寻址,而是 __esp寻址__了。相比于ebp寻址,esp寻址分析起来会比较的麻烦,因为 esp的值是会不断发生变化的。
0x4010F0位置处的汇编指令:mov eax,dword ptr ss:[esp+0x8] 汇编指令分析
0x401120位置处的汇编指令:mov eax,dword ptr ss:[esp+0x30]汇编指令分析
Win32简单图形界面程序逆向的更多相关文章
- 2018-09-28 用Python3和tkinter开发简单图形界面程序
源码库: program-in-chinese/wubi_code_editor 起因在这里. 由于此项目和汉字相关, 个人也想尝试Python的图形界面开发, 于是开始尝试. 遇到的一个坑. 用户测 ...
- 在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
- linux启动后自动登录并运行自定义图形界面程序
在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使 ...
- 在ubuntu上使用wxWidgets成功开发一个图形界面程序
编译wxWidgets 下载最新版的源码,wxWidgets-3.0.2.wxWidgets在liunx是通过wxGTK实现的.wxGTK和wxWidgets的源码打包在一起.wxGTK依赖GTK+, ...
- Quartz(GUI)图形界面程序----Quartz Web
下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用 ...
- Python编写的桌面图形界面程序实现更新检测和下载安装
在Python中我们有很多种方案来编写桌面图形用户界面程序,譬如内置的 Tkinter .强大的 PyQt5 和 PySide2 ,还有 wxPython .借助这些或内置或第三方的模块,我们可以轻松 ...
- 使用XMing+putty运行linux图形界面程序
起因接下去的工作要作一些数值模拟,于是到师兄的工作站上开了个帐号.工作站运行的是RHEL4,要说远程SSH,就算是FTerm也足够胜任,不过,因为我要用的查看计算结果的软件需要使用图形界面,这一点就比 ...
- 第十五章 使用PyQt进行Python图形界面程序开发
在基础知识部分的最后一章<第十三章 Python基础篇结束章>的<第13.3节 图形界面开发tkinter>简单介绍了Python内置图形界面标准库tkinter,当时特别强调 ...
- 使用PyQt进行Python图形界面程序开发文章目录
☞ ░ 前往老猿Python博文目录 ░ PyQt入门知识原来是作为老猿Python<Python基础教程目录>后的进阶学习章节存在,最近不少专栏作者提醒老猿整体的博文内容不错,但博文没有 ...
随机推荐
- 【微服务专题之】.Net6下集成消息队列上-RabbitMQ
微信公众号:趣编程ACE关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码;[如果觉得本公众号对您有帮助,欢迎关注] .Net中RabbitMQ的使用 [微服务专题之].N ...
- NC202498 货物种类
NC202498 货物种类 题目 题目描述 某电商平台有 \(n\) 个仓库,编号从 \(1\) 到 \(n\) . 当购进某种货物的时候,商家会把货物分散的放在编号相邻的几个仓库中. 我们暂时不考虑 ...
- Linux查看内网服务器的出口IP
查看内网服务器的出口IPcurl ifconfig.me [root@vpnserver ~]# curl ifconfig.me111.10.100.100 [root@vpnserver ~]#
- PTA(BasicLevel)-1023 组个最小数
一. 问题定义 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位). 例如:给定两个 0,两个 1,三个 5,一个 8,我 ...
- 项目git commit时卡主不良代码:husky让Git检查代码规范化工作
看完 <前端规范之Git工作流规范(Husky + Commitlint + Lint-staged) https://www.cnblogs.com/Yellow-ice/p/15349873 ...
- 研发效能生态完整图谱&DevOps工具选型必看
本文主要梳理了研发效能领域完整的方向图谱以及主流工具,其中对少部分工具也做了一些点评.看了之后,大家可以对研发效能这个领域有个整体认识,同时研发效能落地的时候也有对应的工具(黑话叫抓手)可以选择. 我 ...
- 2022-07-09 第六组 润土 CSS学习笔记
HTML:用来描述网页的一种语言. 超文本语言.动画.音频.视频.特效.超链. 用标签定义网页 浏览器 流行浏览器: IE微软宣布永久关闭 firefox火狐 Chrom谷歌 Sarifi vscod ...
- day03 对象流与序列化
对象流 java.io.ObjectOutputStream和ObjectInputSteam 对象流是一对高级流,在流连接中的作用是进行对象的序列化与反序列化. 对象序列化:将一个java对象按照其 ...
- Solution -「HDU」Professor Ben
Description 有 \(Q\) 个询问.每次给定一个正整数 \(n\),求它的所有因数的质因数个数的和. Solution 就讲中间的一个 Trick. 我们定义正整数 \(x\) 有 \(f ...
- Note -「Dsu On Tree」学习笔记
前置芝士 树连剖分及其思想,以及优化时间复杂度的原理. 讲个笑话这个东西其实和 Dsu(并查集)没什么关系. 算法本身 Dsu On Tree,一下简称 DOT,常用于解决子树间的信息合并问题. 其实 ...