注册 登录
编程论坛 汇编论坛

windows内核开发中遇到一点关于汇编的问题,求高手解答。

asdiopss 发布于 2018-03-06 17:24, 2987 次点击
先说下自己的设计思路
我在disablepatchgurad的过程中  要用到一个非文档化的函数,有两个解决方案,一个是在应用层下载符号表来找,二个是在内核注册个dpc例程,然后通过回溯获得
我选择第二种(总觉得一个内核程序还是尽量少依靠R3程序比较好)

既然思路有了 那么就是实现了  我的想法是  进入DPC例子后  当前ESP值肯定保存的是这个DPC完成之后的返回值
那么我有
PVOID testadd=NULL
__asm
{
    mov eax,esp
    mov testadd,eax
}
当我编译调试后 发现最后testadd中的值是堆栈地址 而不是该地址中的值
于是我又想
__asm
{
   pop eax
  mov testadd,eax
}
结果还是不行
本人没深入接触过汇编,特来求助
希望大神能解答下
附图
只有本站会员才能查看附件,请 登录

图片中红色箭头指向的是当前堆栈栈顶
黑色箭头指向的是我想要的值
红色方框是我写的汇编代码。
求大神指点 该怎么写!感激不尽
5 回复
#2
Valenciax2018-03-06 18:34
试试
mov eax,[esp]
mov testadd,eax
#3
asdiopss2018-03-06 19:27
回复 2楼 Valenciax
试过 取出来的数值不对
#4
asdiopss2018-03-06 19:43
回复 2楼 Valenciax
代码如下
#pragma LOCKEDCODE
VOID PgTempDpc(
    IN struct _KDPC *Dpc,
    IN PVOID DeferredContext,
    IN PVOID SystemArgument1,
    IN PVOID SystemArgument2
    )
{
    //先保存原始eax到全局变量里
    __asm{
        mov tempeax, eax
            mov eax, [esp]
            mov address,eax
            mov eax,tempeax
    }
    DbgPrint("%x", address);
    DbgPrint("enter the dpc\n");
    return;
}
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

#5
asdiopss2018-03-06 19:48
回复 2楼 Valenciax
问题解决了
应该是用esp+4
mov eax,[esp+4]
谢谢版主
#6
asdiopss2018-03-06 19:54
只有本站会员才能查看附件,请 登录

最后测试
通过符号表获得的函数地址和回溯法获得的地址一样
1