[读书][笔记]WINDOWS PE权威指南《一》PE的原理和基础 之 第一章 环境搭建及简单破解

简介: WINDOWS PE权威指南《一》PE的原理和基础 之 第一章 环境搭建及简单破解

文章目录



   前言

       前期准备

   1.1 开发语言MASM32

       1.1.1 设置开发环境

           下载安装masm

           环境变量配置

           测试是否配置成功

       1.1.2 开发第一个源程序HelloWorld.asm

           配置

           代码

       1.1.3 运行HelloWorld.exe

           vs版本运行

           masm32运行

               1.进入工作区

               2.编译源文件

               3.链接目标文件与动态链接库

               4.运行

   1.2 调试工具OllyDBG

       1.2.1 调试helloworld.exe

           1.认识OD组成

               指令解释区

               寄存器运行状态区

               代码和数据字节码区

               栈区

       1.2.2 Helloworld.exe的跟踪执行

           常用快捷键

           超级文字查找 插件使用

           调试

       1.2.2 修改Exe文件字节码

       1.2.3 静态分析

   1.3 十六进制编辑软件FlexHex

       1.3.1 UE修改程序

   1.4 破解实例:U盘监控器

       目标

       任务

       思路

       实现步骤

           步骤1 首先运行该软件,获取与破解有关的提示信息。

           步骤2 使用FlexHEX获取“注册失败!”字符串的文件偏移地址。

           步骤3 使用OD获取引用该字符串的指令在内存中的地址。

           步骤4 使用W32DASM 获取判断语句的位置。

           步骤5 使用OD更改指令字节码。

           步骤6 重新测试

   1.5 初识PE文件

       简单了解PE字节码编排

           分析结构

           PE 结构信息

   1.6 小结


前言



前期准备


开发语言:MASM V10.0


工作环境:Windows XP/Vista/8/10


源程序的编辑器:

记事本(notepad.exe)用来编写汇编源程序

Visitual Studio 2015/2017/2019也是可以的


动态调试器:OllyDBG软件


静态调试器:W32DASM


字节码的阅读器和编辑器:

FlexHex/UltraEdit(下载地址)/WinHex


1.1 开发语言MASM32



MASM32是Steve Hutchessond在微软的不同产品基础上集成开发出来的汇编开发工具包,适合Win32编程环境的汇编语言,它主要用于基于Windows平台的32位汇编语言开发,是现在最流行的 Win32汇编开发包。与VC++和VB等高级语言相比,Win32汇编具有得天独厚的优势,这些优势主要体现在:


   1.它摒弃了对系统细节的封装,更接近于系统的底层,从而使得编码更加灵活,能完成许多高级语言无法做到的事情(如代码重定位和特殊寄存器赋值等)。

   2.它生成的可执行PE文件体积小,执行速度快。

   3.它可用于软件的核心程序段设计,以提高软件的性能。

  4. 它能够直接接触系统的底层,所以使用它要远比使用VC++和VB等高级语言更适合开发与系统安全相关的程序。比如,与计算机硬件密切相关的驱动程序的开发、计算机病毒的分析与防治、软件加密与解密、软件调试、Windows PE研究等。


因此,学习Win32汇编对学习信息安全而言很有必要。MASM32是我们研究Windows PE的首选语言。

MASM32是一个免费的软件包,该软件包中包含了汇编编译器ml.exe、资源编译器rc.exe、32位的链接器link.exe和一个简单的集成开发环境( Intergrated DevelopmentEnvironment,IDE)QEditor.exe。为什么说MASM32是从其他产品集成出来的呢?这是因为软件包中的ml.exe来自Microsoft 的MASM软件包,rc.exe和 link.exe则来自Microsoft的Visual Studio。MASM32软件包还包括了详尽的头文件、导入库文件、例子文件、帮助文档和一些工具程序,如 lib.exe和dumpbin.exe等,后者被大家公认为最好的显示PE文件结构的工具。大家可以从网站 http://www.masm32.com/

上获得MASM32 SDK的最新版本,并可以在论坛里与来自世界各地的汇编爱好者交流技术和思想。


