滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE

分析

源码

一 移动重定位

直接把整张表复制后修改目录表的RVA即可

二 修改ImageBase

5.17 在看了后面的课程理解了修改ImageBase修复重定位表其实是加载PE文件时系统做的事情, 这个函数相当于在仿照这件事 怪不得之前写错了重定位表的值依然可以运行…

①首先当然是修改ImageBase
②遍历重定位表中的数据加上新旧ImageBase的差值, 就是在打印的基础上加上修改数据

重定位表的结构

在这里插入图片描述
SECTION为所属区段, RVA为大表, items为有多少数据(SizeofBlock-8)/2 因为小表为word

RVA为要修改数据的地址(非真实地址) offset为文件偏移 type为数据属性
FarAddress为真正的地址也是修改imagebase后应该修改的值

数据偏移

重定位表的结构是由各个Block组成, 每个Block的前八个字节为RVA和本块的SIZE
在这里插入图片描述
11000转换FOA后为8A00 对应2
在这里插入图片描述
数据地址应为小表+大表如第一项数据60F+011000=1160F
转换为FOA后为A0F 对应4 5
高四位为3 属性 对应6
在这里插入图片描述
真实地址为1001B002 对应7
也就是要修改的值 加上与旧IMAGEBASE的差值即可

代码

differenceOfImageBase = newImageBase - header.pOptionalHeader->ImageBase;
	while (pBaseRelocation->SizeOfBlock)
	{
		//要修改的数据大表在文件中的偏移 大表 + word 型偏移
		foaOfBlock = (DWORD)pBaseRelocation - (DWORD)pFileBuffer;
		currentBlockItems = (pBaseRelocation->SizeOfBlock - 8) / 2;	//word 表示
		addressOf_rvaOfData = pBaseRelocation->VirtualAddress;
		header.pOptionalHeader->ImageBase = newImageBase;
		while (--currentBlockItems)
		{
			rvaOfData = ((*(WORD*)(foaOfBlock + (DWORD)pFileBuffer + 8)) & 0x0fff) + addressOf_rvaOfData;
			foaOfData = (DWORD)RvaDataToFoaData(pFileBuffer, rvaOfData);
			pFarAddress = (DWORD*)(foaOfData + (DWORD)pFileBuffer);
			*pFarAddress += differenceOfImageBase;
			foaOfBlock += 2;
		}

		pBaseRelocation = (PIMAGE_BASE_RELOCATION)((DWORD)pBaseRelocation + pBaseRelocation->SizeOfBlock);
	}

结果

在这里插入图片描述

一些问题

1 在修改后调用发现反汇编中并没有改变, 然后想到在win10上是动态加载Imagebase, 修改OptionalHeader中的DLLCharacteristic低8位为00即可 具体见ASLR pe分析

