破解软件感悟-PE文件格式之实例总结(五)

有很多介绍PE文件的文章,但是我打算写一篇关于输入表的文章,因为它对于破解很有用。 
    我想解释它的最好的方法是举一个例子,你可以跟着我逐步深入,一步一步的思考,最后你将完全明白,我选择了一个我刚下载下来的小程序,它是用TASM编译的,有一个比较小的输入表,所以我想它应该是个不错的范例。 
    好了,让我们开始吧。首先我们得找到输入表,它的地址放在PE文件头偏移80处,所以我们用16进制编辑器打开我们的EXE文件,我们先得找到PE文件头的起始点,这很简单,因为它总是以PE,0,0开始,我们可以在偏移100处找到它。在一般的WIN32程序中文件头偏移被放在文件0X3C处,在那我们通常可看到00 01 00 00,由于数据存储时是低位在前,高位在后的,所以翻转过来实际就是00000100,就象前面我们说的。接下来我们就可以在PE文件中找到我们的输入表,100+80=180在偏移180处我们看到0030 0000,翻转一下,它其实应该是00003000,这说明输入表在内存3000处,我们必须把它转换成文件偏移。 
    一般来说,输入表总是在某个段的起始处,我们可以用PE编辑器来查看虚拟偏移,寻找3000并由此发现原始偏移。很简单的。打开我们看到: 
-CODE  00001000 00001000 00000200 00000600 
-DATA  00001000 00002000 00000200 00000800 
.idata 00001000 00003000 00000200 00000A00 
.reloc 00001000 00004000 00000200 00000C00 
    找一下,我们就发现.idata段的虚拟偏移是3000,原始偏移是A00,3000-A00=2600,我们要记住2600,以便以后转换其它的偏移。如果你没找到输入表的虚拟偏移,那么就找一下最接近的段。 
    来到偏移A00处,我们就看到被称为IMAGE_IMPORT_DESCRIPTORs(IID)的东东,它用5个字段表示每一个被调用DLL的信息,最后以Null结束。 
************************************************************************** 
(IID) IMAGE_IMPORT_DESCRIPTOR的结构包含如下5个字段: 
OriginalFirstThunk, TimeDateStamp, ForwarderChain, Name, FirstThunk

OriginalFirstThunk 
该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是不变的。

TimeDateStamp 
一个32位的时间标志,有特殊的用处。

ForwarderChain 
输入函数列表的32位索引。

Name 
DLL文件名(一个以00结束的ASCII字符串)的32位RVA地址。

FirstThunk 
该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是可变的。 
**************************************************************************

好了,你有没有理解?让我们看看我们有多少IID,它们从偏移A00处开始 
3C30 0000 / 0000 0000 / 0000 0000 / 8C30 0000 / 6430 0000 
{OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk} 
5C30 0000 / 0000 0000 / 0000 0000 / 9930 0000 / 8430 0000 
{OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk} 
0000 0000 / 0000 0000 / 0000 0000 / 0000 0000 / 0000 0000

每三分之一是个分界,我们知道每个IID包含了一个DLL的调用信息,现在我们有2个IID,所以我们估计这个程序调用了2个DLL。甚至我可以打赌,你能推测出我们将能找到什么。 
    每个IID的第四个字段表示的是名字,通过它我们可以知道被调用的函数名。第一个IID的名字字段是8C30 0000,翻转过来也就是地址0000308C,将它减去2600可以得到原始偏移,308C-2600=A8C,来到文件偏移A8C处,我们看到了什么?啊哈!原来调用的是KERNEL32.dll。 
    好了,接下来我们就要去找出KERNEL32.dll中被调用的函数。回到第一个IID。 
    FirstThunk字段包含了被调用的函数名的标志,OriginalFirstThunk仅仅是FirstThunk的备份,甚至有的程序根本没有,所以我们通常看FirstThunk,它在程序运行时被初始化。 
    KERNEL32.dll的FirstThunk字段值是6430 0000,翻转过来也就是地址00003064,减去2600得A64,在偏移A64处就是我们的IMAGE_THUNK_DATA,它存储的是一串地址,以一串00结束。如下:    
A430 0000/B230 0000/C030 0000/CE30 0000/DE30 0000/EA30 0000/F630 0000/0000 0000 
    通常在一个完整的程序里都将有这些。我们现在有了7个函数调用,让我们来看其中的两个: 
DE30 0000翻转后是30DE,减去2600后等于ADE,看在偏移ADE处的字符串是ReadFile, 
EA30 0000翻转后是30EA,减去2600后等于AEA,看在偏移AEA处的字符串是WriteFile, 
    你可能注意到了,在函数名前还有2个这字节的00,它是被作为一个提示。 
    很简单吧,你可以自己来试一下。回到A00,看第二个DLL的调用 
5C30 0000 / 0000 0000 / 0000 0000 / 9930 0000 / 8430 0000 
{OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk} 
    先找它的DLL文件名。9930翻转为3099-2600 =A99,在偏移A99处找到USER32.dll。再看FirstThunk字段值:8430翻转为3084-2600=A84,偏移A84处保存的地址为08310000,翻转后3108-2600=B08,偏移B08处字符串为MessageBoxA。明白了吧,接下来你就可以把这些用在你自己的EXE文件上了。 
    摘要: 
    在PE文件头+80偏移处存放着输入表的地址,输入表包含了DLL被调用的每个函数的函数名和FirstThunk,通常还有Forward Chain和TimeStamp。 
    当运行程序时系统调用GetProcAddress,将函数名作为参数,换取真正的函数入口地址,并在内存中写入输入表。当你对一个程序脱壳时你可能注意到你有了一个已经初始化的FirstThunk。例如,在我的WIN98上,函数GetProcAddress的入口地址是AE6DF7BF,在98上,所有的KERNEL32.dll函数调用地址看上去地址都象:xxxxF7BF,如果你在输入表中看到这些,你可以利用orignal thunk重建它,或者重建这个PE程序。

