通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
《加密解密 技术内幕》2.2 手工构造一个超微型的 PE 文件
责任编辑:酷酷の鱼   更新日期:2008-3-14
 

 

IMAGE_FILE_HEADER STRUCT
 Machine    *
 NumberOfSections  *
 TimeDateStamp
 PointerToSymbolTable
 NumberOfSymbols
 SizeOfOptionalHeader  *
 Characteristics   *
IMAGE_FILE_HEADER ENDS

IMAGE_OPTIONAL_HEADER32 STRUCT
 Magic    *
 MajorLinkerVersion
 MinorLinkerVersion
 SizeOfCode
 SizeOfInitializedData
 SizeOfUninitializedData
 AddressOfEntryPoint  *
 BaseOfCode
 BaseOfData
 ImageBase   *
 SectionAlignment  *
 FileAlignment   *
 MajorOperatingSystemVersion *
 MinorOperatingSystemVersion *
 MajorImageVersion  *
 MinorImageVersion  *
 MajorSubsystemVersion  *
 MinorSubsystemVersion  *
 Win32VersionValue  *
 SizeOfImage   *
 SizeOfHeaders   *
 CheckSum
 Subsystem   *
 DllCharacteristics  *
 SizeOfStackReserve  *
 SizeOfStackCommit  *
 SizeOfHeapReserve  *
 SizeOfHeapCommit  *
 LoaderFlags
 NumberOfRvaAndSizes  *
 DataDirectory
IMAGE_OPTIONAL_HEADER32 ENDS

对于 DataDirectory 中不需要的成员可以不要,只留下 Export Directory 和 Import Directory。

整个 PE Header 的大小为 88h 字节,其中 Optional Header 的大小为 70h 字节。

3. Section Table

IMAGE_SECTION_HEADER STRUCT
    Name1    <-- ZTS 编写
    union Misc
        PhysicalAddress
        VirtualSize   <-- B4 00 00 00
    ends
    VirtualAddress   <-- 00 00 00 00
    SizeOfRawData   <-- B4 00 00 00
    PointerToRawData   <-- 00 00 00 00
    PointerToRelocations  <-- 00 00 00 00
    PointerToLinenumbers  <-- 00 00 00 00
    NumberOfRelocations   <-- 00 00
    NumberOfLinenumbers   <-- 00 00
    Characteristics   <-- E0 00 00 E0
IMAGE_SECTION_HEADER ENDS

整个文件的内容就是节的内容,最后文件的全部内容会被完整的映射到 400000h 的地址处。

因为映射到内存中后文件的内容后面都是 0,所以相当于节表以一个全 0 元素结束。

4. Import

文件只需要从 user32.dll 中输入一个函数 MessageBoxA,所以输入表中有一个非 0 成员
和一个结束的全 0 成员。就因为要保证有一个全 0 成员来结束输入表,所以也把输入表放
在文件的末尾,和节的情况一样,当文件被映射到内存中后,文件后面的内容都是 0,就相当
于有一个全 0 成员。

一个输入表成员的大小是 20 字节,在节表当中找出没有被利用的域用来放输入表,找到了从
SizeOfRawData 开始的位置。输入表中的 OriginalFirstThunk ,TimeDateStamp 和 
ForwarderChain 都是没用的域,不用管他们是什么值,所以不会因为在节表中插入输入表而
改变节表中有用的域:SizeOfRawData 和 PointerToRawData 。

还有的就是 Name 和 FirstThunk 啦,在文件中找到偏移 0Ch 的地方写入 user32.dll,然
后把 Name 指向偏移 0Ch,这个偏移就是文件头中 TimeDateStamp 的偏移位置。在文件中再
找到一个偏移位置 78h 来放 IAT,然后把 FirstThunk 指向偏移 78h,这个偏移是文件头中
NumberOfRvaAndSizes 的偏移位置。在上面虽然说了 NumberOfRvaAndSizes 域不能随便填
数据(打了 * 标志),但这个域只要不填 2 以下的值就可以,所以我们可以利用。

填好的样子如下:

00000070                         C4 01 00 80 00 00 00 00 ................
00000080
00000090                                     B4 00 00 00 ................
000000A0 00 00 00 00 00 00 00 00 0C 00 00 00 78 00 00 00 ............x...

为了减少文件的大小,输入 MessageBoxA 函数是通过序号的方式引入的。

手工写好输入表之后把输入表的偏移和大小填到 DataDirectory 数组的 Import Directory 
成员中去,偏移为 9Ch,大小为 28h。

5. 代码

所有准备工作做完就开始写代码,代码也需要从文件头中间找没用的域来存放。找找文件头发现
还有两个地方没有被使用,一个是 MajorLinkerVersion 开始的 14 个字节,偏移为 1Eh,另
一个是 BaseOfCode 开始的 8 个字节,偏移为 30h。

需要的代码写好就是下面的样子:

0000001E: 6A00            push        0
00000020: B88C004000      mov         eax,40008C
00000025: 50              push        eax
00000026: 50              push        eax
00000027: 6A00            push        0
00000029: EB05            jmp         000000030

00000030: FF1578004000    call        dword ptr [00400078]
00000036: C3              ret

把代码对应的 16 进制值填到偏移 1Eh 和 30h 处就行了。

保存文件,所有的工作就结束了。最后把注意事项再总结一下:

1. 如果 FileAlignment 小于 200h,则要求 FileAlignment == SectionAlignment >= 2

2. 如果 FileAlignment 小于 200h,则要求 VirtualAddress == PointerToRawData

3. VirtualSize <= SizeOfRawData

4. SizeOfHeaders < SizeOfImage

5. NumberOfRvaAndSizes >= 2 数据目录结构的数量要求不小于 2

6. 节表和输入表都要求有一个结束的全 0 成员


胡乱写了一点,希望不会浪费大家太多时间,如果有错误还望各位大侠指点指点,也好让象我这
样的菜鸟能多学一些东西。

上一页  [1] [2] 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 Delphi编程培训班开课了
    普通文章 万元赏金 寻找动易SiteWeaver CMS/eShop 产品安全漏洞
    普通文章 瑞星公司03月15日发布 每日计算机病毒及木马播报
    推荐文章 [推荐]Windows用户摆脱黑客攻击的方法
    普通文章 加密与你零距离 个人隐私不泄露!
    普通文章 解开高强度文件夹加密大师里面的"秘密"
    普通文章 运用Windows命令 识别木马蛛丝马迹
    普通文章 拔营起寨 插入式木马的清除方法!
    普通文章 电脑菜鸟必懂 常见木马连接的原理
    普通文章 计算机在中毒后的五大紧急处理措施
    热门文章
    普通文章安全你我他:IPS与IDS技术路向何方?
    普通文章企业用户防御网络威胁十要素
    普通文章使用360安全卫士 教你五分钟搞定装机
    普通文章针对性防御手段 十招教你应对邮件欺诈
    普通文章设置Web邮箱黑客警报器 防止财务损失
    普通文章Discuz! 6 后台拿Shell的方法
    普通文章如何使电脑无法更改系统用户名
    推荐文章推荐:XSS攻击Cookie欺骗中隐藏JavaScript执行
    普通文章瑞星公司03月05日发布 每日计算机病毒及木马播报
    普通文章微软证实Hotmail登录故障未解决 遭用户抗议
    精彩专题