HOOK NtCreateThread 怎么获得 创建进程的命令行参数

HOOK NtCreateThread 怎么获得 创建进程的命令行参数,第1张

线程注入,说到底还是创建线程,只不过创建的线程在别的进程中运行而已,那么,我们需要下手的地方跟监控普通线程创建需要下手的地方应当是一样的——NtCreateThread(不过这不是一个太好的选择,因为NtCreateThread的定位稍显麻烦。这儿只是一个为了说明如何监控而做一个例子而已,所以尽可能选择简单的方法来挂钩,修改ssdt可以挂这个函数,所以就选择了它。^-^更好的选择见后文)。

我认为我有必要先列出NtCreateThread的原型:

NTSTATUS

NtCreateThread(

__out PHANDLE ThreadHandle,

__in ACCESS_MASK DesiredAccess,

__in_opt POBJECT_ATTRIBUTES ObjectAttributes,

__in HANDLE ProcessHandle,

__out PCLIENT_ID ClientId,

__in PCONTEXT ThreadContext,

__in PINITIAL_TEB InitialTeb,

__in BOOLEAN CreateSuspended

)

__out的那些就都不解释了,主要解释需要用到的。

access_mask是访问权限,不解释;ObjectAttr是对象属性,_opt的,不解释;ProcessHandle就是将要被创建线程的进程(新线程在这个进程中运行)的句柄了;剩下几个也跟本文无关,也不解释,需要了解详细信息可以查MSDN。

需要关注的参数我想我已经说的很明确了——ProcessHandle。我们可以使用ObReferenceObjectByHandle来获取这个Handle所指向的进程的EPROCESS的地址(PEPROCESS)。

剩下的就是判断这个线程是正常创建还是远程创建的问题了,这个判断将会变得很容易,因为我们可以用获得到PEPROCESS和IoGetCurrentProcess的结果相比较——NtCreateThread总是应当在创建者的进程上下文中被执行。

不过当我们编译运行之后就会发现,还有一个问题是我们不得不关注的——运行程序的时候父进程会“帮助”子进程创建子进程的主要线程(因为这个时候子进程还没有线程,所以不可能自己创建),所以这就引出了另外一个问题——如何判断这个远程线程创建是注入还是正常的程序运行呢?

简单分析下我们不难发现,二者的区别在于将被创建线程的进程是否还存在其他线程——因为我们的代码是在NtCreateThread之前执行的,所以如果是正常运行的程序的话,这个时候它不应当有任何的线程,而线程注入则不同,线程注入的话目标进程应当已经有了至少一个线程(一个主线程和若干个附属线程(或者没有附属线程))。

那么如何判断目标进程是否已经存在线程呢?在EPROCESS结构中:

+0x190 ThreadListHead : _LIST_ENTRY

我想这个ThreadListHead这是很容易理解的。。。。

实现方法(因为只是为了演示,所以所有的地址、偏移等都是硬编码):

ThreadListHead = 0x190;

//==========================================

BOOLEAN

ProcessNoThread( PEPROCESS Process)

{

PLIST_ENTRY Entry;

PLIST_ENTRY ThreadListEntry;

PLIST_ENTRY ListHead;

ThreadListEntry = (PLIST_ENTRY)((ULONG)Process + ThreadListHead);

Entry = ThreadListEntry->Flink;

return (Entry==ThreadListEntry);

}

//==========================================

NTSTATUS new_NtCreateThread(

OUT PHANDLE ThreadHandle,

IN ACCESS_MASK DesiredAccess,

IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,

IN HANDLE ProcessHandle,

OUT PCLIENT_ID ClientId,

IN PCONTEXT ThreadContext,

IN PVOID InitialTeb,

IN BOOLEAN CreateSuspended )

{

NTSTATUS st;

PVOID pepCurrentProcess=0;

st=ObReferenceObjectByHandle(ProcessHandle,(ACCESS_MASK)PROCESS_ALL_ACCESS,NULL,KernelMode,&pepCurrentProcess,NULL);

if (NT_SUCCESS(st))

{

if (IoGetCurrentProcess()!=pepCurrentProcess)

{

if (!ProcessNoThread((PEPROCESS)pepCurrentProcess)) DbgPrint("PROCESS 0x%X have created a thread into PROCESS 0x%X, NtCreateThread return value = 0x%x",IoGetCurrentProcess(),pepCurrentProcess,st);

}

ObDereferenceObject((PVOID)pepCurrentProcess);

}

st=old_NtCreateThread(ThreadHandle,DesiredAccess,ObjectAttributes,ProcessHandle,ClientId,ThreadContext,InitialTeb,CreateSuspended);

return st;

}

//==========================================

我想这段代码也不至于太难理解。。

是时候说说其他的一些问题了:

