作者:oHuangKeo

    有误之处,忘谅之.学习中...

    今在论坛里看到有人发贴说有程序不让OD分析.这很常见了,很多脱壳后的文件,弄得不好还就是不能用OD打开分析.但这种情况是程序一般也是不能运行的.现在的问题就是,程序可以正常运行,可是OD不能打开分析,说"Bad or unknown format of 32-bit executeable file '**.exe'".这句话说这个程序不是有效的32位可执行程序.明明可以运行的嘛.
    下面来给大家做个试验再说明原因.

    1.用十六进制工具打开NotePad,(别的EXE文件也行.)选中从'PE'开始的大小为0xE0的数据,复制,然后到文件地址为0x40处粘贴.(大家都知道,这里是DOS头的区域,除非在DOS下运行程序才会用到这一段数据.)
    2.把后面多余的数据用'0'填上[0x120-0x1BF]. 然后就是修正了.因为PE头位置定位到了0x40,所以得把0x3C处改为0x40.这个大家都是知道的.
    3.最后就是关键问题所在了. 把0x54地址的数据改为'8001',就是0x180.
    好,现在保存,运行程序看,OK,可以运行,没有问题.用OD再打开试试?哈哈,报错啦.

    下面说说原因,有说得不好的地方,大家不要笑话偶.
    OD在加载程序时,会先对程序进行分析.OD的作者写此程序就只是针对Win32下的PE文件(好像作者现在在开发2.0版本的,是分析64位程序的.)所以有比较SizeOfOptionalHandler,而在PE定义中,这个值是0xE0,是一个定值.OD比较这个值,如果是0xE0就对了,不等就是错误的EXE文件.
    我们刚才做的就是改变PE Handler的大小,后面多余的数据填'0'也是有意义的.这就是系统可以正常运行的原因.后面多余的'0'归属于DataDirectory中了.系统在加载时只加载16组数据,后面的顶多算为是PE结构的保留数据,好像在前16组中,也是有保留数据的.所以不会出错.
    附件中有我修改PE文件的录相,可以下载参考一下.

    修复这一BUG方法,把0045C671处的je改为jge,就是大于等于就可以了.

    通过小小修改PE就可以不让OD加载,但这也都是些小花样.OD的BUG是可以补的嘛.一定还会有更多的BUG,有待大家的发现.