找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9954|回复: 7

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

 火.. [复制链接]

7

主题

36

回帖

2

精华

初来乍到

积分
3171
发表于 2011-4-27 11:50:02 | 显示全部楼层 |阅读模式
本帖最后由 lxl1638 于 2011-4-27 12:08 编辑

请先看代码:

  1. // Hook ExitWindows to execute a command
  2. VOID HookProcess(HANDLE hProcess)
  3. {
  4.         __asm
  5.         {
  6.                 PUSH    NULL;
  7.                 MOV     EAX, OFFSET _End;
  8.                 SUB     EAX, OFFSET _Code;
  9.                 PUSH    EAX;
  10.                 PUSH    OFFSET _Code;
  11.                 PUSH    ExitWindowsEx;
  12.                 PUSH    hProcess;
  13.                 CALL    DWORD PTR [WriteProcessMemory];

  14.                 // Write True WinExec address to target
  15.                 PUSH    NULL;
  16.                 PUSH    4;
  17.                 LEA     EAX, WinExec;
  18.                 PUSH    EAX;
  19.                 MOV     EAX, OFFSET _WinExec;
  20.                 SUB     EAX, OFFSET _Code;
  21.                 ADD     EAX, ExitWindowsEx;
  22.                 PUSH    EAX;
  23.                 PUSH    hProcess;
  24.                 CALL    DWORD PTR [WriteProcessMemory];

  25.                 // Return
  26.                 JMP                _End;

  27.                 // Target code (Call WinExec to execute a command), address independent
  28.                 //BOOL WINAPI ExitWindowsEx(UINT uFlags, DWORD dwReason)
  29.                 //UINT WINAPI WinExec(PCSTR pszCmdLine, UINT uCmdShow)
  30. _Code:
  31.                 MOV     EAX, [ESP + 4];        // Get uFlags
  32.                 PUSH    EAX;                        // Push  uCmdShow
  33.                 CALL    _GetWinExec;        // Push _WinExec
  34. _WinExec:
  35.                 _EMIT   0;
  36.                 _EMIT   0;
  37.                 _EMIT   0;
  38.                 _EMIT   0;
  39. _GetWinExec:
  40.                 POP     EAX;                        // Get _WinExec
  41.                 CALL    _Call;                        // Push pszCmdLine
  42.                 _EMIT   'P';
  43.                 _EMIT   'E';
  44.                 _EMIT   'C';
  45.                 _EMIT   'M';
  46.                 _EMIT   'D';
  47.                 _EMIT   '.';
  48.                 _EMIT   'E';
  49.                 _EMIT   'X';
  50.                 _EMIT   'E';
  51.                 _EMIT   ' ';
  52.                 _EMIT   'S';
  53.                 _EMIT   'H';
  54.                 _EMIT   'U';
  55.                 _EMIT   'T';
  56.                 _EMIT   0;
  57. _Call:
  58.                 CALL    [EAX];                        // Call WinExec
  59.                 RET     8;
  60. _End:
  61.         }
  62. }
复制代码
因微软的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);


275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-4-27 15:15:31 | 显示全部楼层
看看TA有没有玩过这个.

帮顶顶.
我就是嗷嗷叫的老马了......

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-4-28 10:43:48 | 显示全部楼层
关机重启直接使用NtShutdownSystem。

7

主题

36

回帖

2

精华

初来乍到

积分
3171
 楼主| 发表于 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)。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-4-28 16:48:00 | 显示全部楼层
回复 lxl1638 的帖子

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

7

主题

36

回帖

2

精华

初来乍到

积分
3171
 楼主| 发表于 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都很大。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-4-29 19:38:52 | 显示全部楼层
回复 lxl1638 的帖子

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

0

主题

68

回帖

0

精华

铜牌会员

积分
94
发表于 2015-1-10 21:33:54 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表