lxl1638 发表于 2011-4-27 11:50:02

有空的老手请改一个汇编函数,先谢了。

本帖最后由 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);


马大哈 发表于 2011-4-27 15:15:31

看看TA有没有玩过这个.

帮顶顶.:lol

Tesla.Angela 发表于 2011-4-28 10:43:48

关机重启直接使用NtShutdownSystem。

lxl1638 发表于 2011-4-28 13:01:02

本帖最后由 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)。

Tesla.Angela 发表于 2011-4-28 16:48:00

回复 lxl1638 的帖子

WIN64的汇编跟WIN32汇编有很大不同的,不只是调用函数不同,HOOK的不同就更大了。
看看我的这个主题吧:http://www.m5home.com/bbs/thread-5009-1-1.html

lxl1638 发表于 2011-4-29 12:06:43

本帖最后由 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都很大。

Tesla.Angela 发表于 2011-4-29 19:38:52

回复 lxl1638 的帖子

还不是明白你的意思。。。
这么说吧,在x86的默认stdcall下,函数的第一个参数放在esp+4的位置,在x64的默认fastcall下,函数的第一个参数放在rcx里。
HANDLE是void*的马甲,正好是4字节或者8字节的。

sku__ 发表于 2015-1-10 21:33:54

谢谢分享
页: [1]
查看完整版本: 有空的老手请改一个汇编函数,先谢了。