1、将PE文件从磁盘中读出 使用ReadFile()读取数据;检查文件格式无误后,根据可选PE头(简称op头)的SizeOfImage
    2、根据PE结构获取镜像大小,再申请一段可读可写可执行的内存,并填充为0;
    3、将读取的数据映射到内存中;

    • 这里需要注意的地方是内存粒度对齐的问题。
    • 在磁盘中对齐粒度为0x200;
    • 再内存中的对齐粒度为0x1000.

    image.png
    4、修复重定位;重定位后的地址=需要重定位的地址-默认加载基址+当前加载基址
    5、修复导入表;

    • 检查INT的Ordinal是否为0,为0则遍历完当前DLL,如果不为0,检查第32位是否为1(&0x80000000),为1则为序号导入,Ordinal的后16位为序号取出(&0xFFFF),GetProcAddress得到函数地址,并赋值给IAT表的Function。如果第32位为0,则说明按名称导入,此时先通过内存基址+AddressOfData获得函数名,再用GetProcAddress得到函数地址,并赋值给IAT表的Function,循环遍历各个DLL即可。

    6、根据PE结构的导入表,加载所需要的dll,并获取导入函数的地址并写入导入表中。导入表有函数名称表、函数地址表、函数序号表
    7、修改PE文件的加载基址;
    8、跳转到PE入口点进行执行;

    [

    ](https://blog.csdn.net/weixin_43742894/article/details/105235074)