go build -ldflags '-w -s' -gcflags ' -l' -o outPE
,同strip
命令
ldflags
为链接参数,和gcc的比较像 go tool link -hlep
查看详情
gcflags
为编译参数和gcc的比较像go tool compile -help
查看详情
-w 禁止生成debug信息,当然也无法再使用gdb进行调试
-s 禁用符号表
-l 禁止内联;常用go run -gcflags "-m -l" (-m打印逃逸分析信息,-l禁止内联编译)
做逃逸分析
使用upx -9 outPE
给PE程序压缩
压缩登记1-9,9为最大压缩率,-d解压缩
upx 工具介绍
- 压缩(加壳)原理:将原有PE代码压缩,并在合适的地方插入实时解压代码
PE逆向工具 pev介绍(linux 可执行文件为elf,windows可执行文件为pe)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| readpe :读取PE信息,比如导入导出表. pehash :查看程序的整体,全部或某个节区的md5,sha1,ssdeep,支持的HASH算法包括: md4, md5, ripemd160, sha, sha1, sha224, sha256 sha384, sha512, whirlpool,ssdeep peres :对程序的资源进行处理,查看提取等,很有用. --------------------------------------------------------------------------------------------- pedis :反汇编程序,可以指定从某个地址开始. pesec :检测ASLR,DEP/NX,SEH,Stack cookies (EXPERIMENTAL). pestr :查看程序中的字符串,类似于windows下的Strins程序. --------------------------------------------------------------------------------------------- pescan :扫描程序的一些关键信息是否正常,通常可以用于预先判断程序是否有恶意意图. ofs2rva :将指定文件偏移值(offset)转换为相对虚拟地址(RVA).其中ofs=offset,rva=relative virtual address. rva2ofs :与rva2ofs功能相反. pepack :查看程序的打包工具. --------------------------------------------------------------------------------------------- cpload :处理cpl文件,即控制面板程序,官方文档中介绍含有此组件.但很不幸的是,此文件似乎并不存在.
|
可执行文件
linux: elf
windows:pe
wine就是在linux上多一层api兼容和PE格式识别
cpu指令集:
汇编指令集:
arch:
C/C++
_start:指定程序入口,编译时带上参数 -nostartfiles
_onexit: main执行结束后执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdlib.h> #include <stdio.h>
int func1(void);
void _start() { int ret = my_main(); exit(ret); }
int my_main() { _onexit(func1); printf("hello!"); return 0; }
int func1() { printf("fun1() executed!"); return 0; }
|
gcc sample.c -nostartfiles
ELF文件