文章目录

  • 前言
    • 前期准备
  • 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命令

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

配置

配置lib

配置include

代码

.386
;CPU mode
.model flat ,stdcall
option casemap : noneinclude windows.inc
include user32.inc
include kernel32.incincludelib user32.lib
includelib kerne132.lib;数据段
.data
szText db 'Helloworld',0
;代码段
.code
main :invoke MessageBox,NULL,offset szText ,NULL,MB_OKinvoke 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就成功显示

masm32运行

1.进入工作区

2.编译源文件

在当前工作区中输入命令

ml -c -coff Helloworld.asm

然后回车。
参数-c表示独立编译,不进行链接;
参数-coff表示编译后生成标准的COFF目标文件。
编译以后会在源文件所在目录生成一个与源文件同名的obj目标文件。
ml.exe是汇编语言的编译程序,它负责将汇编源程序编译成目标文件。该程序可接受的各参数的解释和描述如下所示:

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

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

link -subsystem:windows Helloworld.obj

参数-subsystem表示允许该代码运行的子系统。
如果没有错误,执行以上命令后会在源文件所在目录下生成最终的可执行文件HelloWorld.exe。链接程序的参数解释如下:

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. 栈区

指令解释区

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

  • 指令所在的内存地址、
  • 指令字节码、
  • 反汇编后的指令语句,
  • 以及指令相关的注释。

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位置打断点

调试

  1. 找到Helloworld F2打断点
  2. (1) Call F7进入MessageBox
  3. (2)Call F7 进入ExitProcess

1.2.2 修改Exe文件字节码

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

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

  2. 重写写入内容

  3. 运行修改
    OK->F9放开断点

注意
1.要选中足够的大小的内容 大小少了是无法增加的
2.注意内容中的’.‘需要替换成空格 不然就提前\0结束字符串显示内容了
就变成Helloworld\0by OD 显示不全

  1. 保存修改

1.2.3 静态分析

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

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

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

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

1.3 十六进制编辑软件FlexHex

UltraEdit(下载地址)
WinHex
我用的是UltraEdit

1.3.1 UE修改程序

  1. UE打开Helloworld.exe
  2. ctrl+H 16进制查看
  3. ctrl+F 搜索0x48即’H’
  4. 找到Helloworld 然后修改 为Helloworld By UE

1.4 破解实例:U盘监控器

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

目标

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

任务

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

思路

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

实现步骤

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

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

注意:这个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 生成1.txt
  2. 步骤2 将HelloWorld.exe更改为123。注意,不要加扩展名。
  3. 步骤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大小对齐的

1.6 小结

本章 主要实现:

  • 环境安装
  • 简单PE程序修改
  • 简单认识PE

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

  1. 读书笔记--Android Gradle权威指南(上)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...

  2. 【读书笔记】Jenkins权威指南

    目录 一.Jenkins权威指南 二.书摘 第一章.Jenkins简介 第二章.迈入Jenkins的第一步 第三章.安装Jenkins 第四章.配置Jenkins服务器 第五章.设置构件作业 第六章. ...

  3. android开发读书笔记,android开发权威指南读书笔记

    第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...

  4. 读书笔记《CSS权威指南》

    阅读本书主要目的: 自从学会CSS以来,虽然熟练掌握了其使用方法和技巧,但对其底层的原理和实现并不清晰,阅读本书想进一步系统化的学习和深入研究其本质,对这门前端基础语言从熟练使用到真正理解. 第1章 ...

  5. 读书笔记《Hadoop权威指南第4版(Hadoop The Definitive Guide 4th)》

    Chapter 1 Meet Hadoop Data Storage and Analysis The problem is simple: although the storage capaciti ...

  6. [读书][笔记]WINDOWS PE权威指南《零》PE基础

    参考: https://zhuanlan.zhihu.com/p/47075612 https://docs.microsoft.com/zh-cn/windows/win32/debug/pe-fo ...

  7. 《Windows 8 权威指南》——1.5 版本对比

    本节书摘来自异步社区<Windows 8 权威指南>一书中的第1章,第1.5节,作者:胡耀文 , 尹成 , 李贝贝 , 卢磊 , 曹珍著,更多章节内容可以访问云栖社区"异步社区& ...

  8. 《Windows 8 权威指南》——1.3 引入全新内核休眠模式,实现“瞬间开机”

    本节书摘来自异步社区<Windows 8 权威指南>一书中的第1章,第1.3节,作者:胡耀文 , 尹成 , 李贝贝 , 卢磊 , 曹珍著,更多章节内容可以访问云栖社区"异步社区& ...

  9. 《Windows 8 权威指南》——2.10 几招解决Windows 8 Metro应用打不开的问题

    本节书摘来自异步社区<Windows 8 权威指南>一书中的第2章,第2.10节,作者:胡耀文 , 尹成 , 李贝贝 , 卢磊 , 曹珍著,更多章节内容可以访问云栖社区"异步社区 ...

最新文章

  1. 订阅者java,RxJava:“ java.lang.IllegalStateException:只允许一个订阅者!”
  2. RPC和MQ对比及其适用/不适用场合
  3. Silverlight 1.0 beta 和1.1 Alpha体验
  4. 实战:配置内网DNS实现内部域名解析
  5. 前端三大主流框架到底学哪个好呢?
  6. pyenchant英文单词拼写检查
  7. SpringSecurity,jwt oathu sso,YeZiJie
  8. sklearn和libsvm吗_机器学习笔记(3)-sklearn支持向量机SVM
  9. [纯代码] Swift+UIKit · 搭建第一个iOS APP项目
  10. 谷歌学术简明使用说明
  11. Android 解析软件包时出现问题
  12. html图片自动适应窗口大小,使用CSS自动调整浏览器大小的图片大小
  13. Arduino文档阅读笔记-4 WHEEL ROBOT CAR BASIC EXAMPLE
  14. 计算机评分主硬盘分数低,鲁大师跑分详解-内存篇:内存跑分为什么比别人低?分数差在哪?...
  15. 大厂offer?拿来吧你!网易有道笔试编程题特辑
  16. 【验证码一】验证码Demo
  17. 浪潮信息服务器拆解,从容大气 浪潮英信NF8560M2服务器拆解
  18. WEB2.0时代我还开网店干什么?
  19. GRS认证现场稽核之范围与目的
  20. 新增大论坛WPS Office

热门文章

  1. 基于neo4j知识图谱的智能问答系统
  2. autobank渗流分析计算教程_AutoBank免费版
  3. 【latex】3 会议期刊论文模板的使用方法(包括矢量图片处理方法)
  4. Stream GTAV转Epic
  5. 数据库身份证号用什么类型_这10种情况,看看你适合用什么类型的造口袋
  6. solidworks电气元件3d库_用SolidWorks绘制菱形钢丝网,方法简单实用你也可以学会...
  7. 并不简单的翻页时钟(一):样式篇(Flex布局、line-height、data-set用法、css before after伪元素)
  8. 调用ArcToolBox里的Tool的三种方法
  9. C语言—字符串与字符数组,字符串数组与字符串指针的区别
  10. JavaScript-字符串知识讲解