2
当IMAGEBASE>7FFFFFFF后系统会自动修正
在这里插入图片描述
ps: 建了个学习讨论群, 欢迎新朋友加入:1094301686

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PE文件格式逆向解析成汇编语言是一个非常复杂的任务,需要对PE文件格式有深入的了解,并且需要具备较强的反汇编技能。以下是一个简单的示例,演示如何将PE文件头部信息逆向解析成汇编语言: ``` ; 定义IMAGE_DOS_HEADER结构体 IMAGE_DOS_HEADER struct e_magic dw ? e_cblp dw ? e_cp dw ? e_crlc dw ? e_cparhdr dw ? e_minalloc dw ? e_maxalloc dw ? e_ss dw ? e_sp dw ? e_csum dw ? e_ip dw ? e_cs dw ? e_lfarlc dw ? e_ovno dw ? e_res dw 4 dup(?) e_oemid dw ? e_oeminfo dw ? e_res2 dw 10 dup(?) e_lfanew dd ? IMAGE_DOS_HEADER ends ; 定义IMAGE_NT_HEADERS结构体 IMAGE_NT_HEADERS struct Signature dd ? FileHeader IMAGE_FILE_HEADER <> OptionalHeader IMAGE_OPTIONAL_HEADER32 <> IMAGE_NT_HEADERS ends ; 定义IMAGE_FILE_HEADER结构体 IMAGE_FILE_HEADER struct Machine dw ? NumberOfSections dw ? TimeDateStamp dd ? PointerToSymbolTable dd ? NumberOfSymbols dd ? SizeOfOptionalHeader dw ? Characteristics dw ? IMAGE_FILE_HEADER ends ; 定义IMAGE_OPTIONAL_HEADER32结构体 IMAGE_OPTIONAL_HEADER32 struct Magic dw ? MajorLinkerVersion db ? MinorLinkerVersion db ? SizeOfCode dd ? SizeOfInitializedData dd ? SizeOfUninitializedData dd ? AddressOfEntryPoint dd ? BaseOfCode dd ? BaseOfData dd ? ImageBase dd ? SectionAlignment dd ? FileAlignment dd ? MajorOperatingSystemVersion dw ? MinorOperatingSystemVersion dw ? MajorImageVersion dw ? MinorImageVersion dw ? MajorSubsystemVersion dw ? MinorSubsystemVersion dw ? Win32VersionValue dd ? SizeOfImage dd ? SizeOfHeaders dd ? CheckSum dd ? Subsystem dw ? DllCharacteristics dw ? SizeOfStackReserve dd ? SizeOfStackCommit dd ? SizeOfHeapReserve dd ? SizeOfHeapCommit dd ? LoaderFlags dd ? NumberOfRvaAndSizes dd ? DataDirectory dd 16 dup(?) IMAGE_OPTIONAL_HEADER32 ends ; 定义节结构体 IMAGE_SECTION_HEADER struct Name db 8 dup(?) VirtualSize dd ? VirtualAddress dd ? SizeOfRawData dd ? PointerToRawData dd ? PointerToRelocations dd ? PointerToLinenumbers dd ? NumberOfRelocations dw ? NumberOfLinenumbers dw ? Characteristics dd ? IMAGE_SECTION_HEADER ends ; 定义变量 dos_header IMAGE_DOS_HEADER <> nt_headers IMAGE_NT_HEADERS <> section_headers IMAGE_SECTION_HEADER 16 dup(?) ; 读取PE文件 filename db 'test.exe', 0 handle dw ? buffer db 512 dup(?) bytes_read dw ? section_table_offset dd ? size_of_section_table dd ? ; 打开文件 mov ah, 3dh mov al, 0 ; 只读模式 mov dx, offset filename int 21h mov handle, ax ; 读取DOS头部信息 mov ah, 3fh mov bx, handle mov cx, sizeof IMAGE_DOS_HEADER mov dx, offset dos_header int 21h ; 获取PE头部偏移地址 mov ax, word ptr [dos_header+0x3c] mov bx, handle mov cx, sizeof IMAGE_NT_HEADERS mov dx, offset nt_headers add dx, ax int 21h ; 解析PE头部信息 mov ax, word ptr [nt_headers.Signature] cmp ax, 'PE' jne exit_program ; 解析文件头部信息 mov ax, word ptr [nt_headers.FileHeader.NumberOfSections] mov section_table_offset, dx mov size_of_section_table, ax * sizeof IMAGE_SECTION_HEADER add dx, sizeof IMAGE_FILE_HEADER mov cx, sizeof IMAGE_FILE_HEADER mov si, offset nt_headers.FileHeader mov di, dx rep movsb ; 解析可选头部信息 mov ax, word ptr [nt_headers.OptionalHeader.Magic] cmp ax, IMAGE_NT_OPTIONAL_HDR32_MAGIC jne exit_program mov cx, sizeof IMAGE_OPTIONAL_HEADER32 mov si, offset nt_headers.OptionalHeader mov di, dx rep movsb ; 解析节信息 mov ah, 3fh mov bx, handle mov cx, size_of_section_table mov dx, offset section_headers add dx, section_table_offset int 21h exit_program: ; 关闭文件 mov ah, 3eh mov bx, handle int 21h ``` 以上代码仅为示例,实际上解析PE文件格式的过程要比这个更加复杂,需要对不同的结构体进行不同的解析方式,并且需要处理一些特殊情况。同时,反汇编的过程中还需要考虑一些优化问题,例如去除无用代码、还原函数调用等,以确保反汇编的代码正确、可读性强。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四位

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值