zoukankan      html  css  js  c++  java
  • Win64 驱动内核编程-24.64位驱动里内嵌汇编

    64位驱动里内嵌汇编

        讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行。

    获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内存内容,再把内存内容复制出来。或者是去我看的资料上的那个作者提供的一个工具:

    http://www.vbasm.com/thread-5651-1-1.html)直接把汇编编程机器码。

     

        内嵌的汇编子程序有返回值以及 给汇编子程序传入参数

    首先是使用 typedef 定义一下你的汇编子程序的原型,然后把机器码复制到 NonPagedPool 里,最后直接把 NonPagedPool 的地址当作函数来 CALL。代码示例如下(输入四个数字相加,返回它们相加的值):

    typedef UINT64 ( __fastcall *SCFN)(UINT64,UINT64,UINT64,UINT64);
    VOID test()
    {
    SCFN scfn;
    UINT64 ret;
    UCHAR strShellCode[14]="x48x03xCAx49x03xC8x49x03xC9x48x8BxC1xC3";
    /*
    add rcx,rdx
    add rcx,r8
    add rcx,r9
    mov rax,rcx
    ret
    */
    scfn=ExAllocatePool(NonPagedPool,14);
    memcpy(scfn,strShellCode,14);
    ret=scfn(11,22,33,44);
    DbgPrint("[x64Drv] Inline ASM return: %lld",ret);
    ExFreePool(scfn);
    }


  • 相关阅读:
    高斯消元
    丑数
    扩展欧几里得算法与线性同余方程
    数论-求逆元
    数论-快速幂-快速乘
    宋逸轩长难句 2
    宋逸轩长难句 1
    c语言 文件
    c语言程序结构
    c语言结构类型
  • 原文地址:https://www.cnblogs.com/csnd/p/12061997.html
Copyright © 2011-2022 走看看