在之前几节介绍了各种注入方法,但是这些方法存在一些缺陷——对.net程序注入无效。(转载请指明出处)

这个可以理解,.net程序的代码不是汇编,而是微软自定义的IL中间语言。.net CLR如同虚拟机,解析并执行这些中间语言。

于是我们之前所说的修改文件入口点的方法在此是一点都不奏效的,谁知道E8(Call)在IL中是啥!

远线程方法也存在问题。因为我们要提前注入,所以创建进程时使用了CREATE_SUSPENDED以挂起方式启动进程,但是当我们CreateRemoteThread后,会惊人的发现远线程没有执行,更惊人的是傀儡进程(.net程序进程)的主线程复活了。我汇编级调试CreateRemoteThread发现,对于win32程序,远线程创建时挂起,执行了一些操作后,ResumeThread然远线程执行。而对于.net程序,ResumeThread后主线程复活。

那么怎么解决呢?我们可以注入.net CLR。如果全局注入.nt CLR可行,那么结果也不是我们预期的,因为我们只要监控我们关心的进程,其他的进程我们不想关心。因为我是VC程序员,对C#等一窍不通,所以搞这个问题等于是跨界。还好感谢Code Project和Daniel Pistelli,找到.NET Internals and Code Injection 这篇文章。该文中介绍了一种办法,该方法的大致思路是模拟一个.net CLR,该CLR可以运行.net程序。于是我们可以确定我们要注入的.net程序的“边界”。这点非常重要,其实如果.net程序已经运行起来后,我们使用远线程注入还是成功的。只是我们要做的是提前注入,什么是“前”?多少是“前”?这个“边界”就在此起到非常重要的角色。因为我们模拟.net CLR的程序在准备模拟傀儡.net程序前,.net环境肯定是准备好了的。于是我们只要在模拟之前,让我们的模拟程序自己加载我们准备注入的DLL——变相注入。这是个令人激动的方案。

using System;
using System.Collections.Generic;
using System.Windows.Forms;using System.Runtime.InteropServices;namespace rbloader
{static class Program{[DllImport("HookDll.dll")]static extern void ExportFun();[STAThread]static void Main(string[] args){ExportFun();Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "Exe Files (*.exe)|*.exe|Dll Files (*.dll)| *.dll|All Files (*.*)|*.*";if (openFileDialog.ShowDialog() == DialogResult.OK){AppDomain ad = AppDomain.CreateDomain("subAppDomain");ad.ExecuteAssembly(openFileDialog.FileName);}}}
}

其中HookDll.dll是我前几篇文章中用到注入DLL文件,前篇文章的最后面提供了该文件工程下载地址。ExportFun是HookDll.dll中的导出函数,其拦截了CreateProcessW等函数。

其实这个方案也是存在缺陷的,因为它是模拟。我用模拟这个词,是因为真正的执行体是它自己而不是傀儡进程。傀儡进程文件只是模拟进程的输入信息。最直接的表现是:我们模拟进程叫A.exe,傀儡进程是B.exe,我们用A.exe运行B.exe,会发现进程列表中只存在A.exe而不存在B.exe。于是可以想到很多问题,比如我们在B.exe中获取当前进程的路径或者当前文件名,当A.exe运行B.exe后,相关逻辑获得是A.exe的路径和文件名。

虽然这是个很棒的东东,可惜其存在的缺陷也是很明显的。所以想提前注入所有进程(win32,.net,java),只在ring3层去做还是很困难的。有些问题还是要切入驱动去做。

工程代码。

(转载请指明出处)

