[原创]另一种进入NT内核方法的汇编版本

简介:

要说明的是该方法本身不是我的原创 ,是其他大牛首先写出来的。

而我只是将该方法的C版本 "翻译" 成 masm32 版本。: )

 

. 386
. model flat ,  stdcall
option casemap
:none

include  c:
masm32 include windows . inc
include  c:
masm32 include user32 . inc
include  c:
masm32 include kernel32 . inc
include  c:
masm32 include advapi32 . inc
includelib c:
masm32 lib user32 . lib
includelib c:
masm32 lib kernel32 . lib
includelib  c:
masm32 lib advapi32 . lib
include  c:
masm32 macros ucmacros . asm

UNICODE_STRING STRUCT
  _Length  WORD ?
  MaximumLength WORD ?
  Buffer  DWORD ?
UNICODE_STRING ENDS

SystemLoadAndCallImage  equ 
38

_ZwSetSystemInformation  typedef proto 
:dword , :dword , :dword
lpZwSetSystemInformation typedef ptr _ZwSetSystemInformation

_RtlInitUnicodeString  typedef proto 
:dword , :dword
lpRtlInitUnicodeString  typedef ptr _RtlInitUnicodeString

SYSTEM_LOAD_AND_CALL_IMAGE struct

 ModuleName UNICODE_STRING 
< ? >

SYSTEM_LOAD_AND_CALL_IMAGE ends

 
. const
txt    db 'Just 
Do  It!' , 0
cp    db 'hopy|侯佩'
, 0
WSTR    drvnameW
, " ??c: mpDrv.sys "
drvname    db '
?? c: tmp Drv . sys' , 0
dllname    db 'ntdll
. dll' , 0
szZwSetSystemInformation db 'ZwSetSystemInformation'
, 0
szRtlInitUnicodeString  db 'RtlInitUnicodeString'
, 0

 
. data?
hInstance   dd    ?
hdll    dd    ?
stSysCallImage   SYSTEM_LOAD_AND_CALL_IMAGE 
<>
ZwSetSystemInformation  lpZwSetSystemInformation ?
RtlInitUnicodeString  lpRtlInitUnicodeString  ?

 
. code
start :
 invoke GetModuleHandle
,   0
 mov hInstance
, eax

 invoke LoadLibrary
, addr dllname
 mov hdll
, eax

 invoke GetProcAddress
, hdll , addr szZwSetSystemInformation
 mov ZwSetSystemInformation
, eax

 invoke GetProcAddress
, hdll , addr szRtlInitUnicodeString
 mov RtlInitUnicodeString
, eax
 
 invoke RtlInitUnicodeString
, addr stSysCallImage . ModuleName ,
  addr drvnameW

 invoke ZwSetSystemInformation
, SystemLoadAndCallImage ,
  addr stSysCallImage
,
  sizeof SYSTEM_LOAD_AND_CALL_IMAGE

 invoke MessageBox
, NULL , addr txt , addr cp , MB_OK

 invoke ExitProcess
, NULL
end   start

相关文章
|
5月前
|
存储 安全 Windows
3.6 Windows驱动开发:内核进程汇编与反汇编
在笔者上一篇文章`《内核MDL读写进程内存》`简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用`capstone`引擎实现这个功能。
26 0
3.6 Windows驱动开发:内核进程汇编与反汇编
|
11月前
|
安全 开发工具 Windows
驱动开发:内核实现进程汇编与反汇编
在笔者上一篇文章`《驱动开发:内核MDL读写进程内存》`简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用`capstone`引擎实现这个功能。
234 0
|
11月前
|
存储 移动开发 前端开发
linux内核1-GNU汇编入门_X86-64&ARM(下)
linux内核1-GNU汇编入门_X86-64&ARM(下)
|
11月前
|
存储 前端开发 rax
linux内核1-GNU汇编入门_X86-64&ARM(上)
linux内核1-GNU汇编入门_X86-64&ARM
驱动开发:内核LDE64引擎计算汇编长度
本章开始`LyShark`将介绍如何在内核中实现`InlineHook`挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用`LDE64`这个反汇编引擎,该引擎小巧简单可以直接在驱动中使用,LDE引擎是`BeaEngine`引擎的一部分,后来让`BeatriX`打包成了一个`ShellCode`代码,并可以通过`typedef`动态指针的方式直接调用功能,本章内容作为后期`Hook`挂钩的铺垫部分,独立出来也是因为代码太多太占空间一篇文章写下来或很长影响阅读。
202 0
驱动开发:内核LDE64引擎计算汇编长度
|
C语言 iOS开发 MacOS
汇编语言版本的HelloWorld
平台 macOS 工具 nasm clang 文件 main.asm extern _printf ; 这里调用系统的一个系统调用函数, _printf, 使用extern告诉链接器该label在其他文件中有定义, _printf只接受一个string的地址, 和C语言层面上的printf是一样的 section .
967 0
|
Linux 数据安全/隐私保护
Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7) 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4938389.html  在完成了zImage自解压之后,就跳转到了解压后的内核(也就是vmlinux的bin版本Image),具体的入口可以在arch/arm/kernel/vmlinux.
859 0