1. 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禁止内联编译)做逃逸分析

  2. 使用upx -9 outPE给PE程序压缩

    压缩登记1-9,9为最大压缩率,-d解压缩

upx 工具介绍

  1. 压缩(加壳)原理:将原有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文件