繁体   English   中英

x86 代码 - 通过 ds 段选择器调用?

[英]x86 code - Call through ds segment selector?

我正在使用windbg在windows上调试32位x86代码级别的东西。 有些事情让我感到困惑,我已经将其缩减为通过 ds 段选择器显示给 go 的调用,这显然我不明白。

下面只是重现我的困惑的最小示例,它不是我正在处理的实际问题。

我在 DLL 中有一个 function

__declspec(dllexport) void __cdecl MyDllTest_Cdecl(int i);

void __cdecl MyDllTest_Cdecl(int i)
{
    printf("In MyDll MyDllTest_Cdecl(%d)\n", i);
}

在可执行文件中,我静态链接到 DLL 并调用 function

void __cdecl MyDllTest_Cdecl(int i);

MyDllTest_Cdecl(1);

在windbg中调试进程,执行在function调用的位置,我找到windbg所示的以下机器代码

call    dword ptr [UseDll_Static!_imp__MyDllTest_Cdecl (00062118)] ds:002b:00062118={MyDll!MyDllTest_Cdecl (68391100)}

我在 windbg 中关闭了源模式( lt ),因此跟踪命令( t )应该始终单步执行机器代码而不隐藏任何内容。

当我使用 trace ( t ) 命令时,执行突然移动到 0x68391100 (如 call 命令的反汇编所示)。

这是如何运作的? 地址 0x68391100 来自哪里? 一个 x86 反汇编程序显示机器代码 ff1518219e00 是

call   DWORD PTR ds:0x00062118

正如windbg所示。

我知道编译器/链接器/加载器通过calljmp指令使用间接,特别是对于 DLL 中的 function 的调用。 我看到在其他情况下,但我能够单步执行包含 C 级 function 调用的每个调用jmp 在这种情况下,这是一个步骤。 所以这不是编译器/链接器/加载器创建的调用jmp指令的间接调用。

在地址 0x00062118 我看到以下内容:

0:000> u 00062118
UseDll_Static!_imp__MyDllTest_Cdecl:
00062118 0011            add     byte ptr [ecx],dl
0006211a 396820          cmp     dword ptr [eax+20h],ebp
0006211d 1139            adc     dword ptr [ecx],edi

所以那里没有jmpcall可能是间接的一部分。 它是符号UseDll_Static!_imp__MyDllTest_Cdecl的地址,但那里的代码看起来像垃圾。

符号可以忽略,我想知道如何

call   DWORD PTR ds:00062118

将执行移至 0x68391100。 ds寄存器为 0x002b。

我想我基本了解了实模式下的x86分割。 但我认为现代 Windows 在保护模式下,虚拟 memory 基本上是一个平坦的 2^32 地址空间。 无论如何,如果有一些分段偏移,在这种情况下它将是0x68391100 - 0x000621180x6832efe8 我希望偏移量以一个或多个零结尾。

这可能完全无关紧要,但是当我尝试使用 windbg 中的dg命令显示0x002b选择器(这是ds寄存器中的内容)时,它显示

0:000> dg 0x002b
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
002B 00000000 ffffffff Data RW Ac 3 Bg Pg P  Nl 00000cf3

感谢您的帮助...这是一个简单的问题,但我试图避免关注 DLL 中的函数是如何链接和加载的,或者关注 x86 实模式分割的历史。 我只想在机器代码的层面上理解。

0x00062118 是存储实际 function 地址的段偏移量。 如果你看你的反汇编,0x00062118 的前四个字节是 0x00、0x11、0x39 和 0x68。 它们将以相反的顺序加载到 EIP 中,产生 0x68391100,这是您跳转到的地址!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM