Windows是否有可执行文件,我可以在命令shell中运行,它返回可执行文件(.exe)的版本号?
我看到很多问题显示如何使用不同的语言,并引用第三方软件来编写它,但我找不到一个简单的shell命令来执行它.如果我不需要安装任何东西,还有其他要点.
它必须以普通用户身份运行.不是管理员.
有没有办法在C++/windows中获取exe/DLL映像基址?谢谢 :)
我在术语上很少混淆.
作为链接器输入的文件称为对象文件.链接器生成一个Image文件,该文件又被加载器用作输入.
我从"MS PE&COFF规范"中得到了这个
Q1.图像文件也被称为Binary Image,Binary File或只是Binary.对?
Q2.因此,根据上述术语,PE/ELF/COFF是图像文件的格式而不是目标文件.对?但http://www.sco.com/developers/gabi/latest/ch4.intro.html说
本章介绍目标文件格式,称为ELF(可执行文件和链接格式).目标文件有三种主要类型.
可重定位文件包含适合与其他目标文件链接的代码和数据,以创建可执行文件或共享对象文件.
可执行文件包含适合执行的程序; 该文件指定exec(BA_OS)如何创建程序的过程映像.
共享对象文件包含适合在两个上下文中链接的代码和数据.首先,链接编辑器[请参阅ld(BA_OS)]使用其他可重定位和共享对象文件处理共享对象文件,以创建另一个目标文件.其次,动态链接器将其与可执行文件和其他共享对象相结合,以创建过程映像.
矛盾的是,他说对象文件和图像文件都是ELF格式,他根本不区分对象和图像文件,但通常将它们称为对象文件.不是吗?
Q3.我知道PE来自COFF.但为什么Microsoft格式的PE格式被命名为Microsoft Portable Executable"和Common Object File Format Specification".他们还支持COFF吗?如果他们,在哪个操作系统?我以为PE很久以前完全取代了COFF.
我一直在尝试在加载和运行进程后解析/显示进程的导入地址表(IAT)中的信息.我理解程序中的API调用跳转到IAT中的相关点,然后跳转到加载的DLL中的实际函数.
通过读取PE头并跟随OptionalHeader.DataDirectory [1]指针到IMAGE_IMPORT_DESCRIPTORs数组,可以找到IAT是否正确.然后按照FirstThunk指针.而 OriginalFirstThunk指针在这里,会给你原始的导入表(IT)吗?
我也尝试在PE头中跟随OptionalHeader.DataDirectory [12]指针,但这甚至不太成功.
我一直在尝试使用来自另一个进程的ReadProcessMemory来解析notepad.exe(32位)的这个结构.
这是我正在做的粗略的C-psuedocode:
char buf[128];
// get first import descriptor
readMemory(&import, procImgBase + DataDirectory[1].VirtualAddress, sizeof(IMAGE_IMPORT_DESCRIPTOR));
// get dll name
readMemory(buf, import.Name + procImgBase, 127);
printf("libname: %s\n", buf);
// get first function name
DWORD iltAddress = 0;
readMemory(&iltAddress, import.FirstThunk + procImgBase, 4);
readMemory(buf, iltAddress + procImgBase, 127);
printf("fname: %s\n", libName + 2); // <-- the +2 for the 2byte 'hint' of import lookup table entries
Run Code Online (Sandbox Code Playgroud)
如果,在第3行到最后一行,我用import.OriginalFirstThunk而不是FirstThunk替换它,它将按预期打印所有内容.我必须在概念上遗漏一些东西,所以我想知道是否有人能澄清这是什么,对我来说?
非常感谢!
如果你已经搞乱了文件扩展名,你怎么能告诉一个可执行文件除了DLL?
他们似乎都有切入点和一切......
在我看来它总是4GB,因为它使用相同大小的数据类型(一个DWORD)?SizeOfImage总是不是32位的DWORD ?或者我错了这个限制?
4GB确实似乎是ALL Portable Executable(32位和64位PE +)的硬限制.
是否可以从PE文件中删除DOS存根和DOS标头?
我需要找到模式exe/dll构建查看其标题.[edit]只使用c ++而无需任何外部工具.[/ edit]
有一个旧的讨论如何确定在发布或调试模式下构建的DLL. http://forums.codeguru.com/archive/index.php/t-485996.html
但不幸的是,我没有找到任何明确的答案.
我有第三方控制台应用程序.我需要从我的应用程序运行它,但我不能将它作为一个单独的进程运行(因为我需要使用它的依赖项:手动填充导入表,设置挂钩等).所以我可能应该main手动调用此可执行文件的功能.这是我试图这样做的方式:
auto hMod = LoadLibrary("console_app.exe")我坚持到最后一步.
以下是我试图调用入口点的方法:
void runMain(HINSTANCE hInst)
{
typedef BOOL(WINAPI *PfnMain)(int, char*[]);
auto imageNtHeaders = ImageNtHeader(hInst);
auto pfnMain = (PfnMain)(DWORD_PTR)(imageNtHeaders->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)hInst);
char* args[] = { R"(<console_app_path>)", R"(arg1)", R"(arg2)" };
pfnMain(3, args);
}
Run Code Online (Sandbox Code Playgroud)
有用.但它就好像没有争论一样.
我哪里错了?如何在我的进程中使用参数运行可执行文件?谢谢.
我已经调查过我的特定第三方exe如何获取cmd参数并发现:
GetCommandLine,也不调用它call _initterm电话argc和argv参数进行调查(见下图)
cs:argccs:argv
您能解释一下,_initterm实际存在的CMD参数究竟存在了什么?
c++ program-entry-point systems-programming portable-executable entry-point
好的,这个问题是关于便携式的,因为没有依赖关系(即"我可以将二进制文件放在USB密钥中,随身携带,发送给朋友等等").
我听说过静态连接,但我很困惑它的后果是什么; 什么可以和什么不能静态链接(即Qt,OpenGL,libstdc ++怎么样?)以及之后二进制将"可移植"的程度.
我也听说过LSB(Linux标准基础版),但我不确切地知道它是什么,或者它在这个意义上是否有帮助.
windows ×5
c++ ×4
dll ×2
exe ×2
executable ×2
32bit-64bit ×1
64-bit ×1
assembly ×1
base-address ×1
batch-file ×1
c ×1
command-line ×1
elf ×1
entry-point ×1
linux ×1
portability ×1
version ×1