PE可执行文件“减肥”实例

原创 2003年07月22日 07:59:00

    网上有很多用于查看“拨号设置”、“邮箱帐号”等密码框密码的程序,大小从几十KB到几百KB不等。其实,就是向edit控件发送一个WM_GETTEXT消息,并没有什么神秘的技术可言,程序写起来也并不复杂,大小应该几KB足以。让我们看看它到底能小到什么程度?

    (相关程序,请在www.csdn.net“软件频道→工具类软件→其他工具”处,下载“mini密码查看器”)

    要得到密码框中的密码,一个WindowFromPoint()API函数,加上一个WM_GETTEXT消息,就可以简单搞定。再加上一些交互操作,代码不会超过1KB。

    在Windows GUI环境中,当然少不了用户界面。程序是基于对话框的,其中包括一个edit,1个static和一个icon。资源部分不到1KB。

    界面太寒酸了,让它modern一些吧:增加一个ToolTip;动态改变一下Cursor;再子类化一下static,用它实现超链接功能。至此,代码小于2KB。

    PE格式文件头:1KB。

    1KB文件头+2KB代码+1KB资源=4KB,这么说,编译后程序的大小是4KB吗?NO!程序大小将超过6KB!

    用UltraEdit打开刚编译好的可执行文件观察一下,发现代码编译得并不紧凑,里面有大块的留白区域,看来程序尺寸还可以再减小。这就需要用我的InsidePE工具来仔细分析一下程序结构了。

    (相关程序,请在www.csdn.net“软件频道→工具类软件→系统工具”处,下载“InsidePE”)

    MASM将我的代码编译成4个节,分别是:
    .text :2KB,存放程序代码
    .rdata:1.5KB,存放导入表
    .data :0.5KB,存放静态数据
    .rsrc :1KB,存放程序资源
    再加上PE头1KB,共6KB。

    原来多出来的2KB是.rdata和.data节。要使程序的尺寸进一步减小,就得想办法去掉这两个节。

    对.data节的处理很简单,程序中用到的静态数据就是100来个字节的字符串,直接将它们移到.rsrc节的留白处即可。

    至此,.data节消失,程序减少了0.5KB。

    MASM对导入表的处理分为两部分,从时间效率和空间效率上都逊色于她的同门VC,有失汇编风范。

    首先,MASM在.rdata节内建立起导入表,由系统加载器负责在加载时填入相应的导入函数地址;其次,MASM在.text节内建立起“跳板”区,使所有的导入函数调用都先call到“跳板”区,然后再从这里JMP到导入表中正确的导入函数地址处。

    我们可以借鉴加壳软件的做法,只由编译器负责导入两个关键的API:LoadLibrary和GetProcAddress,然后在代码段内建立起自己的导入表,在程序加载时自己负责导入其余的函数。这样不但可以减少空间(.text节内的“跳板”区和.rdata节都不再需要了),而且还可以加密导入表来保护自己的软件,使得反汇编更加困难。

    至此,.rdata节消失,.text节增加了0.5KB,程序又减少了1KB。

    现在的程序是4.5KB,距离目标4KB还有0.5KB,看来最后只有对PE头下手了!

    在PE格式文件头中,有一个DOS块(DOS stub),它是一小段DOS程序,通常用于在DOS环境下显示一些提示信息。但在Windows下,who cares?

    MASM的Linker有一个/STUB编译选项,可以用自己写的DOSExe程序来替换默认的DOS块。用尘封已久的MASM6.11写了一个只有40h字节的DOSExe程序替换掉PE头中的DOS头。

    OK!PE头已缩减到0.5KB。程序又减少了0.5KB!

    最终程序大小:4KB
    其中:
        PE头:0.5KB。
        代码:2.5KB。
        资源:1KB。


2000-02-24 by tobacco
Email:tobacco@263.net

区段减肥,去除垃圾区段,重建PE。

区段减肥,去除垃圾区段,重建PE。 这个需要一点PE知识,没有也不要紧,跟着一起学,积累经验。 备份好脱壳程序,区段减肥有时过量会导致程序无法运行。 这次区段减肥只是例子,大家要学会举一反三。 ...
  • yizhenweifeng
  • yizhenweifeng
  • 2013年02月15日 20:45
  • 2708

PE文件结构详解--可执行文件头

了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格式,重要的信息都包含在头部,顺着头部的信息,可以引导系统解析整个文件。所以,我们先来认识一下PE文件的头部格式。还记...
  • zang141588761
  • zang141588761
  • 2016年12月23日 14:38
  • 667

【EXE PE】初识pe结构--手写可执行程序

原文地址http://bbs.pediy.com/showthread.php?t=48590 【文章标题】: 手写可执行程序 【文章作者】: dncwbc 【作者邮箱】: dnc2588@...
  • zfpigpig
  • zfpigpig
  • 2013年09月06日 11:12
  • 4428

PE文件结构详解(二)可执行文件头

在PE文件结构详解(一)基本概念里,解释了一下PE文件的一些基本概念,从这篇开始,将正式讲解PE文件的详细结构。 了解一个文件的详细结构,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件...
  • evileagle
  • evileagle
  • 2013年09月23日 23:28
  • 27870

Windows可执行文件PE格式分析

上面是 windows PE 可执行文件格式的结构图,分为 4 个部分:DOS 文件头、NT 文件头、Section 表以及 Directory 表格。 windows 的 executable i...
  • scribbler
  • scribbler
  • 2016年08月01日 15:39
  • 1168

[授权发表]为可执行文件“减肥”

这是开源书籍[《C语言编程透视》](http://www.tinylab.org/project/hello-c-world/)第八章,如果您喜欢该书,请关注我们的新浪微博[@泰晓科技](http:/...
  • hifalcon
  • hifalcon
  • 2015年04月12日 17:52
  • 1111

关于PE可执行文件的修改

关于PE可执行文件的修改 创建时间:2001-09-21 文章属性:原创 文章提交:ILSY (masteruser_at_263.net) 在windows 9x、NT、2000下,所有的可执行...
  • ooyyee
  • ooyyee
  • 2016年10月24日 09:40
  • 108

Windows可执行文件(PE文件)壳的设计过程

PE文件壳的设计过程 标题:pe文件壳的设计过程 作者:baccon(PEDIY论坛),或chenxiang(软件发布者) 时间:2013年10月26日星期六...
  • adebies
  • adebies
  • 2014年10月04日 00:38
  • 1272

PE文件导入表的代码注入

PE文件导入表的代码注入              试想一下,如果通过修改导入表,能把PE格式文件中的函数入口点,重定向到自己的程序中来,是不是很酷!这样,在自己在程序中,可以过滤掉对某些函数的...
  • bobopeng
  • bobopeng
  • 2014年08月21日 20:00
  • 1075

HDU4509 湫湫系列故事——减肥记II【格式输入+存储设置+暴力+水题】

湫湫系列故事——减肥记II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To...
  • tigerisland45
  • tigerisland45
  • 2017年07月24日 19:35
  • 810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PE可执行文件“减肥”实例
举报原因:
原因补充:

(最多只允许输入30个字)