逆向--基础知识篇

article/2025/9/19 2:12:14

基础知识

可执行文件

计算机中可以被直接执行的程序被称之为可执行文件,可执行文件中是由指定操作系统的可执行文件格式规范与当前CPU机器指令码组成。不同的操作系统、不同的CPU之间的可执行文件都可能存在或多或少的差异。本篇主要以Windows操作系统、x86架构的CPU进行参考。

Windows中的可执行文件格式被称之为PE文件格式。是向操作系统描述程序该如何被加载,CPU指令从文件何处执行,需要给程序分配多少内存空间,以及空间如何布局等。如图1.1

[图1.1 使用Petools工具分析PE文件信息]

可执行文件的生成

构造这种文件需要编译器,曾经的开发者通过直接面向CPU机器指令编程,使用的是的汇编语言,通过汇编器生成可执行文件。随着开发应用程序的功能逐渐复杂,汇编语言的效率显得十分低下。开发者们希望有这么一个程序,这个程序可以把人们常用的语句翻译成一条或多条汇编语句,至此C语言的编译器就诞生了。如此下来人们只需要写遵循指定语法的人类语言,C语言编译器可以将其转换为对应功能的汇编代码。随后通过汇编器将其转换为CPU能够直接执行的机器码。如图 1.2。

[图1.2 使用VS2019显示C语言汇编]

何为逆向

逆向是为了逆转这个过程,通过分析汇编代码还原程序逻辑从而获得程序某处的设计。我们可以很轻松的拿到程序执行的汇编代码,因为它们与CPU机器码是一一对应的。虽然ida有将其转换为C代码的能力,但这依赖于IDA自身的推测分析,轻度的针对性混淆就可以导致ida无法推测出代码的意图从而转换C代码失败。所以我们有必要学会简单的汇编和C语言与汇编转换的某些固定约定,以便对抗一些指令混淆行为。在此之前需要有一定的C语言基础知识,大概需要了解到指针左右。

C语言--数据存储格式

变量

变量——用于标识和存储计算结果的概念。不同类型的变量有着不同的存储空间大小和存储的格式。

整数

对于char到long long都是有符号整数的存储方式,其最高位为符号位,其余位表示数字。区别是其能够存放的数值大小不同,如图 2.1,2.2。

char 只能存放一个字节,主要用来存放文字编码。long long为8个字节,用来存放大数字。

[图2.1 整型对应大小]

[图2.2 整型存储格式]

无符号(unsigned )的存储格式则是将符号位也用来存放二进制数字,如图2.3。

[图2.3 无符号整型存储格式]

在不同的CPU中存储与解析数据的模式分为两种——大端模式与小端模式

大端模式下:总是将数值中最高位的字节存在前面,最低位的字节存在后面

小端模式下:总是将数值中最低位的字节存在前面,最高位的字节存在后面

[图 2.4 大小端模式存储0x11223344]

我们常用的8086 系列芯片就是小端模式,小端模式有个好处:类型转化时无需重新组合,只需要向后延申00。因为44 33 22 11 00 00 00 00同样标识0x11223344,而大端的11 22 33 44需要按需向后移动00 00 00 00 11 22 33 44.

浮点数

浮点数的存储格式相对较为复杂,它与科学计数法类似,相当于2进制的科学计数法。格式如图 2.5

[图 2.5 浮点数的数据格式]

S: 符号位,为0是非负数,为1是负数

E: 二进制指数位

M: 二进制尾数位

10进制的科学计数法是将数值控制在1~10之间,算法如下:

1234.5678 = 1234.5678 * 10^0

= (1234.5678 / 10)*10^1

= (123.45678 / 10 )*10^2

以此类推,直到

1.2345678 * 10^3

2进制与10进制类似

1234.5678 = 1234.5678 * 2 ^ 0

= (1234.5678 / 2)*2^1

= (617.2839 / 2)*2^2

以此类推,直到小数点开头数字<2 且>1。

= 1.2056326171875 * 2^10

得出指数位 10 (十进制)

但有一点区别,2进制不能够表示像1.20563... 十进制的小数。因此需要些算法。

0.2056326171875 (舍去开头的1)

0.2056326171875 * 2 >= 1 ... 0

0.411265234375 * 2 >= 1   ... 0

0.82253046875 * 2 >= 1   ... 1

0.6450609375 * 2 >= 1 ... 1

0.290121875 * 2 >= 1 ... 0

0.58024375 * 2 >= 1 ... 1

0.1604875 * 2 >= 1 ... 0