1.1.1 设置开发环境


   可以选用vs作为开发工具

   可详见我的博客[笔记]vs2015 编写汇编masm32 Helloworld

   或者其他相关文章


下载安装masm


环境变量配置


include=masm32/include/;

lib=masm32/lib/;

path=masm32/bin/;


测试是否配置成功


运行cmd.exe->运行ml命令

图片.png


图片.png

1.1.2 开发第一个源程序HelloWorld.asm


配置


配置lib

图片.png

配置include

图片.png

图片.png

代码

.386
;CPU mode
.model flat ,stdcall
option casemap : none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kerne132.lib
;数据段
.data
szText db 'Helloworld',0
;代码段
.code
main :
  invoke MessageBox,NULL,offset szText ,NULL,MB_OK
  invoke ExitProcess,NULL
end main

1~6行是程序的注释;

7~10行定义了该汇编程序支持的基本特性;

11~16行引入了外部的动态链接库,在这些动态链接库里有程序需要的函数调用,这种调用方式符合程序代码重用的原则;

17~19行定义了这个程序中用到的数据;

20~25行则是程序的代码段,25行的伪指令“end start”告诉操作系统代码入口﹔最有用的代码行只有23行和24行,分别调用了user32.dll 动态链接库中的MessageBoxA函数和kernel32.dll动态链接库中的ExitProcess函数。


1.1.3 运行HelloWorld.exe


vs版本运行


run一下vs就成功显示

图片.png


masm32运行


1.进入工作区


2.编译源文件

在当前工作区中输入命令

ml -c -coff Helloworld.asm

然后回车。

参数-c表示独立编译,不进行链接;

参数-coff表示编译后生成标准的COFF目标文件。

编译以后会在源文件所在目录生成一个与源文件同名的obj目标文件。

ml.exe是汇编语言的编译程序,它负责将汇编源程序编译成目标文件。该程序可接受的各参数的解释和描述如下所示:


3.链接目标文件与动态链接库


链接是为了将源文件中调用到的动态链接库中的函数的相关信息附加到可执行文件中。链接命令是:

link -subsystem:windows Helloworld.obj

参数-subsystem表示允许该代码运行的子系统。

如果没有错误,执行以上命令后会在源文件所在目录下生成最终的可执行文件HelloWorld.exe。链接程序的参数解释如下:

图片.png

图片.png

4.运行

Helloworld.exe


1.2 调试工具OllyDBG



大家可能对OllyDBG(简称OD)并不是很熟悉,但在软件破解领域,它却是与TRW2000和SoftICE等齐名的跟踪破解利器。熟练掌握OD的用法对我们以后研究EXE文件内部指令跳转、病毒分析、逆向工程与反病毒设计等有很大的帮助。那么,就让我们从调试HelloWorld.exe开始学习吧。


OllyDBG 2.01版本 下载地址

OllyDBG官网下载地址

OllyDBG 吾爱破解版 自带插件会比较方便


   注意:下载需要关闭Windows实时保护


1.2.1 调试helloworld.exe


1.认识OD组成


OD工作区:

  1. 指令及指令解释区

  2. 寄存器及运行状态区

   3.代码和数据字节码区

   4.栈区

图片.png

指令解释区


指令及指令解释区(以下称①区)该区域位于整个界面的左上角,共包含四列。分别为


   指令所在的内存地址、

   指令字节码、

   反汇编后的指令语句,

   以及指令相关的注释。


OD的强大之处在于,它将许多难懂的指令字节码反解释成了汇编指令,并附以形象的说明。

例如,在内存地址0x0040101E处的指令字节码FF25 00204000,其对应的汇编指令是一个远跳转指令:

JMP DWORD PTR DS : [<&kernel32.ExitProcess>]


而该位置处的数据则是一个内存地址。该地址指向了kernel32.dll动态链接库中函数ExitProcess的起始位置。


寄存器运行状态区


寄存器及运行状态区,该区域位于整个界面的右上角,包含了所有的32位寄存器,如eax、ebx、ecx、esi、edi、esp、ebp等。大家要特别关注以下几个寄存器:


   ebp(栈基地址指针)

   esp(栈顶指针)

   eip(指向下一条要执行的指令的位置)

   除了寄存器的值外,该区还显示所有段寄存器的值及标志位的值,如FS段,这个段在后面讲到异常的时候会用到。