VC提前注入.net软件的方法相关推荐

  1. VC下提前注入进程的一些方法2——远线程带参数

    在前一节中介绍了通过远线程不带参数的方式提前注入进程,现在介绍种远线程携带参数的方法.(转载请指明出处) 1.2 执行注入的进程需要传信息给被注入进程 因为同样采用的是远线程注入,所以大致的思路是一样 ...

  2. VC下提前注入进程的一些方法1——远线程不带参数

    前些天一直在研究Ring3层的提前注入问题.所谓提前注入,就是在程序代码逻辑还没执行前就注入,这样做一般用于Hook API.(转载请指明出处)自己写了个demo,在此记下. 我的demo使用了两种注 ...

  3. VC下提前注入进程的一些方法3——修改程序入口点

    前两节中介绍了通过远线程进行注入的方法.现在换一种方法--修改进程入口点.(转载请指明出处) 在PE文件中,其中有个字段标识程序入口点位置.我们通过这个字段,到达程序入口点.PE文件的结构我这儿不讨论 ...

  4. VC开发Windows客户端软件之旅——前言

    从第一次拖着行李入京找活,至今已工作若干年了.这些年一直追逐自己的梦想,跑过三个城市,换了三份工作,认识了很多业内的朋友.和朋友们闲聊时,发现很多人都已经不再做客户端软件了.有的转去做管理,有的转去做 ...

  5. 【转】软件需求分析方法

    软件需求分析(Software Reguirement Analysis)是研究用户需求得到的东西,完全理解用户对软件需求的完整功能,确认用户软件功能需求,建立可确认的.可验证的一个基本依据. 软件需 ...

  6. 安装爱剪辑计算机丢失,windows10系统下安装“爱剪辑”软件的方法

    "爱剪辑"是一款功能十分强大的视频剪辑软件,十分简单易用,初学者也能轻松上手.那么,全新的windows10系统下该如何安装"爱剪辑"视频剪辑软件?接下来,就随 ...

  7. Python开发多媒体管理软件实现方法

    软件开发环境 python 3.7.3 pycharm Community 2020 PYQT5 教师端控制界面 下拉列表显示全部已经连接的客户端ip地址 对选中的设备进行查看设备信息,重启电脑,关闭 ...

  8. 20190925-ORA-00600错误及被注入的软件

    昨天在家,打开数据库发现,连接不上,报错,ORA-00600.在网上找了很多方法试过都不行,最后看到有人说是 被注入的软件,就是说oracle11.2.0.4的安装包被注入过了,超过300天就会出问题 ...

  9. 这个有争议的软件开发方法,陪伴一代程序员走过了 18 年

    作者:熊节 / 插画:虎头锤 一.生于滑雪度假村,它的名字叫敏捷 敏捷是一种重视质量.追求快速反馈的软件开发方法. 2001 年 2 月,美国犹他州雪鸟滑雪度假村,"敏捷软件开发联盟&quo ...

最新文章

  1. 使用SharpPCap在C#下进行网络抓包
  2. 移动端真机测试怎么做
  3. 重做LVM文件系统之减小PV
  4. python0表示剪刀_简化Python代码(石头、纸张、剪刀)
  5. HDU2034 人见人爱A-B【水题】
  6. subgradients
  7. cgblib 代理接口原理_一文搞懂Java中静态代理、动态代理以及CGLIB代理
  8. 大话数据结构--数据结构概述
  9. 渗透测试PTES标准流程(超详细)
  10. android强制开启深色模式bug,强制深色模式软件
  11. 1299最长上升子序列
  12. 名词解释:DRAM, SRAM, SDRAM等
  13. 两种异步时钟同步化区别分析
  14. 什么是情感化设计?UI设计中情感化设计的目的
  15. C语言解决渔夫打鱼晒网问题
  16. 探索 Sa-Token (一) SpringBoot 集成 Sa-Token
  17. python编程midi键盘按键错乱_电脑键盘按键错乱怎么回事?几步轻松搞定
  18. linux运维工程师毕业设计,论文写作:运维工程师毕业论文怎么写?
  19. 【JavaSE】面向对象之多态、向上转型与向下转型
  20. 专访北京航空航天大学黎健成:我和编程比赛

热门文章

  1. Python可视化——3D绘图解决方案pyecharts、matplotlib、openpyxl
  2. PCL:超详细的基于法向量和曲率的区域生长算法原理以及源码解读
  3. STM32电源框图解析(VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT等的区别)
  4. opencv线性插值(上采样)
  5. HDU - 1269迷宫城堡 -强连通tanjar算法
  6. 【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集
  7. ehchache验证缓存过期的api_ASP.NET Core ResponseCache进行缓存操作
  8. SSC:基于点云语义上下文的大规模激光SLAM的位置识别方法
  9. 如何关闭vue项目中eslint的校验
  10. 函数返回类的对象与拷贝构造函数