#2
zklhp2009-10-13 12:38
|
程序代码:
看到了注入这里。做个练习。
[code]; ml /c /coff ServerDll.asm
; rc ServerDll.rc
; Link /subsystem:windows /section:.bss,S /Def:ServerDll.def /Dll ServerDll.obj ServerDll.res
;by onepc 153785587
;注入练习
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include Advapi32.inc
includelib Advapi32.lib ;注册表
include ServerDll.inc
includelib ServerDll.lib ;调用自己的HOOK函数
KBDLLHOOKSTRUCT STRUCT
vKcode DWORD ??
scanCode DWORD ??
flags DWORD ??
time DWORD ??
dwExtraInfo DWORD ??
KBDLLHOOKSTRUCT ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IDD_TEST_DIALOG equ 102
IDR_MAINFRAME equ 128
IDC_BUTTON1 equ 1000
IDC_BUTTON2 equ 1001
IDC_EDIT1 equ 1002
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data?
hInstance dd ?
hMain dd ?
szTextBuffer db MAX_PATH dup (?)
hHook dd ? ;钩子句柄
.const
szZhuYe db 'http://www.baidu.com/index.php?tn=onepc_pg',0
;HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
szRegMain db 'Software\Microsoft\Internet Explorer\Main',0
szRegName db 'Start Page',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;****************************************************************
;****************************************************************
;****************************************************************
_CALLBACKHOOK proc _dwCode,_wParam,_lParam ;钩子过程
.if _dwCode==HC_ACTION ;有键盘/鼠标消息时处理
.if (_wParam == WM_KEYDOWN) || (_wParam == WM_SYSKEYDOWN)
mov edx,_lParam
assume edx:PTR KBDLLHOOKSTRUCT
.if ([edx].vKcode == VK_F10)
invoke IsWindowVisible,hMain
.if eax
invoke ShowWindow,hMain,SW_HIDE
.else
invoke ShowWindow,hMain,SW_NORMAL
.endif
assume edx:nothing
mov eax,TRUE
ret
.endif
.endif
.endif
invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam ;其他键放到下一个钩子
assume edx:nothing
ret
_CALLBACKHOOK endp
_INSTALLHOOK proc ;安装钩子
invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr _CALLBACKHOOK,hInstance,NULL ;全局钩子
mov hHook,eax ;保存钩子
ret
_INSTALLHOOK endp
_UNINSTALLHOOK proc ;卸载钩子
invoke UnhookWindowsHookEx,hHook ;卸载钩子
ret
_UNINSTALLHOOK endp
;****************************************************************
;****************************************************************
;****************************************************************
;设置主页
_SetRegMain proc
local @hRegKey,@dwMainsize
invoke GetDlgItemText,hMain,IDC_EDIT1,offset szTextBuffer,MAX_PATH ;取文本
invoke lstrlen,offset szTextBuffer ;计算长度
mov @dwMainsize,eax
invoke RegCreateKeyEx, HKEY_CURRENT_USER ,offset szRegMain,NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,addr @hRegKey,NULL
invoke RegSetValueEx,@hRegKey,offset szRegName,NULL,REG_SZ,offset szTextBuffer,@dwMainsize
invoke RegCloseKey,@hRegKey
ret
_SetRegMain endp
;;对话框回调过程
_DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam
.if uMsg==WM_INITDIALOG ;对话框初始化
push hDlg
pop hMain
invoke LoadIcon,hInstance,IDR_MAINFRAME
invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax
invoke SetDlgItemText,hDlg,IDC_EDIT1,offset szZhuYe
invoke _INSTALLHOOK ;安装
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if ax==IDC_BUTTON1
call _SetRegMain
.endif
.if ax==IDC_BUTTON2
invoke _UNINSTALLHOOK
invoke EndDialog,hDlg,FALSE
.endif
.elseif uMsg==WM_CLOSE
invoke _UNINSTALLHOOK
invoke EndDialog,hDlg,FALSE
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_DlgProc endp
;;对话框回调过程
_CreateDialog proc
invoke DialogBoxParam,hInstance,IDD_TEST_DIALOG,NULL,addr _DlgProc,NULL
ret
_CreateDialog endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry proc _hInstance,_dwReason,_dwReserved
local @dwThreadID
.if _dwReason == DLL_PROCESS_ATTACH ;表示动态链接库刚被映射到某个进程的地址空间,返回TRUE表示初始化成功
;返回FALSE表示初始化出错,这样库的装入就会失败
push _hInstance
pop hInstance
invoke CreateThread,NULL,0,offset _CreateDialog,NULL,\
NULL,addr @dwThreadID ;装入时建一个线程创建对话框
invoke CloseHandle,eax
.endif
mov eax,TRUE
ret
DllEntry Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End DllEntry
[code]; ml /c /coff ServerDll.asm
; rc ServerDll.rc
; Link /subsystem:windows /section:.bss,S /Def:ServerDll.def /Dll ServerDll.obj ServerDll.res
;by onepc 153785587
;注入练习
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include Advapi32.inc
includelib Advapi32.lib ;注册表
include ServerDll.inc
includelib ServerDll.lib ;调用自己的HOOK函数
KBDLLHOOKSTRUCT STRUCT
vKcode DWORD ??
scanCode DWORD ??
flags DWORD ??
time DWORD ??
dwExtraInfo DWORD ??
KBDLLHOOKSTRUCT ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IDD_TEST_DIALOG equ 102
IDR_MAINFRAME equ 128
IDC_BUTTON1 equ 1000
IDC_BUTTON2 equ 1001
IDC_EDIT1 equ 1002
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data?
hInstance dd ?
hMain dd ?
szTextBuffer db MAX_PATH dup (?)
hHook dd ? ;钩子句柄
.const
szZhuYe db 'http://www.baidu.com/index.php?tn=onepc_pg',0
;HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
szRegMain db 'Software\Microsoft\Internet Explorer\Main',0
szRegName db 'Start Page',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;****************************************************************
;****************************************************************
;****************************************************************
_CALLBACKHOOK proc _dwCode,_wParam,_lParam ;钩子过程
.if _dwCode==HC_ACTION ;有键盘/鼠标消息时处理
.if (_wParam == WM_KEYDOWN) || (_wParam == WM_SYSKEYDOWN)
mov edx,_lParam
assume edx:PTR KBDLLHOOKSTRUCT
.if ([edx].vKcode == VK_F10)
invoke IsWindowVisible,hMain
.if eax
invoke ShowWindow,hMain,SW_HIDE
.else
invoke ShowWindow,hMain,SW_NORMAL
.endif
assume edx:nothing
mov eax,TRUE
ret
.endif
.endif
.endif
invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam ;其他键放到下一个钩子
assume edx:nothing
ret
_CALLBACKHOOK endp
_INSTALLHOOK proc ;安装钩子
invoke SetWindowsHookEx,WH_KEYBOARD_LL,addr _CALLBACKHOOK,hInstance,NULL ;全局钩子
mov hHook,eax ;保存钩子
ret
_INSTALLHOOK endp
_UNINSTALLHOOK proc ;卸载钩子
invoke UnhookWindowsHookEx,hHook ;卸载钩子
ret
_UNINSTALLHOOK endp
;****************************************************************
;****************************************************************
;****************************************************************
;设置主页
_SetRegMain proc
local @hRegKey,@dwMainsize
invoke GetDlgItemText,hMain,IDC_EDIT1,offset szTextBuffer,MAX_PATH ;取文本
invoke lstrlen,offset szTextBuffer ;计算长度
mov @dwMainsize,eax
invoke RegCreateKeyEx, HKEY_CURRENT_USER ,offset szRegMain,NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,addr @hRegKey,NULL
invoke RegSetValueEx,@hRegKey,offset szRegName,NULL,REG_SZ,offset szTextBuffer,@dwMainsize
invoke RegCloseKey,@hRegKey
ret
_SetRegMain endp
;;对话框回调过程
_DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam
.if uMsg==WM_INITDIALOG ;对话框初始化
push hDlg
pop hMain
invoke LoadIcon,hInstance,IDR_MAINFRAME
invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax
invoke SetDlgItemText,hDlg,IDC_EDIT1,offset szZhuYe
invoke _INSTALLHOOK ;安装
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if ax==IDC_BUTTON1
call _SetRegMain
.endif
.if ax==IDC_BUTTON2
invoke _UNINSTALLHOOK
invoke EndDialog,hDlg,FALSE
.endif
.elseif uMsg==WM_CLOSE
invoke _UNINSTALLHOOK
invoke EndDialog,hDlg,FALSE
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_DlgProc endp
;;对话框回调过程
_CreateDialog proc
invoke DialogBoxParam,hInstance,IDD_TEST_DIALOG,NULL,addr _DlgProc,NULL
ret
_CreateDialog endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry proc _hInstance,_dwReason,_dwReserved
local @dwThreadID
.if _dwReason == DLL_PROCESS_ATTACH ;表示动态链接库刚被映射到某个进程的地址空间,返回TRUE表示初始化成功
;返回FALSE表示初始化出错,这样库的装入就会失败
push _hInstance
pop hInstance
invoke CreateThread,NULL,0,offset _CreateDialog,NULL,\
NULL,addr @dwThreadID ;装入时建一个线程创建对话框
invoke CloseHandle,eax
.endif
mov eax,TRUE
ret
DllEntry Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End DllEntry
ServerDll.def
EXPORTS
_INSTALLHOOK
_UNINSTALLHOOK
ServerDll.inc
_INSTALLHOOK proto
_UNINSTALLHOOK proto
加载程序
程序代码:
;注入练习
;by onepc 153785587
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
;include gdi32.inc ;图形
includelib user32.lib
includelib kernel32.lib
;includelib gde32.lib
include advapi32.inc
includelib advapi32.lib ;提权
include psapi.inc
includelib psapi.lib;快照
include macro.asm ;ctxt("")
.data
szKernel db 'Kernel32.dll',0
szLoadLibrary db 'LoadLibraryA',0
szDll db '\ServerDll.dll',0
szExplorer db 'EXPLORER.EXE',0 ;explorer.exe在注入的进程
szPrivilegeName db 'SeDebugPrivilege',0 ;SeDebugPrivilege权限可以关闭服务进程
;通过设置正在运行的进程 SeDebugPrivilege 权限,
;您可以获取任何正在运行的应用程序进程句柄。
;获取进程句柄时, 可以指定 PROCESS_ALL_ACCESS
;标志将允许可以正常情况下不执行该进程句柄时的各种 Win 32 API 的调用
.data?
hInstance dd ? ;模块句柄
lpLoadLibrary dd ? ;LoadLibraryA的地址
lpProcessMem dd ? ;指向申请到的线性地址
szDllFull db MAX_PATH dup (?) ;dll文件名
hSanp dd ? ;快照句柄
stSanp PROCESSENTRY32 <?> ;快照的结构
hProcess dd ? ;explorer.exe的进程句柄
.const
.code
;********************************************************************
; 提升权限 start
;********************************************************************
_SeDebugPrivilege proc
local @stTkp:TOKEN_PRIVILEGES,@stLuid:LUID
local @hToKen;:DWORD
invoke GetCurrentProcess ;GetCurrentProcess得到得到的称之为"伪句柄"只是一个标识,你可以发现,其实就是返回$FFFFFFFF
;每个进程得句柄都是一样得,只是实用于进程内部得使用.
;如果你想得到实际得句柄,在进程间进行通讯,必需要进行转化,
;调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭.
;其实,你应该明白了为何"伪句柄"得存在,就是使用简单,不用关闭,
;不会造成内存泄漏.
mov ecx,eax ;直接用eax会出现register value overwritten by INVOKE
invoke OpenProcessToken,ecx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr @hToKen
;.if !eax ;返回0则表示出错
; invoke MessageBox,NULL,CTXT("获取访问令牌句柄失败!"),CTXT("出错"),0
; ret
;.endif
;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid
invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stLuid
;.if !eax
; invoke MessageBox,NULL,CTXT("获取当前进程权限失败!"),CTXT("出错"),0
; ret
;.endif
;这些函数用在NT以上的系统,也可以在之前判断本系统是否是NT以上的系统。
;第一个参数表示所要查看的系统,本地系统直接用NULL
;第二个参数表示所要查看的特权信息的名称,定义在winnt.h中
;第三个参数用来接收所返回的制定特权名称的信息。
mov @stTkp.PrivilegeCount,1
;***********************************************
;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid
;用这个,下面这个push可以不要。因为直接已把特权信息放到@stTkp.Privileges[0].Luid中。
PUSH @stLuid.LowPart
POP @stTkp.Privileges[0].Luid.LowPart
PUSH @stLuid.HighPart
POP @stTkp.Privileges[0].Luid.HighPart
;***********************************************
MOV @stTkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges,@hToKen,FALSE, addr @stTkp,sizeof TOKEN_PRIVILEGES,NULL,NULL
;.if !eax
; invoke MessageBox,NULL,CTXT("提升访问令牌权限失败!"),CTXT("出错"),0
; ret
;.endif
invoke CloseHandle,@hToKen
;invoke MessageBox,NULL,CTXT("权限已提升"),CTXT("OK"),0
ret
_SeDebugPrivilege endp
;********************************************************************
; 提升权限 end
;********************************************************************
;********************************************************************
;获取dll的全路径文件名、获取LoadLibrary函数地址
;********************************************************************
_DllPath proc
invoke GetCurrentDirectory,MAX_PATH,addr szDllFull ;程序当前目录
invoke lstrcat,addr szDllFull,addr szDll ;现在是全路径了
invoke GetModuleHandle,addr szKernel ;得到Kernel32.dll的模块句柄
invoke GetProcAddress,eax,offset szLoadLibrary ;从Kernel32.dll里得到LoadLibraryA的函数地址
mov lpLoadLibrary,eax
ret
_DllPath endp
;********************************************************************
; 获取dll的全路径文件名、获取LoadLibrary函数地址
;********************************************************************
;********************************************************************
;进程列举 Explorer.exe进程句柄打开及注入dll
;********************************************************************
_ProcessListInDll proc
mov stSanp.dwSize,sizeof stSanp ;使用结构之前,要先设置大小
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL ;得到当前的系统进程快照
mov hSanp,eax ;快照句柄传给hSanp Process32First
invoke Process32First,hSanp,addr stSanp ;首次从快照得到一个进程信息
.while eax
invoke CharUpper,addr stSanp.szExeFile ;把程序名转为大写
invoke lstrcmp,addr szExplorer,addr stSanp.szExeFile ;lstrcmp 两字符串比较。区分大小写,相等则返回0
.if !eax ;相等
invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,stSanp.th32ProcessID
.if eax
mov hProcess,eax ;找到一个Explorer.exe进程句柄就退出枚举
;*******************************************************
invoke VirtualAllocEx,hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_READWRITE ;从explorer.exe进程的线性地址中申请内存 若申请成功则返回指向申请到的内存的地址
.if eax
mov lpProcessMem,eax
invoke WriteProcessMemory,hProcess,lpProcessMem,offset szDllFull,MAX_PATH,NULL ;在explorer.exe申请到的地址里写入dll的文件路径
invoke CreateRemoteThread,hProcess,NULL,0,lpLoadLibrary,lpProcessMem,0,NULL
;在倒数第三个参数中表示的是dll的文件名,即创建的线程是,用LoadLibraryA函数加载DLL文件
invoke CloseHandle,eax
.endif
;*******************************************************
invoke CloseHandle,hProcess
invoke CloseHandle,hSanp
ret
.endif
.endif
invoke Process32Next,hSanp,addr stSanp ;用Process32Next循环从快照取得进程信息,直到取完进程,然后返回flase 从而退出
.endw
invoke CloseHandle,hSanp ;关闭快照句柄
ret
_ProcessListInDll endp
;********************************************************************
;进程列举 Explorer.exe进程句柄打开及注入dll
;********************************************************************
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
;invoke ExitWindowsEx,EWX_REBOOT,0
;.if !eax
; invoke MessageBox,NULL,CTXT("失败"),CTXT("OK"),0
;.endif
call _SeDebugPrivilege ;提升权限
call _DllPath ;取得dll文件名及LoadLibraryA函数地址
call _ProcessListInDll ;在远程进程注入DLL文件并创建线程
invoke ExitProcess,NULL
end start
;by onepc 153785587
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
;include gdi32.inc ;图形
includelib user32.lib
includelib kernel32.lib
;includelib gde32.lib
include advapi32.inc
includelib advapi32.lib ;提权
include psapi.inc
includelib psapi.lib;快照
include macro.asm ;ctxt("")
.data
szKernel db 'Kernel32.dll',0
szLoadLibrary db 'LoadLibraryA',0
szDll db '\ServerDll.dll',0
szExplorer db 'EXPLORER.EXE',0 ;explorer.exe在注入的进程
szPrivilegeName db 'SeDebugPrivilege',0 ;SeDebugPrivilege权限可以关闭服务进程
;通过设置正在运行的进程 SeDebugPrivilege 权限,
;您可以获取任何正在运行的应用程序进程句柄。
;获取进程句柄时, 可以指定 PROCESS_ALL_ACCESS
;标志将允许可以正常情况下不执行该进程句柄时的各种 Win 32 API 的调用
.data?
hInstance dd ? ;模块句柄
lpLoadLibrary dd ? ;LoadLibraryA的地址
lpProcessMem dd ? ;指向申请到的线性地址
szDllFull db MAX_PATH dup (?) ;dll文件名
hSanp dd ? ;快照句柄
stSanp PROCESSENTRY32 <?> ;快照的结构
hProcess dd ? ;explorer.exe的进程句柄
.const
.code
;********************************************************************
; 提升权限 start
;********************************************************************
_SeDebugPrivilege proc
local @stTkp:TOKEN_PRIVILEGES,@stLuid:LUID
local @hToKen;:DWORD
invoke GetCurrentProcess ;GetCurrentProcess得到得到的称之为"伪句柄"只是一个标识,你可以发现,其实就是返回$FFFFFFFF
;每个进程得句柄都是一样得,只是实用于进程内部得使用.
;如果你想得到实际得句柄,在进程间进行通讯,必需要进行转化,
;调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭.
;其实,你应该明白了为何"伪句柄"得存在,就是使用简单,不用关闭,
;不会造成内存泄漏.
mov ecx,eax ;直接用eax会出现register value overwritten by INVOKE
invoke OpenProcessToken,ecx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr @hToKen
;.if !eax ;返回0则表示出错
; invoke MessageBox,NULL,CTXT("获取访问令牌句柄失败!"),CTXT("出错"),0
; ret
;.endif
;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid
invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stLuid
;.if !eax
; invoke MessageBox,NULL,CTXT("获取当前进程权限失败!"),CTXT("出错"),0
; ret
;.endif
;这些函数用在NT以上的系统,也可以在之前判断本系统是否是NT以上的系统。
;第一个参数表示所要查看的系统,本地系统直接用NULL
;第二个参数表示所要查看的特权信息的名称,定义在winnt.h中
;第三个参数用来接收所返回的制定特权名称的信息。
mov @stTkp.PrivilegeCount,1
;***********************************************
;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid
;用这个,下面这个push可以不要。因为直接已把特权信息放到@stTkp.Privileges[0].Luid中。
PUSH @stLuid.LowPart
POP @stTkp.Privileges[0].Luid.LowPart
PUSH @stLuid.HighPart
POP @stTkp.Privileges[0].Luid.HighPart
;***********************************************
MOV @stTkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges,@hToKen,FALSE, addr @stTkp,sizeof TOKEN_PRIVILEGES,NULL,NULL
;.if !eax
; invoke MessageBox,NULL,CTXT("提升访问令牌权限失败!"),CTXT("出错"),0
; ret
;.endif
invoke CloseHandle,@hToKen
;invoke MessageBox,NULL,CTXT("权限已提升"),CTXT("OK"),0
ret
_SeDebugPrivilege endp
;********************************************************************
; 提升权限 end
;********************************************************************
;********************************************************************
;获取dll的全路径文件名、获取LoadLibrary函数地址
;********************************************************************
_DllPath proc
invoke GetCurrentDirectory,MAX_PATH,addr szDllFull ;程序当前目录
invoke lstrcat,addr szDllFull,addr szDll ;现在是全路径了
invoke GetModuleHandle,addr szKernel ;得到Kernel32.dll的模块句柄
invoke GetProcAddress,eax,offset szLoadLibrary ;从Kernel32.dll里得到LoadLibraryA的函数地址
mov lpLoadLibrary,eax
ret
_DllPath endp
;********************************************************************
; 获取dll的全路径文件名、获取LoadLibrary函数地址
;********************************************************************
;********************************************************************
;进程列举 Explorer.exe进程句柄打开及注入dll
;********************************************************************
_ProcessListInDll proc
mov stSanp.dwSize,sizeof stSanp ;使用结构之前,要先设置大小
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL ;得到当前的系统进程快照
mov hSanp,eax ;快照句柄传给hSanp Process32First
invoke Process32First,hSanp,addr stSanp ;首次从快照得到一个进程信息
.while eax
invoke CharUpper,addr stSanp.szExeFile ;把程序名转为大写
invoke lstrcmp,addr szExplorer,addr stSanp.szExeFile ;lstrcmp 两字符串比较。区分大小写,相等则返回0
.if !eax ;相等
invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,stSanp.th32ProcessID
.if eax
mov hProcess,eax ;找到一个Explorer.exe进程句柄就退出枚举
;*******************************************************
invoke VirtualAllocEx,hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_READWRITE ;从explorer.exe进程的线性地址中申请内存 若申请成功则返回指向申请到的内存的地址
.if eax
mov lpProcessMem,eax
invoke WriteProcessMemory,hProcess,lpProcessMem,offset szDllFull,MAX_PATH,NULL ;在explorer.exe申请到的地址里写入dll的文件路径
invoke CreateRemoteThread,hProcess,NULL,0,lpLoadLibrary,lpProcessMem,0,NULL
;在倒数第三个参数中表示的是dll的文件名,即创建的线程是,用LoadLibraryA函数加载DLL文件
invoke CloseHandle,eax
.endif
;*******************************************************
invoke CloseHandle,hProcess
invoke CloseHandle,hSanp
ret
.endif
.endif
invoke Process32Next,hSanp,addr stSanp ;用Process32Next循环从快照取得进程信息,直到取完进程,然后返回flase 从而退出
.endw
invoke CloseHandle,hSanp ;关闭快照句柄
ret
_ProcessListInDll endp
;********************************************************************
;进程列举 Explorer.exe进程句柄打开及注入dll
;********************************************************************
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
;invoke ExitWindowsEx,EWX_REBOOT,0
;.if !eax
; invoke MessageBox,NULL,CTXT("失败"),CTXT("OK"),0
;.endif
call _SeDebugPrivilege ;提升权限
call _DllPath ;取得dll文件名及LoadLibraryA函数地址
call _ProcessListInDll ;在远程进程注入DLL文件并创建线程
invoke ExitProcess,NULL
end start
资源.rc
#include "resource.h"
#define IDD_TEST_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
#define IDC_EDIT1 1002
IDR_MAINFRAME ICON DISCARDABLE "test.ico"
IDD_TEST_DIALOG DIALOGEX 0, 0, 259, 185
STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE |
WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "32ASM - 注入Test"
FONT 9, "宋体"
BEGIN
PUSHBUTTON "OK",IDC_BUTTON1,65,148,50,14
PUSHBUTTON "EXIT",IDC_BUTTON2,132,148,50,14
EDITTEXT IDC_EDIT1,49,43,193,14,ES_AUTOHSCROLL
LTEXT "主页:",IDC_STATIC,27,47,25,8
END
[/code]