代码和数据字节码区


代码和数据字节码区(以下称③区)该区域位于整个界面的左下角,它包含了指定内存范围的字节码,我们可以通过菜单命令随时查看当前内存中的数据。


栈区


栈区 该区域位于整个界面的右下角,它反映了当前栈的分配情况及栈在程序运行过程中的变化情况。


1.2.2 Helloworld.exe的跟踪执行


跟踪一个程序的执行不仅可以帮助我们判断程序是否在按照自己预先设计的思路运行,还可以使我们了解某个时刻计算机的寄存器、栈、全局变量、内存等的状态,便于我们理解和更好地把握程序运行过程,优化程序设计,提高编程水平。


常用快捷键


F3:加断点

F7:单步步入

F8:单步步过

F9:运行

Ctrl+F2:重新运行


超级文字查找 插件使用


指令解释区右键->Search for->All reference Text String找到Helloworld位置打断点


调试


   找到Helloworld F2打断点

   (1) Call F7进入MessageBox

   (2)Call F7 进入ExitProcess

  图片.png


1.2.2 修改Exe文件字节码


   OD不仅可以让我们对EXE文件进行反汇编和单步执行调试,还可以对目标EXE文件进行修改,后面的许多章节都会涉及这一操作。下面我们对HelloWorld.exe文件中的部分字节码进行更改,将显示信息“HelloWorld”更改为“HelloWorld-modified by OD”。这种修改要成功,要求更改后的字符串长度不能超出EXE中数据段的范围。幸运的是,由于链接器在进行链接时是以200h字节对齐段长度,即数据段的长度要大于等于200h字节,所以这次修改一定可以成功。


   1.在字节码区选中要修改的内容,右键,选择Binary->Edit

 图片.png

图片.png


  2. 重写写入内容

 图片.png


 3.  运行修改

   OK->F9放开断点

图片.png

   注意

   1.要选中足够的大小的内容 大小少了是无法增加的

   2.注意内容中的’.‘需要替换成空格 不然就提前\0结束字符串显示内容了

   就变成Helloworld\0by OD 显示不全


4. 保存修改

图片.png图片.png

图片.png


1.2.3 静态分析


如果说OD是一个擅长动态分析的软件,那么W32DASM则是一个擅长静态分析的软件。后者可以标识整个EXE文件中指令间的调用关系,对于跟踪和识别指令之间的承前启后的关系有很大的帮助,该软件在随书文件中可以找到。


这里可以选用IDA Pro(下载地址)


   静态分析最大的好处是:能从当前指令反查调用此处的指令所在。例如,地址0x00401018处的指令是谁调用了呢(加粗部分)﹖请分析如下代码行:


   提示﹐由于静态分析和动态分析均正确地模拟了Windows 操作系统的进程装载机制,所以二者的指令地址是一致的。


1.3 十六进制编辑软件FlexHex



UltraEdit(下载地址)

WinHex

我用的是UltraEdit


1.3.1 UE修改程序


   UE打开Helloworld.exe

   ctrl+H 16进制查看

   ctrl+F 搜索0x48即’H’

   在这里插入图片描述

   找到Helloworld 然后修改 为Helloworld By UE


1.4 破解实例:U盘监控器



通过一个简单的破解软件的实例,进一步展示以上软件的使用方法。


目标


U盘监控器。该软件可以从互联网上获得,也可以从本书的随书文件中找到。


任务


该软件需要注册才能使用全部功能,我们的任务是使得输入任何注册码均能注册成功。


思路


通常在注册时,程序会读取注册码,然后对注册码进行判断:正确则显示注册成功,转到正常的程序运行状态;错误则显示注册失败,转到未注册运行状态。如果我们将判断转移条件更改一下,错误则转到正常的运行状态,反之则转到未注册的运行状态。这样,如果我们输入了错误的注册号,程序也会像输入了正确的注册号一样运行,流程如图1-18所示。

图片.png


实现步骤