0.320975 * 2>= 1 ... 0

0.64195 * 2 >= 1 ... 1

0.2839 * 2 >= 1 ... 0

0.5678 * 2 >= 1 ... 1

0.1356 * 2 >= 1 ... 0

0.2712 * 2 >= 1 ... 0

0.5424 * 2 >= 1 ... 1

0.0848 * 2 >= 1 ... 0

0.1696 * 2 >= 1 ... 0

0.3392 * 2 >= 1 ... 0

0.6784 * 2 >= 1 ... 1

.....

得出52位的二进制尾数0011010010100100010101101101010111001111101010101101

得出的十进制指数位 10

指数位为了兼容负指数的存在需要进行简单的运算, 参考图2.6。

[图 2.6 浮点数指数的存储格式]

10+127 = 137 ==转二进制==> 10001001

将其按照图 2.5描述进行拼接得出二进制数值:

float: 0|10001001|00110100101001000101011 ==HEX=> 449A522B

double: 0|10000001001|0011010010100100010101101101010111001111101010101101

==HEX=> 40934A456D5CFAAD

[图 2.7 double类型存储1234.5678]

结构体

结构体无非是将内部所有的成员叠加在一起存储。如图 2.8:

[图 2.8 结构体的存储格式]

他们虽然是叠在一起的,但是并没有紧贴在一起,像是以某种特殊的形式布局——内存对齐机制

因为每一次内存请求都是对齐的,可能是4或者8或者其他偏移与大小取出内存数值,内存对齐机制为了能够仅一次访问内存就取出需要的所有数据,减少不必要的多次内存访问以牺牲存储空间来提高读取效率

内存不对齐访问如图 2.9所示,需要不必要的多次访问内存。

[图 2.9 不对齐内存访问]

对于内存对齐的规则很简单:变量存储起始地址必须是存储大小的整倍数

如上图 2.7 结构中的b成员,其大小为2但上个成员后偏移为1,这时需要对齐2字节,则b成员的起始地址需要从2开始大小为2。

结构中的e成员,其大小为8但上个成员后偏移为12,这时需要对齐8字节,则b成员的起始地址需要从16开始大小为8。


http://chatgpt.dhexx.cn/article/IU2voAAZ.shtml

相关文章

逆向入门到入土

第一章 概述 学了几个月的逆向&#xff0c;记得10月份国庆节刚开始学的时候 感觉找flag蛮有意思&#xff0c;看着一个up主的视频&#xff0c;那时候c语言也没怎么学&#xff0c;所以就单纯他怎么做&#xff0c;我自己怎么做&#xff0c;后面去一些ctf靶场做了几道题&#xff0…

BNU1064:人品问题

“人品既不能被创生&#xff0c;也不能被消灭。只能从一个人转移到另一个人&#xff0c;从一个层面转化到另一个层面&#xff0c;而在转移和转化的过程当中&#xff0c;人品的总和保持不变。” 至此引出人品学(Characterics)三定律&#xff1a; 第一定律&#xff1a;即人品守恒…

开发者的人品问题

程序员都知道&#xff1a;绝大多数编程中的问题&#xff0c;最终都是自己的人品问题。当遇到奇怪的问题时&#xff0c;我们总是喜欢怀疑系统、怀疑编译器、怀疑网络、怀疑硬件……就是不愿意怀疑自己的人品。熬过几个不眠之夜后&#xff0c;最终还是发现自己的代码存在人品问题…

A. 人品问题

A. 人品问题 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: Main Submit Status PID: 1064 Font Size: - “人品既不能被创生&#xff0c;也不能被消灭。只能从一个人转移到另一个人&#xff0c;从…

BNU 1082 人品问题

这个题我是1A 突然觉得自己好叼 #include<bits/stdc.h> int main() {printf("25\n");return 0; }

人品问题

Description 网上出现了一种高科技产品——人品测试器。只要你把你的真实姓名输入进去&#xff0c;系统将自动输出你的人品指数。yzx不相信自己的人品为0。经过了许多研究后&#xff0c;yzx得出了一个更为科学的人品计算方法。这种方法的理论依据是一个非常重要的结论&#xff…

人品差的人,开口闭口都是这些话,一定不要深交!

说话之道&#xff0c;也是为人之道。 言语是思想的发声&#xff0c;从一个人的话里&#xff0c;往往可以听出其内心的声音。 从而初步判断出一个人的人品如何&#xff0c;是否值得交往。 那些人品差的人&#xff0c;开口闭口都离不开以下三种话&#xff0c;身边若有此类人&a…

