紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 2747|回复: 6

R0如何调用 NtUserSendInput

[复制链接]

5

主题

50

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
105
发表于 2021-4-26 15:55:37 | 显示全部楼层 |阅读模式
百度了下,没啥例子,自己试了下 没效果


typedef
NTSTATUS
(NTAPI*  NTUSERSENDINPUT)(
        _In_ ULONG cInputs,                     // number of input in the array
        _In_reads_(cInputs) LPINPUT pInputs,  // array of inputs
        _In_ int cbSize);                      // sizeof(INPUT)


        NTUSERSENDINPUT         NtUserSendInput = NULL;
        INPUT               input = { 0 };
        MOUSEINPUT          KeyBoardInput = { 0 };
        input.type = 0;
        input.mi.dx = 100;
        input.mi.dy = 200;
        input.mi.mouseData = 0;
        input.mi.dwFlags = 1;   //MOUSEEVENTF_ABSOLUTE 代表决对位置  MOUSEEVENTF_MOVE代表移动事件
        input.mi.time = 0;
        input.mi.dwExtraInfo = 0;



        NtUserSendInput = 0xFFFFF960000EFB74; //用ARK取到 地址
        NtUserSendInput(1, &input, sizeof(INPUT));

854

主题

3481

帖子

2

精华

管理员

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

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2021-4-26 16:33:19 | 显示全部楼层
你先Attach到跟目标进程相同SESSTION的GUI程序(比如explorer.exe),然后再调用试试。

此外,关于怎么调用NtUser系列函数,建议参考USER32.DLL的源码(在泄露的NT4/XP源码和ReactOS源码里都有)。

5

主题

50

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
105
 楼主| 发表于 2021-4-27 09:49:26 | 显示全部楼层
Tesla.Angela 发表于 2021-4-26 16:33
你先Attach到跟目标进程相同SESSTION的GUI程序(比如explorer.exe),然后再调用试试。

此外,关于怎么调 ...

附加了,还是没效果,应该是调用NTUSER函数不对,或者声明不对吧
typedef
NTSTATUS
(NTAPI* NTUSERSENDINPUT)(
        _In_ ULONG cInputs,                     // number of input in the array
        _In_reads_(cInputs) LPINPUT pInputs,  // array of inputs
        _In_ int cbSize);                      // sizeof(INPUT)



//驱动入口
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,        IN PUNICODE_STRING RegistryPath)
{
        NTSTATUS Status;
        NTUSERSENDINPUT         NtUserSendInput = NULL;
        INPUT               input = { 0 };
        MOUSEINPUT          KeyBoardInput = { 0 };
        input.type = 0;
        input.mi.dx = 100;
        input.mi.dy = 200;
        input.mi.mouseData = 0;
        input.mi.dwFlags = 1;   //MOUSEEVENTF_ABSOLUTE 代表决对位置  MOUSEEVENTF_MOVE代表移动事件
        input.mi.time = 0;
        input.mi.dwExtraInfo = 0;

        PEPROCESS pEProcess = NULL;
        KAPC_STATE ApcState = { 0 };

        Status = PsLookupProcessByProcessId(1448, &pEProcess);//gui进程
        KeStackAttachProcess(pEProcess, &ApcState);

        NtUserSendInput = (NTUSERSENDINPUT)0xFFFFF960000EFB74; //用ARK取到 地址
        Status = NtUserSendInput(1, &input, sizeof(INPUT));
        DbgPrint("STATUS:%X\n",Status);


        //取到数据解除附加进程
        KeUnstackDetachProcess(&ApcState);
        ObDereferenceObject(pEProcess);

854

主题

3481

帖子

2

精华

管理员

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

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2021-4-27 16:55:15 | 显示全部楼层
blackbox 发表于 2021-4-27 09:49
附加了,还是没效果,应该是调用NTUSER函数不对,或者声明不对吧
typedef
NTSTATUS


在注册表CALLBACK里试试,这样子连attach操作都省去了,比如发现调用者是explorer.exe时执行操作。

如果还是不行,那估计就是你代码的问题了。

5

主题

50

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
105
 楼主| 发表于 2021-5-3 18:04:57 | 显示全部楼层
Tesla.Angela 发表于 2021-4-27 16:55
在注册表CALLBACK里试试,这样子连attach操作都省去了,比如发现调用者是explorer.exe时执行操作。

如果 ...

我测试了下,我这代码在IRP里和注册表回调里可以正常调用,但是放在驱动入口就会蓝,一开始以为是PreviousMode的问题,测试了IRP和注册表里的PreviousMode是UserMode,驱动入口是kernelmodel,手动改了后发现一点关系都没,现在就是注册表回调和IRP能正常调用,驱动头不可以

854

主题

3481

帖子

2

精华

管理员

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

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2021-5-4 17:43:00 | 显示全部楼层
blackbox 发表于 2021-5-3 18:04
我测试了下,我这代码在IRP里和注册表回调里可以正常调用,但是放在驱动入口就会蓝,一开始以为是Previou ...

因为驱动入口是内核态线程执行的,不是用户态线程执行的。

5

主题

50

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
105
 楼主| 发表于 2021-5-6 12:52:04 | 显示全部楼层
Tesla.Angela 发表于 2021-5-4 17:43
因为驱动入口是内核态线程执行的,不是用户态线程执行的。

我手动改了PreviousMode,改成了UserMode,也不行
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-18 11:45 , Processed in 0.025261 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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