步骤1 首先运行该软件,获取与破解有关的提示信息。


打开软件,进行注册。随便输入注册码,单击注册以后,系统出现一个对话框提示“注册失败!”,如图1-19所示。这个字符串就是我们要获取的与破解有关的提示信息

图片.png


   注意:这个USB监控程序 在书附源码文件中,可以私信找我要


步骤2 使用FlexHEX获取“注册失败!”字符串的文件偏移地址。

步骤3 使用OD获取引用该字符串的指令在内存中的地址。

步骤4 使用W32DASM 获取判断语句的位置。

步骤5 使用OD更改指令字节码。

步骤6 重新测试


1.5 初识PE文件



PE (Portable Executeable File Format,可移植的执行体文件格式),使用该格式使链接生成的EXE文件能在不同的CPU工作指令下工作。

可执行文件的格式是操作系统工作方式的真实写照。Windows操作系统中可执行程序有好多种,

比如 COM、PIF、SCR、EXE 等,这些文件的格式大部分都继承自PE。其中:


   EXE是最常见的PE文件,

   动态链接库(大部分以dll为扩展名的文件)也是PE文件。


本书只涉及这两种类型的PE文件。


简单了解PE字节码编排


分析结构


我们首先以HelloWorld.exe为例,简单地了解一下PE格式文件的字节码编排。如果你手头没有合适的软件,还想获取像FlexHEX那样的十六进制格式字节码内容,可以使用以下步骤。


   步骤1 生成1.txt

   步骤2 将HelloWorld.exe更改为123。注意,不要加扩展名。

   步骤3 在命令提示符下运行以下命令:

Debug 123<1.txt>2.txt


这样,就可以生成规则排列的十六进制字节码并存储在文件2.txt中,如代码清单1-2所示。是不是和FlexHEX显示的结果差不多呢?

(卡在Debug命令了,这一步骤实现,有点没搞懂)


   解决Debug命令没找到问题 参考在windows10 64位系统上使用debug命令


   思路:


       先用DOSBOX挂载c盘

       再使用debug.exe (debug.exe是16位的,默认无法在64位机器运行)


PE 结构信息


PE以200H大小对齐的

图片.png


1.6 小结



本章 主要实现:

   环境安装

   简单PE程序修改

   简单认识PE

相关文章
|
1月前
|
Java 开发工具
鸿蒙Flutter实战:02-Windows环境搭建踩坑指南
本指南介绍如何搭建鸿蒙Flutter开发环境,包括下载Flutter SDK、配置环境变量(如FLUTTER_STORAGE_BASE_URL、PUB_HOSTED_URL、DEVECO_SDK_HOME等)和检查工具版本。还提到避免项目路径过深、与SDK同盘存放等注意事项,以及解决VsCode无法识别设备的方法。
50 0
|
14天前
|
安全 前端开发 Windows
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
本文介绍了 Electron 应用在 Windows 中的更新原理,重点分析了 `NsisUpdater` 类的实现。该类利用 NSIS 脚本,通过初始化、检查更新、下载更新、验证签名和安装更新等步骤,确保应用的更新过程安全可靠。核心功能包括差异下载、签名验证和管理员权限处理,确保更新高效且安全。
26 4
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
|
1月前
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
65 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
1月前
|
API Windows
Windows之窗口原理
这篇文章主要介绍了Windows窗口原理和如何使用Windows API创建和管理窗口。
55 0
|
2月前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
3月前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
187 0
|
4月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
127 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
4月前
|
存储 安全 数据安全/隐私保护
Windows 32 汇编笔记(一):基础知识
Windows 32 汇编笔记(一):基础知识
|
3月前
|
存储 编译器 Linux
Windows 32 汇编笔记(二):使用 MASM
Windows 32 汇编笔记(二):使用 MASM
|
数据安全/隐私保护 Windows
Windows 08R2_破解管理员密码
目录 目录 破解Windows 08R2管理员密码 破解Windows 08R2管理员密码 将登录界面的功能链接变成cmd.exe的链接,通过CMD进入到目录C:\Windows\System32下,再使用net user指令来修改账号和密码。
944 0
下一篇
无影云桌面