www.jybase.net - 寂涯网络学习基地

404 Error: 抱歉, 您所查找的页面不存在, 可能已被删除或您输错了网址!

404错误,没有发现你要找的页面, 经砖家仔细研究结果如下:

首 页 | 在线视频观看 | 系统综合 | 网站相关 | 教程共享 | 网赚教程共享 | 精品软件下载 | 网盘搜


























免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > windows > 谈谈64 位程序的内嵌汇编(2)

谈谈64 位程序的内嵌汇编(2)

时间:2011-11-20 22:58来源:未知 整理:寂涯网络 点击:


    VirtualProtect(strShellCode,45,PAGE_EXECUTE_READWRITE,&xxx);
    scfn=(SCFN)p;
    ret=scfn(11,22,33,44);
    printf("%lld",ret);
    getchar();
}
void main()

    test_function_params_return();
}

在驱动程序里内嵌汇编也类似,不过需要注意的是不能直接把数组当作函数来执行,首
先要用ExAllocatePool申请一块NonPagedPool内存,然后把数组的内容复制到那片内存里,
再把那片内存当作函数来执行:  
typedef UINT64 (__fastcall *SCFN)(UINT64,UINT64,UINT64,UINT64);
 
VOID test()
{
    SCFN scfn;
    UINT64 ret;
    UCHAR
strShellCode[14]="\x48\x03\xCA\x49\x03\xC8\x49\x03\xC9\x48\x8B\xC1\xC3";
    /*
    add rcx,rdx
    add rcx,r8
    add rcx,r9
    mov rax,rcx
    ret
    */
    scfn=ExAllocatePool(NonPagedPool,14);
      ret=scfn(11,22,33,44); 
    DbgPrint("[x64Drv] Inline ASM return: %lld",ret);
    ExFreePool(scfn);

需要注意的是,在Windows 7系统中 DebugView可能无法截获任何输出,这是因为系统
引入了一个新函数DebugPrintEx导致的。要想DebugView截获输出,需要执行以下步骤: 

1.在 HKLM\SYSTEM中查找Debug Print Filter项
2.把 Debug Print Filter项中 Default键的值改为ffffffff 

在 VB2010中内嵌汇编比在VB6中内嵌汇编困难多了,因为VB2010不支持指针操作。为
此,微软有一篇技术文章专门是写如何在VB.NET中内嵌汇编(网址:
http://www.microsoft.com/china/msdn/library/langtool/vbnet/SDaskgui12172002.msp
x?mfr=true)。这篇文章十分长,让我来评价就四个字:废话连篇!因为在VB里内嵌汇编的
原理是十分简单的,就是使用 CallWindowProcW,它的第一个参数为待调用汇编子程序的起
始地址,后四个参数位汇编子程序的头四个参数。两句话就讲完的问题,何须如此故弄玄虚,
故作高深?!编程本来很容易,但是被砖家弄得无比复杂,本人最讨厌的就是把简单问题复
杂化的文章,以及写这种文章的作者。我认为,把复杂的问题简单化才是能耐。
言归正传,尽管VB2010不能直接使用指针(不能用VarPtr获得指针的值),但是还是可
以用 ByRef变相传递指针的。不过在VB2010中内嵌汇编还是有一点限制的,详述如下:1.
内嵌的汇编子程序只能是__fastcall约定,不能是别的约定。CallWindowProcW的后四个参
数分辨传入的是rcx、rdx、r8、r9的值;2.内嵌的汇编子程序只能方便地传递四个参数,
多于四个参数就比较麻烦了(但不是没有办法传递)。在声明CallWindowProcW时对第一个
参数用 ByRef As Byte,就是传送字节指针的意思,调用的时候把数组的第0个元素写入实
参,通过这种方式就变相把汇编子程序起始地址传递给了CallWindowProcW,因为在VB 里
汇编子程序的机器码也是放在CHAR数组里的(等效于C 语言里通过&array[0]来传递数组地
址)。我写下了如下的代码测试:  

 Module Module1
    Private Declare Function VirtualProtect Lib "kernel32.dll" (ByRef
lpAddress As Byte, ByVal dwSize As Long, ByValflNewProtect As Long, ByRef  

lpflOldProtect As Long) As Long
  Private Declare Function CallWindowProc Lib "user32.dll" Alias
 "CallWindowProcW" (ByRef lpFunc As Byte,ByVal rcx As Long, ByVal rdx As Long,
ByVal r8 As Long, ByVal r9 As Long) As Long
    Sub Main()
        Dim x(12) As Byte, y As Long, z As Long
        x(0) = &H48
        x(1) = &H3
        x(2) = &HCA
        x(3) = &H49
        x(4) = &H3
        x(5) = &HC8
        x(6) = &H49
        x(7) = &H3

本页地址 http://www.jybase.net/windows/20111115619.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商