【发布时间】:2016-10-07 20:07:01
【问题描述】:
我有这段代码
__asm
{
mov eax, fs:[18h]
mov eax, [eax + 30h]
mov eax, [eax + 0Ch]
mov pmInfo, eax
}
这应该是在第一行检索TEB,在第二行检索PEB,最后一个是包含进程模块信息的结构体。
typedef struct _ProcessModuleInfo
{
unsigned int size;
unsigned int initialized;
HANDLE SsHandle;
LIST_ENTRY LoadOrder;
LIST_ENTRY InitOrder;
LIST_ENTRY MemoryOrder;
} ProcessModuleInfo, *pProcessModuleInfo;
我的问题是,如何将那段程序集转换为代码块的 GCC 编译器?
【问题讨论】:
-
你会使用GCC extended assembler template。但是,如果您是 GCC 的新手,这非常重要。除非你知道你在用 GCC inline 做什么,否则很难做到正确。您最好将该代码作为函数放在汇编文件中并将其链接到您的 C 代码。
-
感谢您的回复。我检查了很多链接,但正如你所说,这确实非常重要。我现在真正在寻找的只是这个特定问题的快速解决方案。我从来没有使用过汇编文件链接,但我可以研究它是如何完成的。如果有人有任何其他快速解决方案或 GCC 的代码本身,我将不胜感激!
-
谢谢!它似乎有效。
-
您是否将代码移植到非 Windows?如果是这样,您确定相同的说明甚至是您想要的吗?例如您可能应该使用 C/C++ 语法进行线程本地存储,并让编译器生成对线程本地存储块的访问。
-
@PeterCordes :我可能错误地认为他仍然针对 Windows 并且在 Windows 上使用 Codeblocks(使用 TDM-GCC 编译器)。由于我没有看到 Linux 的提及,我认为他正在转向 Win32 平台上的不同编译器(MSVC 到 Win32/TDM GCC)。如果这对他有用,我的假设可能是正确的,在尝试取消引用 Linux 上的指针时,我预计会出现段错误)
标签: visual-studio gcc x86 porting inline-assembly