1、其实hook PspCreateThread要比hook NtCreateThread相对容易一些(两个函数同样都没有被导出,而PspCreateThread可以很容易的在PsCreateSystemThread中被定位,但NtCreateThread的定位就需要分析PE文件了(改SSDT另当别论,不过改SSDT的强度太差))。

2、遍历进程的线程是使用硬编码的,这使得通用性变得很差,而通过遍历PspCidTable枚举系统中的线程则成为一种不错的方法(从PspCreateThread中的代码来看,是由PspCreateThread在PspCidTable中ExCreateHandle的,但是我没有做测试)

就这样把,我自负的认为我的语言表达能力还算是不错的。

---EOF---

我现在用的是神舟飞天UT43的本子,用CLOVER安装MAC OS中发现会黑屏,必须取消INJECTINTEL才能正常显示,但是这样的话,进入系统驱动不正常,显存只有4M,经过爬帖发现是载入驱动的时候没有读到EDID,所以正在这方面尝试,不过看了好久也没搞清楚DSDT的结构,我参考的注入EDID的帖子原文如下:

“驱动HD4000需要一个恰当的ig-platform-id,对于本机器,3、8、9都可以很完美的使用,最佳的设置为3

我所知道的注入ig-platform-id的方式有三种:变色龙直接注入、变色龙efi-string注入和DSDT注入

我推荐使用DSDT注入,方法也很简单,在DSDT的显卡部分_DSM方法中添加如下代码

"AAPL,ig-platform-id",

Buffer (0x04)

{

0x03, 0x00, 0x66, 0x01

}

就可轻松注入为3的ig-platform-id,我的DSDT中就是这样注入的

注入后,显卡其实就已经驱动起来了,如果有HDMI显示器,可以在系统启动完成后连接并查看,一定是正常的

然而,当显卡驱动起来后,内屏就会瞎。这是因为这个廉价的内屏非常糟糕,导致HD4000读不到它的EDID(见备注2)

所以需要手动在Windows下通过EDID Manager软件获取EDID并通过DSDT注入

整理后,添加到到DSDT显卡部分的_DSM方法中,如下

"AAPL00,override-no-edid",

Buffer (0x80)

{

/ 0000 / 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,

/ 0008 / 0x36, 0x7F, 0x03, 0x90, 0x0E, 0x00, 0x00, 0x00,

/ 0010 / 0x00, 0x0C, 0x01, 0x03, 0x80, 0x1A, 0x0E, 0xFF,

/ 0018 / 0x2F, 0x00, 0x00, 0xA0, 0x57, 0x49, 0x9B, 0x26,

/ 0020 / 0x10, 0x48, 0x4F, 0x00, 0x00, 0x00, 0x01, 0x01,

/ 0028 / 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,

/ 0030 / 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x1C,

/ 0038 / 0x56, 0x88, 0x50, 0x00, 0x20, 0x30, 0x0E, 0x38,

/ 0040 / 0x13, 0x00, 0x00, 0x90, 0x10, 0x00, 0x00, 0x18,

/ 0048 / 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x3C, 0x00,

/ 0050 / 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

/ 0058 / 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

/ 0060 / 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

/ 0068 / 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

/ 0070 / 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

/ 0078 / 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,

}

Windows 上关机重启有很多相关的 *** 作 HOOK 一个点搞不定 具体需要以下 4 处来布控

SSDT HOOK NtInitiatePowerAction 函数 ,直接返回失败废掉这个函数

SSDT HOOK NtSetSystemPowerState 函数 也是直接返回失败

Shadow SSDT HOOK NtUserCallOneParam 函数 其第二个参数的值如果等于 0x34 (xp sp3 下面) 那么就是关键重启 *** 作 直接返回失败

最后一点 也就是网上一些所谓强制关机软件的实现原理 使用的是 NtShutdownSystem 函数 网上很多人说不能直接 HOOK 我就没去试了 看了下 直接 HOOK 废掉貌似是对大部分的强制关机软件有效的 。这里绕个弯 ,调用这个函数之前一般都要提权 要获取进程可以关闭系统的权限,好的 我让你获取失败不久行了

SSDT HOOK NtAdjustPrivilegesToken 函数 判断下要提升的权限是不是 SE_SHUTDOWN_PRIVILEGE 是的话 直接返回失败

好了 进过上述4步处理,现在你唯一关闭系统的办法就是长按机箱电源键了。。

jpg 改 rarwindows 上驱动阻止关机重启 *** 作_windows

uefi是黑苹果免驱吗人小白一枚,历时两个月,在大神的带领下,初步入门,完美驱动EI Capitan(10116)。在此分享一下在这两个月以来的学习成果。

(资料仅供参考)

机子配置如下图:

接下来,从几个部分来讲一下关于安装黑苹果的步骤及注意事项,不对之处,请指正。

一、安装前准备工作

