逆向工程核心原理读书笔记 04
# 第14章 运行时压缩upx后,简单看下两个文件:
!(./mdimg/14/image-20211102202744747.png)
压缩后所有头不变,只有节区变了。名字也变了,并且变了之后的第一个节区在文件中的大小直接为0。且第二个第三个节区都提前了。
资源节表.rsrc基本没变
# 第15章 调试upx后的notepad
先看下原来的notepad:
!(./mdimg/14/image-20211102204507623.png)
刚加载进去的时候判断了头部的两个标志。
接下来分析upx后的notepad:
!(./mdimg/14/image-20211102204821783.png)
刚进去有个pushad,意思是将eax到edi的所有保存到栈
下面介绍几个常用的跟踪快捷键:
- ctrl+f7:反复执行步入,有显示
- ctrl+f8:反复执行步过,有显示
## 第一个循环:
!(./mdimg/14/image-20211102205757447.png)
!(./mdimg/14/image-20211102210045777.png)
就是将edx中的东西一字节一字节的放入edi所指的地方,而edi所指的正是第一个节区,upx0
下好断点,f9跳出循环
## 第二个循环
比较大,不贴了。
就是从esi所指的地方(第二个节区)依次取值,经过一些运算后,放到edi所指的地方(第一个节区 )
## 第三个循环
!(./mdimg/14/image-20211102211749494.png)
## 第四个循环;
!(./mdimg/14/image-20211102212335284.png)
就是一直设置IAT表了
# 第16章 基址重定位
这里还是使用notepad来演示
**ImageBase = 0x100 0000**
因为ASLR的原因,随机加载:
!(./mdimg/14/image-20211103225848618.png)
上面红框的都是text节区的IAT区域,
使硬编码在 程序中的内存地址随当前加载地址变化而改变的处理过程叫重定位。
可以比较下在内存与文件:
!(./mdimg/14/image-20211103230326363.png)
随机加的地址是:0xA01000。
文件中是以ImageBase为基准,
## 重定位的原理
原理:
> - 在程序中查找硬编码的位置
> - 读取后,减去ImageBase(VA->RVA)
> - 之后加上实际的加载地址 ,(转为VA)
重要的就是查找的过程,会用到PE中的重定位表。重定位表:记录硬编码地址偏移的列表。
第六个`struct IMAGE_DATA_DIRECTORY BaseRelocationTable`:
**!(./mdimg/14/image-20211103231634994.png)**
基址重定位是`IMAGE_BASE_RELOCATION`的数组
```c
typedef struct _IMAGE_BASE_RELOCATION {
DWORD VirtualAddress;
DWORD SizeOfBlock;
//WORD TypeOffset;
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
```
其中的TypeOffset的值就是硬编码在程序中的地址偏移
!(./mdimg/14/image-20211103233933072.png)
第一个`IMAGE_BASE_RELOCATION`结构体的sizseofblock是0x150,
!(./mdimg/14/image-20211103234222645.png)
以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
!(./mdimg/14/image-20211104181120145.png)
刚才的RVA 0x1420,hex查看:
!(./mdimg/14/image-20211104181621485.png)
是0x1C120
# 第17章 删除.reloc节区
> 步骤:
>
> 1. 整理.reloc节区头
> 2. 删除.reloc节区
> 3. 修改image_file_header
> 4. 修改image_optional_header
## 删除.reloc节区头
!(./mdimg/14/image-20211105225838812.png)
从0x270到0x297全删,
!(./mdimg/14/image-20211105225957327.png)
改为:
!(./mdimg/14/image-20211105230123285.png)
## 删除.reloc节区
从上面的pointer to raw data 看出文件偏移为0xc000
删除掉
## 修改 IMAGE_FILE_HEADER
要修改 number of section:为4
## 修改IMAGE_OPTIONAL_HEADER
修改sizeofimage
!(./mdimg/14/image-20211105230913763.png)
之前知道reloc的virtualsize为E40,所以要减去section alignment:0x1000
为0x10000
!(./mdimg/14/image-20211105231219468.png)
这样就能正常运行了:
!(./mdimg/14/image-20211105231203540.png)
果断回帖,如果沉了就是我弄沉的很有成就感 这是大佬的学习笔记, 大家赶快学习起来. 果断回帖,如果沉了就是我弄沉的很有成就感 看帖看完了至少要顶一下,还可以加入到淘帖哦!
页:
[1]