首页
论坛
专栏
课程

[求助] 帮忙分析下老V这源码

老坛酸菜TM 2018-9-14 15:12 755
inline T gen_syscall(DWORD syscallid, LPCSTR szCallName)
		{
			auto p = NtCall::get<T>(std::string(szCallName));
			if (p)
			{
				return p;
			}
			auto KiServiceEntry = (ULONG64)ddk::util::get_KiServiceEntry();  这个get_KiServiceEntry()究竟是获取什么?
			if (!KiServiceEntry)
			{
				return reinterpret_cast<T>(nullptr);
			}
			LOG_DEBUG("Entry = %p\r\n", (PVOID)KiServiceEntry);
			//這裏Build
			unsigned char syscall_shellcode[] =
			{
				0x48, 0x8B, 0xC4, 0xFA, 0x48, 0x83, 0xEC, 0x10, 0x50, 0x9C,
				0x6A, 0x10, 0x48, 0x8D, 0x05, 0x0C, 0x00, 0x00, 0x00, 0x50,
				0xB8, 0x78, 0x56, 0x34, 0x12, 0xFF, 0x25, 0x01, 0x00, 0x00,
				0x00, 0xC3, 0x66, 0x66, 0x77, 0x77, 0x88, 0x88, 0x99, 0x99
			};
			size_t offset_syscallnumber = 0x15;
			size_t offset_kiserviceAddr = 0x20;
			auto pshellcode = reinterpret_cast<PUCHAR>(ExAllocatePoolWithTag(NonPagedPool, sizeof(syscall_shellcode), 'scsc'));
			if (!pshellcode)
			{
				return reinterpret_cast<T>(nullptr);
			}
			RtlCopyMemory(pshellcode, syscall_shellcode, sizeof(syscall_shellcode));
			auto psyscallid = (PDWORD)(&pshellcode[offset_syscallnumber]);
			auto pKiServiceAddr = (PULONG64)(&pshellcode[offset_kiserviceAddr]);
			*psyscallid = syscallid;
			*pKiServiceAddr = KiServiceEntry;
			_funcs.insert(std::make_pair(std::string(szCallName), (PVOID)pshellcode));
			_syscalltable.push_back(pshellcode);
			LOG_DEBUG("syscall = %p\r\n", pshellcode);
			return reinterpret_cast<T>(pshellcode);
		}


template<typename T, typename... Args>
		inline auto CallNtUser(const std::string& name, Args&&... args) -> typename std::result_of<T(Args...)>::type
		{
			bool win32 = false;
			KAPC_STATE apcstate = {};
			auto syscallid = mmTable[name];
			auto pfn = gen_syscall<T>(syscallid, name.c_str());  这里调用上面的gen_syscall函数
			LOG_DEBUG("call %p\r\n", pfn);
			if (!PsGetProcessWin32Process(PsGetCurrentProcess()))
			{
				LOG_DEBUG("Switch To Csrss\r\n");
				win32 = true;
				KeStackAttachProcess(Win32Process, &apcstate);
			}
			auto result = pfn ? pfn(std::forward<Args>(args)...) : (std::result_of<T(Args...)>::type)(0);
			if(win32)
				KeUnstackDetachProcess(&apcstate);
			return result;
		}


CallNtUser(NtUserGetForegroundWindow,....); 这里调用CallNtUser函数,原先不是这样写的,我只是为了方便阅读,放在这里的

以上是老V的代码,原谅我比较白,有些地方看不懂。
这个get_KiServiceEntry()究竟是获取什么?

以上源码仅部分源码,完整源码请移步老V项目地址 https://gitee.com/killvxk/codes/28twsg06mfocqvb7hau5y81



快讯:[看雪招聘]十八年来,看雪平台输出了大量安全人才,影响三代安全人才!

最后于 2018-9-14 15:13 被老坛酸菜TM编辑 ,原因:
最新回复 (5)
暖气上的糖果 2018-9-14 16:43
2
这是什么语言的
小艾 2018-9-14 16:52
3
KiServiceInternal
老坛酸菜TM 2018-9-14 18:53
4
小艾 KiServiceInternal
用了,没效果
dayang 2018-9-14 20:51
5
一会老V 自己就来讲了
万剑归宗 2018-9-15 08:41
6
大手子想搞内核绘制啊
返回