1首先要了解自己的电脑是哪种启动方式,一般而言,有两种启动方式(从硬盘的分区表格式而言):从BIOS引导启动的MBR分区(老电脑大多是这种启动,部分支持UEFI启动)、由UEFI引导启动的GPT分区(新电脑一般为这种方式引导)。简单讲述一下二者的区别,UEFI+GPT相对BIOS+MBR的传统启动方式具有较为明显的优势:I可以更方便的引导系统,独立设置一个分区进行引导,在实现一对多引导的情况下,相对 BIOS +MBR 的引导,实现了更为便捷的可视化交互。同时将系统和引导区别开来,以往的传统引导,二者是在同一个分区内的(例如windows均在系统盘)。ii可以更方便的对引导进行自由设置。

2查看BIOS是否支持UEFI引导只需要进入BIOS 查看启动项设置即可。如果支持UEFI+GPT 引导,最好利用一下这个资源,方便日后的驱动以及修改config和dsdt。

3制作Clover引导以及黑苹果安装盘(推荐使用Clover引导,优点多多,其实本人第一次并没有使用Clover,使用的变色龙,但是可能和机子有关,不太适合变色龙,改用clover)。用到几个相关软件:Leopard硬盘写入助手(制作黑苹果安装盘)、BootDiskUtility(制作Clover启动),这两个软件均可下载到,另外黑苹果系统下载可以去黑苹果社区下载,当前稳定版本推荐 Yosemite(10105) 和 EI Capitan(10116)。

4硬盘分区问题。这里主要讲 UEFI+GPT 引导的分区,首先进入PE打开Diskgenius(或者其他分区助手),将硬盘分区表格式转换为GPT格式,将柱头新建一个大于200M的ESP分区(即EFI引导分区),然后再新建一个Mac分区(相当于win下的C盘),注意新建此分区要将其格式改为FAT格式,并且不要进行格式化。在Diskgenius下显示黑灰色和不可读。这样,EFI和Mac分区就建立好了。对于BIOS+MBR,可以在win下进行设置,相关教程网上都有,这里就不再啰嗦。

二、安装黑苹果(UEFI+GPT)

1EFI分区设置

安装黑苹果可以利用制作好的U盘clover也可以将Clover放入新建的EFI分区中,个人更倾向于后者,这样可以避免每次调试都得插上U盘,所以建议大家将Clover文件放入EFI中,然后拔掉U盘,进行安装。

2在重启安装之前,还需要利用EasyBCD 这个软件添加linux开机引导项,从而可以进行EFI Clover引导安装。

3安装

开机进入BIOS 启动设置,设置为UEFI启动,然后电脑会进入Clover,此时如果插入黑果安装盘即会显示,这时候一般会加入啰嗦模式启动(-v),如果啰嗦模式可以一次通过,那么恭喜你,可以省去一大堆麻烦(不必因为卡在某个地方去不断的调试),如果没有一次通过也不要担心,记录好卡在什么地方,度娘会帮助你怎么解决的。

4啰嗦模式过后会出现期待已久的苹果标志,第一次进度条可能会慢点,当进度条读取完成,会出现安装界面如图。

5此时,选择一开始未格式化的那个盘,用磁盘工具对其抹掉,进行日志式擦除,然后就可以进行安装了,过程大概20分钟,耐心等待即可。

6安装完成会自动重启,此时不需要进行 *** 作,第一次进入系统会比较慢,等待即可。这样黑苹果就安装完成了。

三、驱动

安装黑苹果比较简单,但是驱动黑苹果这个就“因机而异”了,如果网上有现成的完美教程,直接按照教程即可,但是机子各有千秋,硬件差异万千,所以驱动是个问题,主要的驱动有以下几个:显卡驱动、声卡驱动、无线网卡驱动、电源驱动,接下来简单讲一下。

1显卡驱动

本人的电脑是2012年的联想V480扬天系列,为双显卡,IntelHD4000的集显和NVIDIA GeForce GT 645M的独显,因为苹果主打商务办公,所以一般都是集显,无法驱动英伟达的独显,因此我也只驱动了HD4000集显。网上关于Intel HD系列显卡驱动方法较多,这里推荐RehabMan大神的方法,注入DSDT打显卡补丁,由于我的机子比较特殊,一加dsdt就挂掉,所以找了一段别人利用神奇代码已经解决的方法,在config文件中添加神奇代码,最终显卡驱动成功。

在10104的时候,驱动成功后在进入黑苹果时候,读取进度条未出现短暂花屏,但是在装10116的时候,显卡驱动成功后,在读取进度条会出现短暂花屏,解决方法可以参考>

以上就是关于HOOK NtCreateThread 怎么获得 创建进程的命令行参数全部的内容,包括:HOOK NtCreateThread 怎么获得 创建进程的命令行参数、在dsdt中注入和在ssdt中注入效果相同吗、gspy阻止你的重启是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9547573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存