我正在分析一个反汇编的dll并且卡在了线上
mov ebx,fs:[00000004h]
我想找出用这条指令写入ebx的数据的确切物理地址 . gdb告诉我 fs = 0x53.
我已经发现地址取决于模式(受保护或真实),我很确定CPU处于保护模式(参见*) . 所以段fs的开始应该存储在GDT的某个地方,对吧?我还找到了 GDT-register (0x009bd5c0007f)
的地址,但gdb并不知道如何找出fs的物理地址(因此, fs:[00000004h]
) .
有人能帮帮我吗?
我使用了指令 smsw ax
,之后 eax
是0x280031 . 所以最后一位是1,这意味着保护模式 . 我做对了吗?
2 回答
因为你在Windows上都是're mentioning a DLL, I assume it' . 在Windows上,已知
FS
指向线程信息块(TIB) . 在偏移量4处,有指向堆栈顶部的指针 . 代码将它加载到EBX
,就是这样 .FS的 Value 无关紧要,也不需要围绕GDT . 它是API的文档部分 .
是的,它是受保护的模式 .
您可能通过使用
SGDT
指令找到了GDT
的虚拟地址 .但是,该地址不太可能有用,因为您只能从OS内核中执行的代码读取该地址的内存(可能是内核模式驱动程序) .
您需要找到一种从内核中读取感兴趣的内存的方法 .