|
本帖最后由 lxl1638 于 2011-4-27 12:08 编辑
请先看代码:
- // Hook ExitWindows to execute a command
- VOID HookProcess(HANDLE hProcess)
- {
- __asm
- {
- PUSH NULL;
- MOV EAX, OFFSET _End;
- SUB EAX, OFFSET _Code;
- PUSH EAX;
- PUSH OFFSET _Code;
- PUSH ExitWindowsEx;
- PUSH hProcess;
- CALL DWORD PTR [WriteProcessMemory];
- // Write True WinExec address to target
- PUSH NULL;
- PUSH 4;
- LEA EAX, WinExec;
- PUSH EAX;
- MOV EAX, OFFSET _WinExec;
- SUB EAX, OFFSET _Code;
- ADD EAX, ExitWindowsEx;
- PUSH EAX;
- PUSH hProcess;
- CALL DWORD PTR [WriteProcessMemory];
- // Return
- JMP _End;
- // Target code (Call WinExec to execute a command), address independent
- //BOOL WINAPI ExitWindowsEx(UINT uFlags, DWORD dwReason)
- //UINT WINAPI WinExec(PCSTR pszCmdLine, UINT uCmdShow)
- _Code:
- MOV EAX, [ESP + 4]; // Get uFlags
- PUSH EAX; // Push uCmdShow
- CALL _GetWinExec; // Push _WinExec
- _WinExec:
- _EMIT 0;
- _EMIT 0;
- _EMIT 0;
- _EMIT 0;
- _GetWinExec:
- POP EAX; // Get _WinExec
- CALL _Call; // Push pszCmdLine
- _EMIT 'P';
- _EMIT 'E';
- _EMIT 'C';
- _EMIT 'M';
- _EMIT 'D';
- _EMIT '.';
- _EMIT 'E';
- _EMIT 'X';
- _EMIT 'E';
- _EMIT ' ';
- _EMIT 'S';
- _EMIT 'H';
- _EMIT 'U';
- _EMIT 'T';
- _EMIT 0;
- _Call:
- CALL [EAX]; // Call WinExec
- RET 8;
- _End:
- }
- }
复制代码 因微软的WinPE系统无法通过资源管理器[开始菜单]来关机、重启,
所以要接管Explorer.EXE进程的ExitWindows,通过自己的代码实现关机重启。
这是钳入到VC2005中接管(Hook)WinPE资源管理器关机/重启函数(ExitWindows)的汇编代码,
它的功能是接管Explorer.EXE进程的ExitWindows,让它通过WinExec执行另一个命令(PECMD.EXE SHUT),
关机或重启功能通过WinExec的第二个参数(UINT uCmdShow)决定,PECMD.EXE分析进程的主入口函数
(wWinMain)的最后一个参数(即STARTUPINFO结构中的wShowWindow)来执行关机或重启。
本人想在WinPE关机/重启时执行某些功能,想改一下这些代码,
但本人只略懂VC和Delphi,年令和时间都不充许再啃汇编,故求助论坛的各位朋友。
要求将这个函数改成如下功能:
接管ExitWindows函数,让其通过SendMessage向指定的窗口发送消息,
所以这个HookProcess函数有4个入口参数
VOID HookProcess(
HANDLE hProcess //Explorer.EXE进程PROCESS_INFORMATION结构的hProcess
HWND hWnd //目标窗口句柄
UINT Msg //自定义的信息
DWORD uCode /*验证码*/
)
接管ExitWindows函数后,通过SendMessage发送消息要求是:
将ExitWindows函数的第一个参数(UINT uFlags)当SendMessage的第三个参数(WPARAM)发送,
VC格式为 SendMessage(hWnd, Msg, (WPARAM)uFlags, (LPARAM)uCode);
|
|