有空的老手请改一个汇编函数,先谢了。
本帖最后由 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 ;
// 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 ;
// 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, ; // Get uFlags
PUSH EAX; // PushuCmdShow
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 ; // 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);
看看TA有没有玩过这个.
帮顶顶.:lol 关机重启直接使用NtShutdownSystem。 本帖最后由 lxl1638 于 2011-4-28 13:11 编辑
回复 Tesla.Angela 的帖子
关机重启用NtShutdownSystem,这个本人知道。
可能版主没有理解本人的意思,微软原版的Windows预安装环境(简称WinPE系统)启动后只是一个CMD.EXE窗口,
国内外众多WinPE FANS加上微软的资源管理器作外壳使之成为一个与正常Windows系统一样的操作界面,但这样
加入的资源管理器点[开始菜单]处的关机/重启没有反应,所以须接管资源管理器(explorer.exe)进程ExitWindowEx
函数,用自己的代码通过NtShutdownSystem来关机重启。
早期(2004~2005)国内的WinPE系统是用bartpe plug加上资源管理器,成套bartpe plug有很多文件,整成的WinPE
成品至少要加入3个文件:
XPELogon.EXE(登录程序,相当于正常系统的WinLogon.EXE)
XPEInit.EXE(系统初始化程式,相当于正常系统的UserInit.EXE)
还有一个DLL,就是接管资源管理器(explorer.exe)进程ExitWindowEx函数以实现正确关机重启的。
2005年前后,本人也开始整弄WinPE系统,在一些朋友的帮助下,根据WinPE系统登录、初始化系统原理
将上述三个文件的功能合并到一个文件中,就是PECMD.EXE,将之称为"WinPE登录命令解释程序",现在国内
几乎所有的(不敢说100%,也有98%以上)WinPE系统都是使用PECMD.EXE作登录命令,国外也有不少WinPE
系统也使用PECMD.EXE作登录命令,如果网上用Google或baidu搜索一个PECMD,相信不在40页以下。
但上面那个ASM代码不是本人写的,到此版主应明白为什么本人求助论坛的朋友改这代码了吧。
如果版主有空,可否将一楼的ASM代码做成一个X64位系统的静态库(LIB),这个LIB只有两点要求:
1、不需额外的DLL,可将代码链接入EXE
2、链接到EXE的体积尽可能小,这个东东不必讲究速度和效率,只要求EXE体积要小。
另外,顺便说一下,本人已放出的64位PECMD.EXE的测试版,接管资源管理器ExitWindowEx函数
使用了两种方案供测试,其一是DLL注入(需额外带一个6K的DLL),其二是EXE代码注入(无需DLL)。 回复 lxl1638 的帖子
WIN64的汇编跟WIN32汇编有很大不同的,不只是调用函数不同,HOOK的不同就更大了。
看看我的这个主题吧:http://www.m5home.com/bbs/thread-5009-1-1.html 本帖最后由 lxl1638 于 2011-4-29 12:09 编辑
回复 Tesla.Angela 的帖子
这个nthookengine本人早在其它地方已看过,也用过。
如果不考虑反Hook和多重Hook的话,只需一个WriteJump函数就可以完成X64系统的Hook,也无需那个Distorm_x**.LIB。
本人已用DLL注入和EXE代码注入两种方案Hook住了X64位WinPE系统资源管理器的ExitWindowEx函数,
做成的DLL也很小,X64位的只有5K左右,X86系统的不到4K,你这些示例的DLL都很大。 回复 lxl1638 的帖子
还不是明白你的意思。。。
这么说吧,在x86的默认stdcall下,函数的第一个参数放在esp+4的位置,在x64的默认fastcall下,函数的第一个参数放在rcx里。
HANDLE是void*的马甲,正好是4字节或者8字节的。 谢谢分享
页:
[1]