内嵌汇编如何使用 fword ptr ?(100分)

  • 主题发起人 主题发起人 ypy
  • 开始时间 开始时间
Y

ypy

Unregistered / Unconfirmed
GUEST, unregistred user!
需要使用 call fword prt[aaa],可是delphi 不支持 far call 如何变通解决?
 
mov eax,aaa
call eax
行么?
我汇编不好的说:)
 
sorry,

mov eax,aaa
call [eax]
 
这样不行,fword 是far call 48位的
 
哦,是这样啊,那你看看这个行不行:
asm
dw $ff2e
bd $1d
dw $12345678
end;
反汇编:
call far dword ptr cs:[12345678]
 
对,要直接用code。cpuid也是这么用的。
 
bd $1d这句编译通不过,直接用code 什么意思,能不能详细接受一下?
 
而且dw $12345678也不行,$12345678 超过了word的长度
 
是这样吧
dw $ff2e
db $1d
dd $12345678

但是反汇编后是 call cs:[12345678],你的call far dword ptr cs:[12345678]是如何得到的呢?delphi版本不一样?

还有一个问题这时cs的值怎么办?
 
赫赫,笔误笔误
这样做是直接在程序中插入汇编对应的机器码。
delphi 不支持 far call ,所以在它的调试环境中只会现实为call cs:[12345678],
但用其他反汇编工具如W32DASM:
http://www.pediy.com/tools/Disassemblers/W32Dasm/W32dsm8.93.rar
即可看到结果。
至于cs的问题,我不太清楚,可能只是表示方法上的问题?
你是要做ring0有关的东西么?如果你手上有现成的进入ring0的exe文件,那就返汇编他,看看他的相应代码(far call部分)的机器码是什么,然后按你的需要改一下嵌在程序中就行了。
如果你实在想知道如何根据asm构造其对应的opcode,那就找些这方面的资料看看吧,反正我汇编是很差的。
 
是想做ring0 的,兄弟猜着了:)
如果这样构造机器码,但dd $12345678部分是变量,怎么构造呢?
 
反汇编了一下,原码是 call fword ptr [farcall],出来的是call far [ebp-0c]机器码是FF5DF4
 
这个ebp-0c是指farcall这个局部变量,不同的局部变量是不同的,好像和变量的个数有关。你可以首先在别的地方引用一下这个变量,看看他是bep-X然后改f4那位因该能搞定。如果能用全局变量的话,则可以直接引用其地址,应为全局变量的地址是固定的,直接表示成40XXXX之类的。
不知ypy在写什么冬冬?是不用驱动执行ring0代码的么?
那个东西前一阵我也看了一下,不过有人说通用性不好,主要是mGetPhysicalAddress在某些版本windows上返回的物理地址不正确,所以也就没再玩。如果你写好了不知能不能发个源码上来?
 
就是在搞那个,GetPhysicalAddress返回地址是不正确,只是猜测,但是进入ring0后系统有一个mmGetPhysicalAddress函数,可以调用,返回的不就正确了吗?
现在就差这个问题了,搞定就贴上了
 
http://expert.csdn.net/Expert/topic/2718/2718748.xml?temp=.9343073
这是我在csdn上跟一个朋友讨论的,一起来?
 
已经解决了,多谢tt.t帮忙,等我把整理好把代码贴出来
 
多人接受答案了。
 
后退
顶部