首页
社区
课程
招聘
[求助]使用NtUserSendInput模拟输入
发表于: 2010-6-4 19:41 17463

[求助]使用NtUserSendInput模拟输入

2010-6-4 19:41
17463
最近学习使用 NtUserSendInput 来模拟输入,但是总是不能成功,具体如下

NTSTATUS InputSimulating()
{
	PEPROCESS			pTagetEPROCESS = NULL;
	
	PsLookupProcessByProcessId((HANDLE)ulProcessID,&pTagetEPROCESS);
	KeAttachProcess((PKPROCESS)pTagetEPROCESS);
	MySendInput();
	KeDetachProcess();
    return	STATUS_SUCCESS;
}

NTSTATUS MySendInput()
{
	PSYSTEM_SERVICE_TABLE	pSSDTShadow = (PSYSTEM_SERVICE_TABLE)((PUCHAR)KeServiceDescriptorTable - 0x30);
	NTUSERSENDINPUT			NtUserSendInput = NULL;
	INPUT				input = {0};
	KEYBDINPUT			KeyBoardInput = {0};

	NtUserSendInput = (NTUSERSENDINPUT)(pSSDTShadow->ServiceTableBase[502]);
	DbgPrint("NtUserSendInput:%x\n",NtUserSendInput);

	KeyBoardInput.wScan = 0x1e;
	KeyBoardInput.dwFlags = KEYEVENTF_SCANCODE;
	input.type = INPUT_KEYBOARD;
	input.ki = KeyBoardInput;
	
	NtUserSendInput(1,&input,sizeof(INPUT));
	
	KeyBoardInput.wScan = 0x9e;
	KeyBoardInput.dwFlags = KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP;
	input.type = INPUT_KEYBOARD;
	input.ki = KeyBoardInput;
	
	NtUserSendInput(1,&input,sizeof(INPUT));
	
	return	STATUS_SUCCESS;
}


但是这样总是不能得到模拟的输入

希望了解关于这个知识点的人能给予解答,谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 207
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这里是来自九年后的回复,在win10 1607上测试通过,先去win32kfull.sys中找到NtUserSendInput然后再调用,注意要先挂靠到GUI进程中才能调用
#define LOCKEDCODE code_seg() 
#pragma LOCKEDCODE 
PVOID GetWin32kFullRoutineAddress(PUNICODE_STRING SystemRoutineName,PDRIVER_OBJECT pDriverObject)
{ 
ANSI_STRING AnsiRoutineName; 
PLIST_ENTRY NextEntry, PsLoadedModuleList; 
ERESOURCE PsLoadedModuleResource; 
PLDR_DATA_TABLE_ENTRY TableEntry,Enumerator; 
NTSTATUS Status; 
PVOID FunctionAddress=0; 
UINT32 nCount = 0; 
KIRQL oldIrql; //PEXCEPTION_POINTERS exceptionCode;
 if (SystemRoutineName == NULL) return NULL; 
TableEntry = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;
 Status = RtlUnicodeStringToAnsiString(&AnsiRoutineName, SystemRoutineName, TRUE);
 if (!NT_SUCCESS(Status)) return NULL; 
 UNICODE_STRING Win32kfull = RTL_CONSTANT_STRING(L"win32kfull.sys");
 PsLoadedModuleList = &TableEntry->InLoadOrderLinks; 
NextEntry = PsLoadedModuleList->Flink; 
__try
 { 
    while (NextEntry != PsLoadedModuleList) 
    {
   nCount++; //DbgPrint("finding in %u times\n", nCount); 
   Enumerator = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
   if (RtlEqualUnicodeString(&Win32kfull, &Enumerator->BaseDllName, FALSE)) 
    { 
      KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);//必须有,win32kfull.sys必须在这个中断级
      FunctionAddress = RtlFindExportedRoutineByName(Enumerator->DllBase, AnsiRoutineName.Buffer); 
      KeLowerIrql(oldIrql); 
     }
    if (FunctionAddress != NULL) break;
    NextEntry = NextEntry->Flink; 
    }//end while
 } 
