我正在尝试.NET中的内存访问.目前,我有一个托管程序,它启动一个非托管进程并检索BaseAddress其中一个加载的模块(DLL).我想要做的是以某种方式读取加载模块的PE头,以便我以后可以检索其导出的地址.
不幸的是,我找不到任何关于此的好信息.有任何想法吗?
在ELF文件格式中,我们有一个Alignment字段,Segment Header Table即Program Header Table.
在 Windows PE 文件格式的情况下,他们将其带到下一个级别,节有两个对齐值,一个在磁盘文件中,另一个在内存中。PE 文件头指定了这两个值。
我对这种对齐一无所知。我们需要它做什么?如何以及在哪里使用它?同样,我不知道什么是二进制文件格式上下文中的对齐,但我们为什么需要它?
看起来他们都可以转储二进制文件的内容,
那有什么区别?
在最新版本的PE文件中,存在一个存根,用于向MS DOS用户显示该句子This program can not be run in DOS mode.为什么这样的消息仍然存在althogh它浪费了大约38个字节?还有人还在使用MS-DOS吗?
基本上,我想要做的是找到PE文件的最后一部分.我非常认真地阅读了PE规范,但我无法发现我的代码失败的地方.
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)buffer;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pidh + pidh->e_lfanew);
PIMAGE_FILE_HEADER pifh = (PIMAGE_FILE_HEADER)&pinh->FileHeader;
PIMAGE_OPTIONAL_HEADER pioh = (PIMAGE_OPTIONAL_HEADER)&pinh->OptionalHeader;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(pinh + sizeof(IMAGE_NT_HEADERS) + (pifh->NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER));
Run Code Online (Sandbox Code Playgroud)
buffer是包含加载的可执行文件的字节数组,pish是指向最后一节的指针.出于某种原因,似乎部门的数量超过20 000.
有任何想法吗 ?提前致谢
我正在尝试在Windows 7 Ultimate 64位中运行以下汇编代码(与Nasm一起组装).
; tiny.asm
BITS 32
;
; MZ header
;
; The only two fields that matter are e_magic and e_lfanew
mzhdr:
dw "MZ" ; e_magic
dw 0 ; e_cblp UNUSED
dw 0 ; e_cp UNUSED
dw 0 ; e_crlc UNUSED
dw 0 ; e_cparhdr UNUSED
dw 0 ; e_minalloc UNUSED
dw 0 ; e_maxalloc UNUSED
dw 0 ; e_ss UNUSED
dw 0 ; e_sp UNUSED
dw 0 ; e_csum UNUSED
dw 0 ; e_ip UNUSED
dw …Run Code Online (Sandbox Code Playgroud) 我怎么能告诉静态的Visual C ++放置一个全局变量在内存中的一个给定的绝对地址,像什么__attribute__((at(address)))呢?
DLL 函数调用的地址修复是一个多阶段过程:链接器将调用指令定向到间接跳转指令,并将间接跳转指令定向到 Windows 程序加载器将放置的 .rdata 部分中的导入表中的一个内存字在运行时加载 DLL 时函数的地址。
间接跳转指令必须由链接器生成,因为编译器不知道该函数会出现在 DLL 中。通过为每个函数只生成一条间接跳转指令来最小化程序文件的大小,无论从多少地方调用它。
鉴于此,显而易见的方法是在所有目标文件中的所有编译器生成的代码之后收集文本部分末尾的所有间接跳转指令,这似乎是我尝试带有 Microsoft 链接器 /nodefaultlib 开关的简单测试用例(它生成一个足够小的可执行文件,我可以理解完整的反汇编)。
当我以正常方式将一个小程序与 C 标准库链接时,生成的可执行文件足够大,我无法跟踪所有的反汇编,但据我所知,间接跳转指令似乎分散在各处一次可能是三个小组的代码。
有没有我失踪的原因?
如果你组装一个PE(.exe,Win32的可移植可执行文件)文件,它有一个你可以调用的入口点_start,_main或者你喜欢的任何东西.
问题是 - 这个入口点是否带有一些args?如果是这样,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?我在哪里可以找到关于此的一些文档?
有"First Thunk"(FT),加载程序在执行后用正确的地址覆盖.
但是当PE使用OFT时?
PE甚至需要吗?
windows assembly exe reverse-engineering portable-executable