通过回调函数阻止进程创建(验证结束,方案完全可行)

(此方案完全可行,只是我忘掉了一步)

 

虽然Vista之后版本有进程创建回调函数的Ex版,而且Ex版可以拦截进程创建,

 

但是由于在Ex版回调函数内用第三个参数的最后一个元素来阻止进程创建的话,可能会出现弹框,所以不安全,所以这个方案可行性不高。

(这里说的不安全,是说可以被用户层看到这个弹框,可以被发现,处理麻烦,如果是用户自己设置的拦截,那么根本不需要通知用户,如果是我们自己做拦截,就不该让用户发现,

不管怎么说,这个弹框都是不应该出现的。)

 

所以,我想了这个方案,不知道是否可行,先纪录下这个方案。

 

步骤:

 

    1:注册进程创建回调,以及镜像加载回调,普通版本就可以了,不需要Ex版,这样从XP开始的所有版本就都兼容了。

 

    2:当一个进程被创建的时候,进程创建回调会被调用,而且create参数应该为 1,

      这时,纪录进程的全部信息,保存在安全的位置(设备扩展),由于进程可能很多,所以需要用链表

      要保存的信息包括,进程ID,进程文件路径,以及一个进程创建标志flage,可以设置为0

 

    3:进程创建回调被调用之后,紧接着被调用的就是镜像加载回调,而第一个被加载的镜像,就是那个可执行文件,

      也就是说,当镜像加载回调被触发的时候,根据进程ID,去设备扩展里面的链表中找到这个进程ID,判断它的flage是否为0

      如果为0的话,修改flage为1,标志已经被处理过了(安全起见也可以判断镜像名字)

      镜像加载回调的第三个参数可以得到镜像基址,根据基址,然后分析一下PE,得到OEP的RVA,加上基址,得到VA,

      这里是重点,把VA的第一个字节数据记录下来,保存在链表中,然后修改VA的第一个字节为 C3 ,也就是 retn

      这样,可以保证,进程的主线程刚刚启动,就返回了

      为什么要保存VA的数据,这就是下面说的

      (一般来说,其实可以用类似 0x00400000 这种默认的建议加载地址来做判断可执行文件的镜像基址的,

      但是这样做不安全,因为可执行文件也可以有重定向表,这样基址就是可变的了,所以还是需要用第一次加载的方式,来寻找可执行文件的镜像基址)

 

    4:由于执行进程创建回调、镜像加载回调的时候,镜像只是被映射到了内存,并不是被写入到内存中的,所以对内存的修改会直接影响到可执行文件

      这时,就要对原始文件做一个修复,

      修复的时机就是在进程退出的时候,也就是进程加载回调第二次被调用的时候,也就是create参数为0的时候,根据当前进程ID,去设备扩展里面寻找进程路径

      根据分析PE文件,得到OEP的RVA,然后找到它的位置,修改第一字节,第一字节是什么?前面已经记录下来了。

 

 

 

到此为止,一套使用进程回调来拦截进程的工作就完成了。

 

这只是个构想,不知道能否实现,准备验证一下。

转载于:https://www.cnblogs.com/suanguade/p/4080621.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4 多线程使用tip

