将 /TSAWARE 链接器标志添加到我的一个项目 (Visual Studio 6) 后,我惊讶地发现 PE 文件 (.idata) 中有一个新部分。如果我不设置标志,导入将合并到 .rdata 中。
为了说明“问题”,我们从一个简单的控制台程序开始:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译: cl /Og /O1 /GF /WX /c main.c
然后链接
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.objlink /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj让我们比较 dumpbin 输出:
Dump of file a.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
1000 .rdata
5000 .text
Dump of file b.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
1000 .idata
1000 .rdata
5000 …Run Code Online (Sandbox Code Playgroud) 我需要以编程方式找到Windows可执行文件的默认图标(PE文件= dll,exe,com ..).我知道如何遍历资源并确定什么是图标,什么是光标等,但据我所知,没有任何图标以任何方式标记为默认图标.那么,有人知道,如何找到默认图标?而且,我不想使用任何windows api调用,我想自己编写函数.问题是我不知道所有图标中哪一个是默认图标.
我在这里找到了一个修复导入表的工具,但是如果没有在c/c ++中首先构建导入表的PE可执行文件怎么样?
我希望能够通过查看 PE 标头找出出现在入口点的代码的来源。
比如这段代码就是我的程序的起始代码(401000h)
00401000 >/$ 58 POP EAX ; kernel32.76E93677
00401001 |. 2D 77360100 SUB EAX,13677
00401006 |. BB 4A184000 MOV EBX,<JMP.&kernel32.VirtualProtect>
Run Code Online (Sandbox Code Playgroud)
我想知道这段代码是从哪里来的。如何在不手动扫描我的文件的情况下找到它?(为了完成这个例子,这里有一个来自同一个文件的 hexdump,代码现在位于 200h)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000200 58 2D 77 36 01 00 BB 4A 18 40 00
Run Code Online (Sandbox Code Playgroud)
如何从虚拟入口点 (401000h) 到达原始入口点 (200h)?我当然尝试自己解决。但我错过了一些东西。一开始我是这么想的:
.text[ Entrypoint (1000h) - VirtualOffset (1000d) ] = 原始入口点,因为文件对齐 = 200,原始入口点位于我的 .text 部分的最开始,我想我可以将它用于所有可执行文件。
解决了,我在计算原始入口点时犯了愚蠢的错误
.text[ 入口点 - 虚拟偏移量 ] + 文件对齐 …
最近我反汇编了一个DLL(用c/c ++编写)并注意到代码段中有很多"跳转存根".这些存根只会跳转到DLL中的函数.
例如:
jmp foo()
jmp foo2()
...
Run Code Online (Sandbox Code Playgroud)
为什么编译器(Visual Studio 2012)在二进制文件中包含这些函数存根?
谢谢!
当我遇到这个功能时,我正在阅读SysUtils:
function ALR: Pointer;
var
LibModule: PLibModule;
begin
if MainInstance <> 0 then
Result := Pointer(LoadResource(MainInstance, FindResource(MainInstance, 'DVCLAL',
RT_RCDATA)))
else
begin
Run Code Online (Sandbox Code Playgroud)
之后,我搜索了什么是DVCLAL,我发现了这个问题.
Delphi编译器发送给DVCLAL资源的所有可能签名是什么?
调用 DLL 函数涉及链接器生成存根,除非函数被声明,__declspec(dllimport)在这种情况下存根可以被绕过,以支持直接对导入表的间接调用,这样效率更高,例如
__declspec(dllimport) void ExitProcess(int);
ExitProcess(0);
Run Code Online (Sandbox Code Playgroud)
产生
call qword ptr [__imp_ExitProcess]
Run Code Online (Sandbox Code Playgroud)
where__imp_ExitProcess解析为可执行文件中导入表中的一个位置。
我试图弄清楚究竟是如何__imp_ExitProcess解决的。可以肯定的是,它作为 kernel32.lib 中的一个符号出现,但该符号具有存储类IMAGE_SYM_CLASS_EXTERNAL、段号零和值零,这相当于只是说“这将在其他地方定义”而没有实际定义它。
__imp_前缀是否具有特殊含义,即链接器是否注意到该前缀并将其作为将符号解析为名称已删除该前缀的 DLL 函数的导入表条目的指令?还是有其他事情发生?
我试图从PE文件(一个DLL)中提取.text部分,即代码.在Linux或某些python或ruby lib中是否有任何简单的工具可以让我轻松完成这项工作?
所以我想在minesweeper.exe中为我的代码洞穴腾出空间(典型的Windows XP扫雷游戏,链接:Minesweeper).所以我通过CFF Explorer修改了文件的PE头,以增加该.text部分的大小.
我尝试将.text段的原始大小增加1000h(新大小为3B58),但Windows无法找到入口点并且游戏无法启动.然后我尝试增加该.rsrc部分的大小,添加一个新的部分,增加图像大小,但这些尝试都没有成功,Windows说"这不是x32可执行文件".
所以这就是问题:如何为我的代码洞穴腾出空间?我不想搜索编译器留下的空白空间,我想为我的代码提供漂亮而干净的1000h字节.这个教程以及如何在不破坏游戏的情况下做到这一点的详细解释将是伟大的!(是的,我实际上正在攻击扫雷)
windows ×7
c++ ×2
linker ×2
assembly ×1
code-signing ×1
delphi ×1
delphi-xe3 ×1
dll ×1
executable ×1
icons ×1
resources ×1
text ×1
visual-c++ ×1
visual-c++-6 ×1
winapi ×1
x86 ×1