__except(EXCEPTION_EXECUTE_HANDLER) 
 { 
 DbgPrint("Exception Occured\n");
 FunctionAddress = NULL;
 } 
 RtlFreeAnsiString(&AnsiRoutineName);
 return FunctionAddress;
 }



 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) 
{ 
   UNICODE_STRING FunctionName = RTL_CONSTANT_STRING(L"NtUserSendInput");
   NtUserSendInput=GetWin32kFullRoutineAddress(&FunctionName,pDriverObject);
 //然后就可以调用NtUserSendInput////了,参数和你的一样,要在ring0层调用,而且要先挂靠到GUI进程中
 __try
       { 
          NtUserSendInput(1,&input,sizeof(INPUT));
       }
     __except(EXCEPTION_EXECUTE_HANDLER) 
      { 
      DbgPrint("Exception Occured\n"); 
      }
 return status; 
}

最后于 2019-6-15 18:37 被脚本灬丨小子编辑 ,原因:
2019-6-15 18:36
0
雪    币: 1856
活跃值: (4100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哈哈
2019-6-15 21:32
0
雪    币: 12414
活跃值: (5934)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
脚本灬丨小子 这里是来自九年后的回复,在win10 1607上测试通过,先去win32kfull.sys中找到NtUserSendInput然后再调用,注意要先挂靠到GUI进程中才能调用#define&nb ...
其实只要sessionid不是0就必定能调用,用PsGetCurrentProcessSessionId判断下就够了
最后于 2019-6-26 11:55 被hhkqqs编辑 ,原因:
2019-6-26 11:43
0
雪    币: 207
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
hhkqqs 脚本灬丨小子 这里是来自九年后的回复,在win10 1607上测试通过,先去win32kfull.sys中找到NtUserSendInput然后再调用,注意要 ...
判断是否有会话吗?我去试试,先感谢hhkqqs了
最后于 2019-9-1 21:24 被脚本灬丨小子编辑 ,原因:
2019-9-1 21:17
0
雪    币: 4759
活跃值: (4402)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这么有趣吗?回复竟隔了9年,哈哈哈,牛逼。我也来留个脚印,这里是10年后的回复。
2020-3-24 23:47
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
这真是10年后的回复呀
2020-4-4 20:14
0
雪    币: 211
活跃值: (193)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
脚本灬丨小子 hhkqqs 脚本灬丨小子 这里是来自九年后的回复,在win10 1607上测试通过,先去win32kfull.sy ...
你好,我尝试了一下.
获取到地址之后挂靠GUI线程调用,
调用不成功,双机看了下判断了结构指针+结构数量*0x28>000007ffffff0000 清零返回 在GUI进程Alloc了一片内存当作结构 结果还是调用失败.请问我是漏掉了什么吗
2020-4-29 06:35
0
雪    币: 62
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
先要获取光标所在位置,然后再。。。
2020-7-14 21:15
0
雪    币: 0
活跃值: (376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我也没有效果,已经挂靠GUI进程
2021-4-26 21:42
0
雪    币: 14
活跃值: (948)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我也没效果,就返回0
2021-9-21 23:02
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
妮可 我也没效果,就返回0
解决了吗哥,我现在的情况也跟你情况一样
2023-12-14 16:37
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
哎哟哥哥^ 我也没有效果,已经挂靠GUI进程
解决了吗哥,我现在的情况也跟你情况一样
2023-12-14 16:37
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
ReCreateLife 你好,我尝试了一下. 获取到地址之后挂靠GUI线程调用, 调用不成功,双机看了下判断了结构指针+结构数量*0x28>000007ffffff0000 清零返回 在GUI进程Alloc了一片内 ...
解决了吗哥,我现在的情况也跟你情况一样
2023-12-14 16:38
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
脚本灬丨小子 hhkqqs 脚本灬丨小子 这里是来自九年后的回复,在win10 1607上测试通过,先去win32kfull.sy ...
解决了吗哥,我现在的情况也跟你情况一样
2023-12-14 16:38
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
木志本柯 这么有趣吗?回复竟隔了9年,哈哈哈,牛逼。我也来留个脚印,这里是10年后的回复。
解决了吗哥,我现在的情况也跟你情况一样
2023-12-14 16:38
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
hhkqqs 脚本灬丨小子 这里是来自九年后的回复,在win10 1607上测试通过,先去win32kfull.sys中找到NtUserSendInput然后再调用,注意要 ...
解决了吗哥,我现在的情况也跟你情况一样
2023-12-14 16:38
0
游客
登录 | 注册 方可回帖
返回
//