关于在应用程序中使用 sysenter 的问题 ??

zxr65 2008-11-15 09:24:02
关于在应用程序中使用 sysenter 的问题 ??



我觉得 CLIB 中封装了常见函数的系统调用, 于是我想绕过 clib , 直接使用 sysenter 指令进行系统调用, 理由是 sysenter 可以运行任何优先级, 而且我的 CPU 是奔腾双核, 但是出现的问题是:
首先 sysenter 指令不被 MASM 识别,
于是我直接使用 sysenter 的操作码 OF 34 ,编译可以通过,但是运行时程序就直接退出了。 我觉得很奇怪, 为什么不能绕过 CLIB 在应用程序直接进行系统调用呢 ?

...全文
932 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
刮风 2009-09-08
  • 打赏
  • 举报
回复
我来学习了。 模拟Native API里的sysenter调用即可。不过要费点神啊。

不过直接使用sysenter好像没有任何好处哈。 除非可以在ring0 执行自己在ring3中定义的代码,那就。。。
dalixux 2008-11-18
  • 打赏
  • 举报
回复
结贴吧 代码给你了 哈哈 记得给分
.386
.model stdcall,flat
option casemap:none
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
includelib ntdll.lib;这个LIB 默认是没的 要在DDK里找
include D:\RadASM\masm32\macros\ucmacros.asm

ZwDeleteFile PROTO :DWORD
UNICODE_STRING struct
_Length dw ?
MaxLength dw ?
Buffer dd ?
UNICODE_STRING ends
PUNICODE_STRING typedef ptr UNICODE_STRING

OBJECT_ATTRIBUTES struct
_Length dd ?
RootDirectory dd ?
ObjectName PUNICODE_STRING ?
Attributes dd ?
SecurityDescriptor dd ?
SecurityQualityOfService dd ?
OBJECT_ATTRIBUTES ends

POBJECT_ATTRIBUTES typedef ptr UNICODE_STRING

OBJ_CASE_INSENSITIVE equ 00000040h

.data
stObjAtr OBJECT_ATTRIBUTES <0>
WSTR szFileName,"\??\c:\1.txt"
UnicodeName UNICODE_STRING <0>

.code
start:
;初始化结构
mov UnicodeName._Length, 24
mov UnicodeName.MaxLength,100
mov UnicodeName.Buffer ,offset szFileName

mov stObjAtr._Length,sizeof stObjAtr
mov stObjAtr.RootDirectory,0
mov stObjAtr.ObjectName,offset UnicodeName
mov stObjAtr.Attributes,OBJ_CASE_INSENSITIVE
mov stObjAtr.SecurityDescriptor,0
mov stObjAtr.SecurityQualityOfService,0


push offset stObjAtr
push @exit
push @exit
mov edx,esp
mov eax,3eh
db 0fh
db 34h
add esp,12
ret
@exit:
invoke ExitProcess,0
zxr65 2008-11-17
  • 打赏
  • 举报
回复
谢谢 dalixux

我的问题其实很简单

filename DB "C:\\1.TXT", 0
mov eax, 3EH // DeleteFile service number
mov edx, OFFSET filename
DB OF 34 // 不能使用 sysenter 否则会出现 error opcode

不管 eax 与 edx 如何指定, sysenter 总能执行到 Kifastcall* ,
如果检查参数出错他就可能异常退出了, 而不会执行我想要的 DeleteFile , 我想我
的 sysenter 可能被执行了。
dalixux 2008-11-17
  • 打赏
  • 举报
回复
你的参数首先就错了。。。native 函数和封装后的函数deletefile参数是不同的
edx 不是直接指向参数的 需要一个偏移量
dalixux 2008-11-16
  • 打赏
  • 举报
回复
调用内核的NT函数的话 你需要反汇编一下ntdll中的相应函数
eax 存放dispatch ID,edx存放的不是 参数堆栈的首地址
有一个偏移量的 是8还是多少的 具体的要反汇编KifastcallEntry

楼上说的RING0 上下文 实际上是由KiFastCallEntry来切换的
使用sysenter 是不需要管这个的 最重要的是eax,和edx的值
这两个正确 才能调用正确

dalixux 2008-11-16
  • 打赏
  • 举报
回复
windows XP
ntdll 的NT系列的函数里面 就使用了sysenter指令 用户模式不可能用不了sysenter
调用sysenter指令前 eax,edx设置不对的话 怎么可能调用成功?


反汇编Kifastcallentry后
kifastcallentry 作用就是 切换堆栈,设置edx为参数堆栈首地址,验证eax值即dispatch ID是否正确
复制参数堆栈 最后根据dispatch ID算出的 函数地址 调用函数

整个过程中 只和eax和edx有关 你确定你调用前 它们的值是对的吗?
sysenter指令执行后进入内核了 普通的调试器如OD,VC之类的 是无法跟进去的

要么你用softice 或者windbg 断了看看 只要执行sysenter后 能在Kifastcall**断下来 就证明RING3 是能执行该指令的


linux2.6内核 我没看过 具体不清楚

我不知道你是不是想直接调用native函数 如果是的话 比较麻烦 因为EDX不是直接就指向参数堆栈的
在Kifastcall**会有个修正
自己反汇编下 就知道了

麻烦给分吧 哈哈哈


zxr65 2008-11-16
  • 打赏
  • 举报
回复
to both above:
我觉得
"在使用SYSENTER之前必须定义好RING0 CS EIP ESP" 是系统初始化时用WMSR 指令设置好 CS EIP ESP ,而且这个 EIP 应该就是 KifastcallEntry 或 Kifastcall*, 当从 RING3 调用 SYSENTER 时, 就执行 Kifastcall* 函数
这个跟 LINUX 2.6 原理是完全一样的。 但是我的问题是我在 RING3 无法直接使用 SYSENTER 指令调用系统调用 !!! 而这理论上是可以实现的
过去的我 2008-11-15
  • 打赏
  • 举报
回复
"在使用SYSENTER之前必须定义好RING0 CS EIP ESP"

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