手写一个小PE
本帖最后由 cagebird 于 2015-11-1 00:57 编辑闲来无事手写一个小的PE程序,能够弹出一个对话框。经过一个大晚上的时间终于搞定,发一贴子和大家交流探讨一下。
最后EXE文件凑了252字节大小-----爱52(∩_∩),在win7系统测试的,XP应该还可以更小。
一、首先写一个汇编代码用MASM32编译一下(为了省空间没加ExitProcess函数,程序运行结束记得在任务管理器中结束掉):
http://www.52pojie.cn/forum.php?mod=image&aid=544332&size=300x300&key=a91a94a353fe1b79&nocache=yes&type=fixnone
最后EXE大小为16K,链接obj文件时设置一下文件对齐尺寸4字节
http://www.52pojie.cn/forum.php?mod=image&aid=544340&size=300x300&key=96adef277200aa6a&nocache=yes&type=fixnone
查看生成的文件属性,大小直接降到了684字节,用编译器生成的,用链接器合并节仍然很大,下面我就用winhex手写16进制。
二、根据PE文件的格式把PE头先简单的写出来,需要根据其他数据填写的先写CC,等候再填写。附件(PE-1图)
前期填写比较简单,直接按照格式要求填就行。
00位置:MZ标示,前两位必须是4D 5A;
3C位置:是E_lfanewPE头位置,指向PE头地址;
04-----3C中间,我们插入我们的PE头,节省空间,内存节对齐粒度正好对着E_lfanewPE头,设为4字节;
DOS Stub部分可有可无,为节省空间就不要了;
文件创建时间随便;
IMAGE_OPTIONAL_HEADER32长度要计算一下;
所有代码段大小,初始化数据段大小不重要;
程序执行入口RVA一定填好,OEP位置;
代码节和数据节起始RVA不重要;
内存、文件对齐粒度都设置4字节(经过测试200H字节下两个值要相同,不然会出错);
操作系统版本号、校验和、栈设置不太重要,本PE映像版本不能乱填;
数据目录我们只要2项,但后面要多预留8个字节;
节表段我们只要一个;
输入表手工较难设置,需要找准地址,全是16进制容易看花眼,不过我把输入表拆开了,找前面几段不重要的地址塞进去;
messagebox函数前面代号不重要,user32后面的dll也可以不要,系统函数只识别前面名字;
数据区可以不要,随便找个地方引用就是,这里我用的是节表名字,前面加了(52--)标识;
代码部分就是4个PUSH参数,一个CALL跳到JMP,最后再RET返回,
http://www.52pojie.cn/forum.php?mod=image&aid=544363&size=300x300&key=5311610b65dbcbc8&nocache=yes&type=fixnone
代码部分没有拆开,在后面,共23个字节,刚开始看前面有空余22个字节,
我改了下代码,去了CALL,直接jmp,但是下一句语句地址没法压栈,我在JMP前加了ADD EDX,15 PUSHE EDX两句代码就可以了。
http://www.52pojie.cn/forum.php?mod=image&aid=544361&size=300x300&key=d7fda6c351673345&nocache=yes&type=fixnone
最后生成的文件有点乱,主要是我把输入表分的比较散,仔细看还是没问题。
http://www.52pojie.cn/forum.php?mod=image&aid=544364&size=300x300&key=0be66161a30b7230&nocache=yes&type=fixnone
网盘里有生成的EXE文件,和大家多多交流交流共同学习,亲手写个PE对文件结构理解,逆向破解,病毒分析还是很有帮助的。
http://pan.baidu.com/s/1mg6I9ao
赞赞,支持楼主,支持沙发 支持楼主,我多多学习! 支持楼主,我多多学习! X64 还是没支持,运行没效果 楼主你上传的图片有问题吧,传哪去了? Hmily 发表于 2015-11-2 16:38
楼主你上传的图片有问题吧,传哪去了?
帖子编辑上传时就点个上传,点了好多次才成功。
307677814 发表于 2015-11-1 11:34
X64 还是没支持,运行没效果
系统不一样,有些字段选择的值也需要改变,我按照win7编写的
页:
[1]