- 基于 Windows 的可执行文件如何工作?
- 如何在可执行文件中找到起始地址?
- 对于任何文件执行,地址存储在哪里,我们如何读取这些地址?
- 任何 dll 或 exe 文件的 call 和 ret 是如何工作的?
给我提示使用 ida pro 反汇编程序。
给我提示使用 ida pro 反汇编程序。
程序的虚拟起始地址记录在可执行文件的标头中。任何了解这些结构的标题查看器程序都可以轻松地显示它们,例如 HT (http://hte.sf.net/) — 仅举一个例子。IDAPro 可能有类似的东西。
任何 dll 或 exe 文件的 call 和 ret 是如何工作的
这实际上取决于它是有问题的 DLL 还是 EXE。
当 Windows 的模块加载器完成加载 DLL 时,它会使用参数调用 DLL 的起始地址(称为“DllMain”)DLL_PROCESS_ATTACH
(参见DllMain 的文档)。如果 DllMain 返回 1,则加载程序继续。
但是,当您启动 EXE 时,系统会生成一个新进程并将ntdll.dll映射到该进程的地址空间,然后生成从 NTDLL 的起始地址运行的主线程。然后该线程执行更多初始化,加载 EXE 文件(加上其导入表中列出的任何 DLL)并调用由 EXE 的起始地址标识的函数。当该函数返回时,NTDLL 然后调用NtTerminateProcess
它杀死所有正在运行的线程并关闭进程。
使用用户模式调试器可能很难观察到这个 EXE 启动过程;一些调试器在进程初始化的早期阶段难以突破。