在GameThread线程之外的其他线程中,不允许做一下事情 1. 不要 spawning / modifying / deleting UObjects / AActors 2. 不要使用定时器 TimerManager 3. 不要使用任何绘制接口,例如 DrawDebugLine 4. 如果想在主线程中异步处理(也就是分帧…

linux shell if

linux_if 参数 shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指…

UE4异步操作总结

虚幻本身有提供一些对异步操作的封装,这里是对这段时间接触到的“非同步”的操作进行的总结。 当前使用的UE4版本为4.18.2。 在虚幻的游戏制作中,如果不是特殊情况一般不会有用到线程的时候。但是由于实际上虚幻内部是有着许多线程机制的。 例如通常的…

JavaScript模式读书笔记 第3章 字面量和构造函数

1&#xff0c;对象字面量 -1&#xff0c;Javascript中所创建的自定义对象在任务时候都是可变的。可以从一个空对象开始&#xff0c;根据需要增加函数。对象字面量模式可以使我们在创建对象的时候向其添加函数。<script>//定义空对象var dog {};//对空对象添加方法dog.na…

如何在UE4中创建线程

FRunnable和FRunnableThread方法对于大多数问题来说无疑是一个可行的解决方案。 但是&#xff0c;在创建许多任务时&#xff0c;您可能会达到CPU可以处理的并发上限&#xff0c;此时并发线程实际上会在争用CPU时间时相互阻碍。 然后可能值得查看FQueuedThreadPool以限制任务可用…

[Leveldb源码剖析疑问]-block_builder.cc之Add函数

Add函数是给一个Data block中添加对应的key和value,函数源码如下,其中有一处不理解: L30~L34是更新last_key_的,不理解这里干嘛不直接last_key_ key.ToString(); 写成 // Update state last_key_.resize(shared); last_key_.append(key.data() shared, non_shared); assert(S…

UE4多线程任务系统详解

首先&#xff0c;了解一下该系统重要的数据类型. 1. FQueuedThreadPool&#xff1a;虚基类&#xff0c;队列线程池, FQueuedThreadPoolBase继承自FQueuedThreadPool&#xff0c; FQueuedThreadPoolBase维护了一个TArray<IQueuedWork*> QueuedWork(需要被执行的工作)…

UE4异步编程专题 - 线程池FQueuedThreadPool

1. FQueuedThreadPool & IQueuedWork FQueuedThreadPool是UE4中抽象出的线程池。线程池由若干个Worker线程&#xff0c;和一个同步队列构成。UE4把同步队列执行的任务抽象为IQueuedWork. 线程池的同步队列&#xff0c;就是一个IQueuedWork的队列了。借用wiki上线程池的图,…

UE4异步编程专题 - 多线程

专题的第二篇&#xff0c;我们聊聊UE4中的多线程的基础设施。UE4中最基础的模型就是FRunnable和FRunnableThread&#xff0c;FRunnable抽象出一个可以执行在线程上的对象&#xff0c;而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRu…

坑爹的UICollectionView

最近用UICoolectionView的时候遇到一个很DT的问题&#xff0c;我往VC里加12个视图&#xff0c;结果显示成这样&#xff08;右边是期待的样子&#xff09;&#xff1a; 研究了一下午&#xff0c;终于发现了问题&#xff1a; interface FpLabelCell : UICollectionViewCellproper…

UE4异步编程专题 - TFunction

0. 关于这个专题 游戏要给用户良好的体验&#xff0c;都会尽可能的保证60帧或者更高的fps。一帧留给引擎的时间也不过16ms的时长&#xff0c;再除去渲染时间&#xff0c;留给引擎时间连10ms都不到&#xff0c;能做的事情是极其有限的。同步模式执行耗时的任务&#xff0c;时长…

Python用subprocess的Popen来调用系统命令

当我们须要调用系统的命令的时候&#xff0c;最先考虑的os模块。用os.system()和os.popen()来进行操作。可是这两个命令过于简单&#xff0c;不能完毕一些复杂的操作&#xff0c;如给执行的命令提供输入或者读取命令的输出&#xff0c;推断该命令的执行状态&#xff0c;管理多个…

7700装win7

1.可能不能安装版本太新的win7系统,会蓝屏 2.第一次重启后,系统会提示硬件太新,系统不支持,不用理会.可以用shiftF10,进入windows/system32/oobe目录,执行msoobe手动安装. 3.第一次进入系统后,尽早关闭系统更新,除了在控制面板中关闭,还要在services.msc中关闭windows update服…

UE4高级功能--初探超大无缝地图的实现LevelStream

LevelStream 实现超大无缝地图--官方文档学习 The Level Streaming feature makes it possible to load and unload map files into memory as well as toggle their visibility all during play. This makes it possible to have worlds broken up into smaller chunks so th…

Noip 2014酱油记+简要题解

好吧&#xff0c;day2T1把d默认为1也是醉了&#xff0c;现在只能期待数据弱然后怒卡一等线吧QAQDay0 第一次下午出发啊真是不错&#xff0c;才2小时左右就到了233&#xff0c;在车上把sao和fate补掉就到了 然后到宾馆之后&#xff0c;没wifi的生活就是惨啊QAQ 把空境补完就睡了…

一个取消事件的简单js例子(事件冒泡与取消默认行为)

先上代码&#xff1a; <div idouter onclickalert("我是outer")><div id"middle" onclickalert("我是middle")><div id"inner" onclickmyBubble(arguments[0]);alert("我是inner")><a onclickmyDefaul…

inside uboot (二) 启动流程

1. S3C6410 启动流程 1). 6410上电后&#xff0c;首先执行片内iROM的程序&#xff08;BL0&#xff09;&#xff0c;初始化时钟和看门狗等外围器件。 2). 然后把flash中头4K&#xff08;BL1&#xff09;的内容加载到片内的SRAM中执行。 3). 在SRAM中执行的BL1&#xff0c;初始…

你理解我的意思么?

在最近一次的电话会议里, 某leader前后说了十来句, "你理解我的意思么?". 说实话, 有些我都没理解, 不过我听到的大家的答复都是"理解!", "明白!". Leader问这样的问题, 期望是得到对方给你反馈, 结果大部分人不会直接对上级说, "是的,我不…

inside uboot (三) 异常向量表

1. 异常向量表概述 从上面的地址映射来看&#xff0c;中断向量表的地址为0xD0037400&#xff0c;因此如果我们想在SRAM中&#xff0c;也就是BL1中处理异常的话&#xff0c; 就需要把我们的异常向量表拷贝到这个地址上。或者我们可以在链接脚本中直接指定代码的地址。 如果在主…