第二个实例:

如果我们需要保护自己的程序,可以修改PE头的大小和起始位。

实例下载

解说:

前提:需要用16进制编辑工具打开,比如:winhex,ultraedit,cs32asm等

1.       如果IMAGE_NT_HEADERS的signature域值等于"PE\0\0",那么就是有效的PE文件。我们看此处偏移0100处就是50 45,代表偏移头。

2.       我们前面讲过,在DOSMZ中有一项是用来指定PE头的起始位置的,那就在002c和002d处的值就是00 01,反过来写就是0100了。

PE头的起始位置

100  60 00

01 00

00 01

PE头的大小:

224个字节    00 E0,这个值我们前面讲过,其PE头的大小我们可以从中看到在0114 0115处。

修改的PE头:

24*16=384字节  180 反过来80 01偏移移到了0060处

然后根据需要修改偏移及大小即可完成pe头的修改。

时间: 2024-08-30 12:25:14

破解软件感悟-PE文件格式之实例总结(五)的相关文章

破解软件感悟-PE文件格式之Import Table(引入表)(四)

先来看一个可执行文件的实例:本例程打开一PE文件,将所有引入dll和对应的函数名读入一编辑控件,同时显示 IMAGE_IMPORT_DESCRIPTOR 结构各域值. C:\QQDownload\blah.EXE ================[ IMAGE_IMPORT_DESCRIPTOR ]============= OriginalFirstThunk  =  303C TimeDateStamp  =  0 ForwarderChain = 0 Name = KERNEL32.dll

C++PE文件格式解析类(轻松制作自己的PE文件解析器)

PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣的能够參看之后列出的參考资料及其它相关内容. 近期我也在学习PE文件格式,參考了很多资料.用C++封装了一个高效方便的PE文件格式解析的类. 该类对想学PE文件结构的朋友可算一份可贵的资料.代码均非常易懂,考虑较全面,具有一定的通用性. 同一时候该类也能够让想创建自己的PE文件解析软件的朋能够轻松在

PE文件格式详解(六)

0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以为找到输入DLL就完了,其实这一流程的最终功能是通过输入DLL找到输入DLL调用的函数,这一步骤是通过输出表结构中的OriginalFristThunk或者OriginalFristThunk所指向的INT或者IAT结构来找到的.这里要说明的是,虽然一般情况通过OriginalFristThunk也

深入理解 Win32 PE 文件格式

深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什么东西,那么你就是一个知识渊博的程序员.这一系列文章的第一部分,讨论最近这几年PE格式所发生的变化. 这次更新后,作者讨论了PE格式如何适应于用.NET开发的应用程序,包括PE节,RVA,数据目录,以及导入函数.附录中包含了相关的映像头结构以及它们的描述. 很早以前,我为微软系统期刊(现在叫做MSD

QQ空间一键删除留言破解软件

该破解软件批量删除空间说说.日志.留言.相册.分享.访客.微博等 由于腾讯限制,软件一天只能删除一两百条 ,无需告诉别人密码 ,自己即可删除,保护自己空间隐私不外泄.软件破解图如下: 破解版软件下载地址: 下载地址1  下载地址2   下载地址3

破解软件下载站点

对于有些人对某些软件要购买序列号很苦恼,今天我为大家推荐一些站点,能提供某些破解软件 一:3DMgame(是国内著名的游戏破解站) 许多游戏发布不久之后就被破解了,在这个地方都可以找到,相信一些游戏的爱好者一定会喜欢上这里. 二:大眼仔 这里许多的软件都是由站长亲自破解,相信大伙访问这里一定会爱上这里,爱整软件的就转移到这里来吧1 三:轻志狂 这里的软件方向主要是净化和优化了的 四:吾爱破解 是国内最大的破解论坛,破解方向很广泛.

带你认识Office密码破解软件的攻击先锋

如果将Advanced Office Password Recovery破解Office文档密码形容成一场战争,那AOPR的初步攻击一定是这场战争的先锋官.初步攻击是AOPR尝试破解密码的第一个攻击,一般就会首战告捷.本文将带你了解并掌握Office密码破解软件的初步攻击的使用方法. AOPR攻击先锋是如何工作的 初步攻击是一组事先定义好的攻击,它一般在AOPR不能立刻恢复密码的时候开始尝试破解密码.初步攻击一般有4个攻击步骤,依次是查找密码攻击.密码缓存预破解.初步字典破解.初步暴力破解.在A

带你认识Office密码破解软件的加速器

Advanced Office Password Recovery能够在同类软件中脱颖而出的重要原因之一就是极快的破解速度,而这一优势依托于Office密码破解软件的加速器,本文将主要介绍AOPR的加速器. Office文档密码难以破解的原因 从Office 2007开始,微软不断升级密码保护强度,连不常用的OpenDocument和韩文Office密码都十分牢固.在最新版Office 2013中微软又进一步提高保护实力,并且在Office 2013中使用的都是计算密集型加密方式.因此Offic

压缩文件及office密码破解软件 详记

今日因为公司的office文件被加密(而且是没意义的加密)问题而有心去找一款可以破解office加密的软件.  好吧.之前有更加大的事情我都没去寻找直接给了20块别人让别人给我破了.虽然还是某公司机密文件.唉.服了自己了. 先记一下官网: office破解的官网:http://www.passwordrecovery.cn/xiazai.html rar破解的官网:https://www.elcomsoft.com/archpr.html(不知道是不是) 先说一下rar的压缩破解软件, 忘记在哪