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 |