如何在 c/c++ 中构建没有导入表的可执行文件?

2023-12-10

我找到了修复导入表的工具here,但是如果没有在 c/c++ 中首先构建导入表,PE 是如何可执行的呢?


只是不要使用 CRT,也不要使用任何导入的函数。

#pragma comment(linker, "/entry:start")
int start()
{
   return 42; 
}

要使用 WinAPI 函数,请找到 kernel32 基址,解析它的导出目录并找到 LoadLibrary() 函数(您应该已经有类似 GetProcAddress() 之类的东西来查找 LoadLibrary())

这可能看起来像这样:

// compile as console application, "release" configuration with /MT /GS-
#include <Windows.h>
#pragma comment(linker, "/entry:start")
void start()
{
    HMODULE kernel32base = *(HMODULE*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(__readfsdword(0x30) + 0x0C) + 0x14))) + 0x10);

    DWORD base = (DWORD)kernel32base;
    IMAGE_NT_HEADERS* pe = PIMAGE_NT_HEADERS(base + PIMAGE_DOS_HEADER(base)->e_lfanew);
    IMAGE_EXPORT_DIRECTORY* exportDir = PIMAGE_EXPORT_DIRECTORY(base + pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    DWORD* namePtr = (DWORD*)(base + exportDir->AddressOfNames);
    WORD* ordPtr = (WORD*)(base + exportDir->AddressOfNameOrdinals);
    for(; strcmp((const char*)(base + *namePtr), "GetProcAddress"); ++namePtr, ++ordPtr)
        ;
    DWORD funcRVA = *(DWORD*)(base + exportDir->AddressOfFunctions + *ordPtr * 4);

    typedef FARPROC (WINAPI *GetProcAddress_t)(HMODULE, const char*);
    GetProcAddress_t GetProcAddress = (GetProcAddress_t)(base + funcRVA);

    HANDLE (WINAPI *GetStdHandle)(DWORD);
    *(FARPROC*)&GetStdHandle = GetProcAddress(kernel32base, "GetStdHandle");

    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);

    BOOL (WINAPI *WriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
    *(FARPROC*)&WriteFile = GetProcAddress(kernel32base, "WriteFile");

    const char* greeting = "Hello world!\n";

    DWORD written;
    WriteFile(stdout, greeting, strlen(greeting), &written, NULL);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 c/c++ 中构建没有导入表的可执行文件? 的相关文章

  • 为 Windows 编写跨平台(32 位和 64 位兼容)程序(如 .NET 中的 AnyCPU)

    NET 中的 AnyCPU 功能如何工作一直让我困惑 如果系统是 32 位 它会将可执行文件加载为本机 32 位 如果系统是 64 位 则加载为 64 位 您可以轻松确认 与任务管理器 显然 这并非不可能 问题是 微软到底是如何做到这一点的
  • DVCLAL 的所有可能值的列表是什么?

    当我遇到这个函数时 我正在阅读 SysUtils function ALR Pointer var LibModule PLibModule begin if MainInstance lt gt 0 then Result Pointer
  • 如何在 Windows PE 32 位可执行文件中为我的代码洞腾出空间

    所以我想在minesweeper exe 典型的Windows XP扫雷游戏 链接 扫雷舰 所以我通过CFF Explorer修改了文件的PE头以增加文件的大小 text部分 我尝试增加原始大小 text分段1000h 新大小为3B58 但
  • 从 .rdata 部分删除 IMAGE_DEBUG_DIRECTORY

    如何从中删除 IMAGE DEBUG DIRECTORY 数据 rdataPE 部分 我正在使用 MS Visual Studio 2015 我确实检查了项目属性的几乎所有编译选项 但 IMAGE DEBUG DIRECTORY 数据仍然存
  • 如何在 c/c++ 中构建没有导入表的可执行文件?

    我找到了修复导入表的工具here 但是如果没有在 c c 中首先构建导入表 PE 是如何可执行的呢 只是不要使用 CRT 也不要使用任何导入的函数 pragma comment linker entry start int start re
  • 如何使用 pefile 从 PE 文件中获取 .text 部分

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我怎样才能得到内容 textPE 中的部分 或任何其他部分 使用pefile module sectionsPE类实例的attr是节列表
  • linux下如何将PE(Portable Executable)格式转换为ELF

    将 PE 二进制文件转换为 ELF 二进制文件的最佳工具是什么 以下是这个问题的简要动机 假设我有一个简单的 C 程序 我使用 Linux 的 gcc 编译它 这给出了 ELF 并使用 Windows 的 i586 mingw32msvc
  • MapViewOfFile 返回什么? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么加载程序无法加载到所需位置 https stackoverflow com questions 9698496 why wont the loader load at the desired l
  • 在可执行文件的资源中,如何找到默认图标?

    我需要以编程方式找到 Windows 可执行文件 PE 文件 dll exe com 的默认图标 我确实知道如何遍历资源并识别什么是图标 什么是光标等 但据我所知 没有一个图标以任何方式标记为默认图标 那么 有人知道如何找到默认图标吗 此外
  • PE文件中的MZ签名有什么用?

    我正在开发一个程序 它将解析 PE 对象以获取各种信息 但阅读规范后 我无法找出为什么存在 MZ 字节 因为我无法在这 2 个字节应该代表的机器类型列表中找到它 谁能澄清一下吗 MZ 签名是 MS DOS 可重定位 16 位 EXE 格式使
  • 将数据附加到 exe

    这个问题是我之前问题的答案之一的延伸 如何在exe中保存用户注册 C https stackoverflow com questions 5792793 how to save user registration in the exe c
  • EXE 或 DLL 映像基地址

    C Windows 中有没有办法获取 exe DLL 映像基地址 谢谢 如果您将二进制文件加载到您自己的进程中 您可以使用获取模块句柄 http msdn microsoft com en us library ms683199 VS 85
  • 在调用 Main() 之前 Windows 会做什么?

    Windows 必须做一些事情来解析 PE 标头 将可执行文件加载到内存中 并将命令行参数传递给main Using OllyDbg I have set the debugger to break on main so I could v
  • PE 文件中的 OSMajor 和 OSMinor 版本号

    最近我偶然发现了一个奇怪的现象 我正在为 PE 文件构建一个转储程序 很好地阅读了节标题和 可选 节标题 现在 当我到达 OS Major 和 OS Minor 字段时 我注意到一个奇怪的值 WORD OS VERSION major 0x
  • 在PE的导入表中添加一个条目

    我正在寻找一个命令行程序来向 PE 文件的导入表添加条目 我的目标是将一个新的导入函数从外部 DLL 添加到我的 EXE 然后使用 ollydbg 使用代码洞穴插入新代码 新代码将使用新导入的函数 实际上我已经实现了我的目标 但是要向我使用
  • 如何使用 Visual Studio 命令行 + SCons 构建 Windows XP 应用程序?

    使用 Visual Studio 2015 IDE 构建 Windows XP 应用程序一点也不难 您只需要使用正确的平台工具集 v120 xp 或 v140 xp 并确保在目标计算机上安装正确的可再发行 Visual Studio 运行时
  • 将值写入PE文件

    我想尝试以下操作 我有一个 C 程序 它将一个文件作为输入并计算这五个 MD5 的 MD5 算法 我的算法对每个文件都有一个唯一的值 该值是一个 128 位值 因此我想使用此技术通过将 md5 算法的输出值保存到我的 PE 文件中来保护我的
  • 如何确定 Windows 10 上可执行二进制文件的体系结构

    给定一些Random exe在 Windows 上 我如何确定 它的CPU架构 例如Intel ARM 以及 它的位数 例如 32 或 64 我可以使用文件资源管理器 其他工具或编程方法中的属性吗 Cygwin https www cygw
  • 从发布的文件中删除 PDB 引用

    在使用任何 IDE 调试和创建文件后 我总是会查看最终的二进制可执行文件或 DLL 现在我正在尝试 Visual C 2010 寻找最佳版本 没有垃圾或不必要的引用 因此 我创建了一个包含两个项目的新解决方案 一个可执行文件及其 DLL V
  • PE 文件中的跳转存根

    最近我反汇编了一个DLL 用c c 编写 发现代码段内有很多 跳转存根 这些存根除了跳转到 DLL 内的函数之外什么也不做 eg jmp foo jmp foo2 为什么编译器 Visual studio 2012 在二进制文件中包含这些函

随机推荐

  • Knockout js:如何一次获取所有属性的通知

    假设我有一个包含 100 个 props 的 ViewModel 目前 我需要一个处理程序 如果任何道具发生变化 就会调用该处理程序 当然 我可以为每个属性编写 100 subscribe 但似乎有更好的方法 就像在 C 中一样 您可以绑定
  • 在 Windows 上为 Python 2.7 构建 lxml

    我正在尝试在 Windows 64 位计算机上为 Python 2 7 构建 lxml 我找不到 Python 2 7 版本的 lxml Egg 所以我从源头编译它 我正在按照该网站上的说明进行操作 http lxml de build h
  • 使用 Selenium 通过 MacOS 窗口上传图像

    Set up 我正在使用 Python 3 x 和 Selenium 在网上商店的后端工作 我需要从我的电脑上传产品图片到平台后端 Problem 使用 Selenium 可以单击图像上传按钮 但是单击会弹出 MacOS 文件选择器 Sel
  • Python,无法将 input() 转换为 int()

    我正在尝试使用以下代码将 input 数据转换为 int prompt text Enter a number try user num int input prompt text except ValueError print Error
  • 输出显示在 Jupyter Notebook 中,但未显示在 PyCharm 中

    我看过类似的帖子 但没有看到任何真正解决 Jupyter Notebook 和 PyCharm 之间输出差异的回复 一个例子是这样的 from datetime import datetime now datetime now now Ou
  • 为什么 text-decoration: none 在 p 中不起作用?

    我有以下 HTML 和 CSS 片段 我想要 不要强调 但确实如此 我究竟做错了什么 p color red text decoration underline font size 1 2em span none text decorati
  • 使用 Parcelable 在 Intent 中传递数组

    我想在活动之间发送一系列对象 我想使用 Parcelable 接口并以意图发送数据 但是我不断收到错误 我已经被困了2天了 以下是有关我的问题的一些详细信息 Class A private ProjetUI mProjects privat
  • 如何从数据表填充列表视图

    我有一个ListView and a DataTable我想知道如何填充ListView来自DataTable 这是我的代码 DataTable dt new DataTable SqlConnection conn new SqlConn
  • 尝试在 Android 1.5 上使用 Base64 时出现“IllegalArgumentException: bad base-64”[已关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 I get java lang IllegalArgumentException bad
  • WPF ItemsControl ItemTemplate 边框与 GroupStyle

    这是我第一次发图片 所以希望效果很好 一张图片抵一千字 我不想打一千字 但是 下图是我想要实现的目标 我有一个需要按属性 组 分组的对象集合 我正在使用绑定到为我进行分组的数据源的 CollectionViewSource 我正在使用 It
  • Javascript函数不修改数组(参考?)

    如果 JavaScript 将函数参数作为原始对象的引用传递 为什么我不能使用这个简单的函数修改原始数组 var array1 one function change array var array2 222 array array2 ch
  • ADB 拒绝 shell 命令 (ls -l /data)

    我不断得到 ADB rejected shell command ls l data 以及运行时的命令提示符adb shell告诉我error device not found虽然模拟器是打开的 我做错了什么 我假设您从命令行运行 adb
  • 如何从unix中的给定日期获取上周日日期

    获取上周日日期作为给定日期 不是当前日期 作为输入的输出 输入示例 2017 年 8 月 30 日 m d Y 输出应该是上周日 08 27 2017 以下所有命令都使用当天作为参考 但我想将参考日期作为输入以获取上周日 请帮我执行命令 日
  • Scaffold-DbContext“登录失败”“错误号:4060,状态:1,类别:11”

    我的 ASP NET MVC 核心应用程序应通过实体框架连接到现有的 MSSQL LocalDB 文件 数据库优先开发需要对现有数据库进行逆向工程 按照中的说明进行操作官方文档 我在 NuGet 包管理器控制台中运行以下命令 Scaffol
  • R:无效的多字节字符串[重复]

    这个问题在这里已经有答案了 我使用不带任何参数的 read delim filename 来读取 R 中制表符分隔的文本文件 df read delim file 这按预期进行 现在我有一个奇怪的错误消息 我无法理解它 Error in t
  • 检测后退按钮但不关闭对话框片段

    我有一个浮动对话框的对话框片段 其中包括一个特殊的键盘 当用户在 EditText 字段内按下时会弹出该键盘 正常的 IME 停止显示 我希望当用户按下后退按钮 就像普通的 IME 服务一样 时键盘被关闭 可见性 GONE 但对话框保持可见
  • 为什么我收到手势识别器不能在原型对象上使用的信息?

    当我将 UITapGestureRecognizer 放入场景中 UITableViewCell 内的 UIView 内时 我从情节提要中收到上述错误 知道为什么我会收到此错误吗 我不确定为什么会出现这种限制 但我知道为什么您会收到错误消息
  • 向 Google 蜡烛图添加注释(发布的解决方案会触发 TypeError)

    我正在尝试向 Google Candlestick 图表添加一些注释 我注意到有人已经问过同样的问题 向 Google 烛台图表添加注释 用户Aper u回复了详细的解决方案来扩展图表并添加注释 因为图表没有内置任何此类功能 但是 当我尝试
  • PHP正则表达式检查英文名称

    寻找正则表达式来检查有效的英文名称 即 A Z a z space only 名字 可选 中间名 姓氏 一个可接受的例子 John von Neumann Thanks 编辑 添加检查代码 usr bin php
  • 如何在 c/c++ 中构建没有导入表的可执行文件?

    我找到了修复导入表的工具here 但是如果没有在 c c 中首先构建导入表 PE 是如何可执行的呢 只是不要使用 CRT 也不要使用任何导入的函数 pragma comment linker entry start int start re