注入远程进程,再HOOK键盘。超细注释!
程序代码:
看到了注入这里。做个练习。 [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
资源.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]