登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 66|回复: 4

逆向工程核心原理读书笔记 04

[复制链接]

40

主题

3

回帖

59

积分

版主

积分
59
发表于 2025-3-22 12:07:00 | 显示全部楼层 |阅读模式

第14章 运行时压缩

upx后,简单看下两个文件:

image-20211102202744747

压缩后所有头不变,只有节区变了。名字也变了,并且变了之后的第一个节区在文件中的大小直接为0。且第二个第三个节区都提前了。

资源节表.rsrc基本没变

第15章 调试upx后的notepad

先看下原来的notepad:

image-20211102204507623

刚加载进去的时候判断了头部的两个标志。

接下来分析upx后的notepad:

image-20211102204821783

刚进去有个pushad,意思是将eax到edi的所有保存到栈

下面介绍几个常用的跟踪快捷键:

  • ctrl+f7:反复执行步入,有显示
  • ctrl+f8:反复执行步过,有显示

第一个循环:

image-20211102205757447

image-20211102210045777

就是将edx中的东西一字节一字节的放入edi所指的地方,而edi所指的正是第一个节区,upx0

下好断点,f9跳出循环

第二个循环

比较大,不贴了。

就是从esi所指的地方(第二个节区)依次取值,经过一些运算后,放到edi所指的地方(第一个节区 )

第三个循环

image-20211102211749494

第四个循环;

image-20211102212335284

就是一直设置IAT表了

第16章 基址重定位

这里还是使用notepad来演示

ImageBase = 0x100 0000

因为ASLR的原因,随机加载:

image-20211103225848618

上面红框的都是text节区的IAT区域,

使硬编码在 程序中的内存地址随当前加载地址变化而改变的处理过程叫重定位。

可以比较下在内存与文件:

image-20211103230326363

随机加的地址是:0xA01000。

文件中是以ImageBase为基准,

重定位的原理

原理:

  • 在程序中查找硬编码的位置
  • 读取后,减去ImageBase(VA->RVA)
  • 之后加上实际的加载地址 ,(转为VA)

重要的就是查找的过程,会用到PE中的重定位表。重定位表:记录硬编码地址偏移的列表。

第六个struct IMAGE_DATA_DIRECTORY BaseRelocationTable:

image-20211103231634994

基址重定位是IMAGE_BASE_RELOCATION的数组

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

其中的TypeOffset的值就是硬编码在程序中的地址偏移

image-20211103233933072

第一个IMAGE_BASE_RELOCATION结构体的sizseofblock是0x150,

image-20211103234222645

以00结尾。

TypeOffset是2字节,16位大小,由4位的Type和12位的Offset组成,高4位为type,pe中常见的值为3:IMAGE_REL_BASED_HIGHLOW;64位中常见为A

所以低12位才是真正的偏移,该偏移的值是基于结构体中VirtualAddress的偏移。

所以有以下公式:

VirtualAddress(1000) + offset(420) = 1420(RVA)

这里程序被加载到了0xa00000

所以va = 0xa01420

image-20211104181120145

刚才的RVA 0x1420,hex查看:

image-20211104181621485

是0x1C120

第17章 删除.reloc节区

步骤:

  1. 整理.reloc节区头
  2. 删除.reloc节区
  3. 修改image_file_header
  4. 修改image_optional_header

删除.reloc节区头

image-20211105225838812

从0x270到0x297全删,

image-20211105225957327

改为:

image-20211105230123285

删除.reloc节区

从上面的pointer to raw data 看出文件偏移为0xc000

删除掉

修改 IMAGE_FILE_HEADER

要修改 number of section:为4

修改IMAGE_OPTIONAL_HEADER

修改sizeofimage

image-20211105230913763

之前知道reloc的virtualsize为E40,所以要减去section alignment:0x1000

为0x10000

image-20211105231219468

这样就能正常运行了:

image-20211105231203540

0

主题

39

回帖

113

积分

注册会员

积分
113
发表于 2025-3-23 10:47:57 | 显示全部楼层
果断回帖,如果沉了就是我弄沉的很有成就感
回复

使用道具 举报

0

主题

65

回帖

203

积分

注册会员

积分
203
发表于 2025-3-23 18:27:16 | 显示全部楼层
这是大佬的学习笔记, 大家赶快学习起来.
回复

使用道具 举报

0

主题

10

回帖

22

积分

新手上路

积分
22
发表于 2025-3-24 01:58:01 | 显示全部楼层
果断回帖,如果沉了就是我弄沉的很有成就感
回复

使用道具 举报

0

主题

39

回帖

113

积分

注册会员

积分
113
发表于 2025-3-24 09:55:36 | 显示全部楼层
看帖看完了至少要顶一下,还可以加入到淘帖哦!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-4-3 19:11 , Processed in 0.110579 second(s), 23 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表