adb logcat 命令行用法

本文为转载。 作者 :万境绝尘 转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 adb logcat --help 命令, 就可以显示该命令的帮助信息; [plain] view plain copy octopusoctopus:~$ ad…

java logcat_logcat -- 基本用法

1.Log类是一个日志类&#xff0c;我们可以在代码中使用logcat打印出消息 常见的日志记录方法有&#xff1a; v(String,String) --verbose 显示全部信息 d(String,String) -- debug 显示调试信息 i(String,String) -- information 显示一般信息 w(String,String) -- warning 显…

Logcat使用

目录 一、Logcat窗口 二、过滤 logcat 消息 三、Logcat的日志级别 四、设置日志信息颜色 一、Logcat窗口 Logcat在哪里&#xff1f;我都是直接点击工具栏中的Logcat图标。 Logcat窗口是用来查看应用日志的啦&#xff0c;我把每个部分标注了一下。 二、过滤 logcat 消息 一…

[Android]Logcat调试

Android采用Log(android.util.log)工具打印日志&#xff0c;它将各类日志划分为五个等级。 Log.e 打印错误信息 Log.w 打印警告信息 Log.i 打印一般信息 Log.d 打印调试信息 Log.v 打印冗余信息 不同等级的日志信息&#xff0c;在日志栏中会以不同颜色和等级(E、W、…

java logcat_使用 Logcat 写入和查看日志

Android Studio 中的 Logcat 窗口会显示系统消息,例如在进行垃圾回收时显示的消息,以及使用 Log 类添加到应用的消息。此窗口可以实时显示消息,也可以保留历史记录,因此您可以查看较早的消息。 要仅显示感兴趣的信息,您可以创建过滤器、修改消息中显示的信息量、设置优先级…

adb 抓取logcat 日志

&#xff08;1&#xff09;确保计算机里面有以下三个文件&#xff0c;才能抓取logcat日志&#xff08;只需要这三个文件就可以了&#xff09;。如果你的计算机有android sdk&#xff0c;以下三个文件会在你的sdk下的platform-tools文件夹里面。如果需要打印logcat日志的计算机没…

新版logcat最全使用指南

前言&#xff1a; 俗话说&#xff0c;工欲善其事&#xff0c;必先利其器。logcat是我们通过日志排查bug的重要武器之一。从某个版本开始&#xff0c;logcat改版了&#xff0c;改版之后&#xff0c;也许某些人觉得不太习惯&#xff0c;但是如果稍微学习下之后&#xff0c;就发现…

logcat命令介绍

1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息 log类是一个日志类&#xff0c;可以在代码中使用logcat打印出消息 常见的日志纪录方法包括&#xff1a; 方法 描述 v(String,String) (vervbose)显示全部信息d(Stri…

logcat命令总结

一、logcat命令介绍 1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息 log类是一个日志类&#xff0c;可以在代码中使用logcat打印出消息 常见的日志纪录方法包括&#xff1a; 方法 描述 v(String,String) (verv…

Android Studio 使用 Logcat 写入和查看日志

使用 Logcat Logcat是日常开发的重要组成部分。如果您看到其中一个“强制关闭”或“已停止”对话框&#xff0c;您要做的第一件事就是检查与此崩溃相关的 Java 堆栈跟踪。这些被记录到一个名为 Logcat 的工具中&#xff0c;其目的是显示来自您设备的所有日志。它显示来自模拟器…

Android logcat命令详解

参考网址&#xff1a;https://www.cnblogs.com/JianXu/p/5468839.html 一、logcat命令介绍 二、logcat缓冲区 三、logcat命令参数 四、logcat格式化输出 五、logcat优先级 一、logcat命令介绍 1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具&#xf…

机器学习:EM算法

一、初识EM算法 EM算法也称期望最大化&#xff08;Expectation-Maximum,简称EM&#xff09;算法。 它是一个基础算法&#xff0c;是很多机器学习领域算法的基础&#xff0c;比如隐式马尔科夫算法&#xff08;HMM&#xff09;等等。 EM算法是一种迭代优化策略&#xff0c;由于…

什么是em?

em是一个相对大小&#xff0c;我们可以这样来设置大小&#xff0c;如&#xff1a;1em,0.5em等。 所谓相对&#xff0c;必然存在一个参照物。这里的参照物指的就是父级元素的大小&#xff0c;按照css元素的继承关系&#xff08;并非所有元素都有继承关系&#xff09;&#xff0…