C#實現映像劫持

来源:https://www.cnblogs.com/gfjin/archive/2017/12/25/8109558.html
-Advertisement-
Play Games

“映像劫持”,也被稱為“IFEO”(Image File Execution Options),在WindowsNT架構的系統里,IFEO的本意是為一些在預設系統環境中運行時可能引發錯誤的程式執行體提供特殊的環境設定。當一個可執行程式位於IFEO的控制中時,它的記憶體分配則根據該程式的參數來設定,而W ...


“映像劫持”,也被稱為“IFEO”(Image File Execution Options),在WindowsNT架構的系統里,IFEO的本意是為一些在預設系統環境中運行時可能引發錯誤的程式執行體提供特殊的環境設定。當一個可執行程式位於IFEO的控制中時,它的記憶體分配則根據該程式的參數來設定,而WindowsN T架構的系統能通過這個註冊表項使用與可執行程式文件名匹配的項目作為程式載入時的控制依據,最終得以設定一個程式的堆管理機制和一些輔助機制等。出於簡化原因,IFEO使用忽略路徑的方式來匹配它所要控制的程式文件名,所以程式無論放在哪個路徑,只要名字沒有變化,它就運行出問題。 “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions”內,使用與可執行程式文件名匹配的項目作為程式載入時的控制依據,最終得以設定一個程式的堆管理機制和一些輔助機制等,大概微軟考慮到加入路徑控制會造成判斷麻煩與操作不靈活的後果,也容易導致註冊表冗餘,於是IFEO使用忽略路徑的方式來匹配它所要控制的程式文件名。

實例操作

編輯 例如有一個程式文件名為“xiaojin.exe”,由於使用了舊的堆管理機制,它在新系統里無法正常運行甚至出現非法操作,為了讓系統為其提供舊的堆管理機制,需要IFEO來介入,則需執行以下步驟: 1. 確保在管理員狀態下執行regedit.exe,定位到以下註冊表項: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions 2. 在“Image File Execution Options”下建立一個子鍵,名為“xiaojin.exe”,不區分大小寫。現在確保位於HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions\xiaojin.exe\下,建立一個字元串類型的註冊表項,名為“DisableHeapLookAside”,值為“1” 3. 再次運行xiaojin.exe查看運行情況,如果真的是由於堆管理機制引發的問題,則程式得以正常運行,否則該程式問題不屬於IFEO能夠干涉的範圍,或者需要嘗試搭配其他的參數使用。

基本原理

編輯 QUOTE NT系統在試圖執行一個從命令行調用的可執行文件運行請求時,先會檢查運行程式是不是可執行文件,如果是的話,再檢查格式的,然後就會檢查是否存在。。如果不存在的話,它會提示系統找不到文件或者是“指定的路徑不正確等等。 當然,把這些鍵刪除後,程式就可以運行! 從實際現象來說 把IFEO直接稱為“映像劫持”未免有點冤枉它了,因為裡面大部分參數並不會導致今天這種局面的發生,惹禍的參數只有一個,那就是“Debugger”,將IFEO視為映像劫持,大概是因為國內一些人直接套用了“Image File Execution Options”的縮寫吧,在相對規範的來自Sysinternals的專業術語里,利用這個技術的設計漏洞進行非法活動的行為應該被稱為“Image Hijack”,這才是真正字面上的“映像劫持”! Debugger參數 直接翻譯為“調試器”,它是IFEO里第一個被處理的參數,其作用是屬於比較匪夷所思的,系統如果發現某個程式文件在IFEO列表中,它就會首先來讀取Debugger參數,如果該參數不為空,系統則會把Debugger參數里指定的程式文件名作為用戶試圖啟動的程式執行請求來處理,而僅僅把用戶試圖啟動的程式作為Debugger參數里指定的程式文件名的參數發送過去!光是這個概念大概就足夠一部分人無法理解了,所以我們放簡單點說,例如有兩個客人在一起吃自助餐,其中一個客人(用戶)委托另一個客人(系統)去拿食物時順便幫自己帶點食物回來(啟動程式的請求),可是系統在幫用戶裝了一盤子食物並打算回來時卻發現另一桌上有個客人(Debugger參數指定的程式文件)居然是自己小學里的暗戀對象!於是系統直接端著原本要拿給用戶的食物放到那桌客人那裡共同回憶往事去了(將啟動程式請求的執行文件映像名和最初參數組合轉換成新的命令行參數……),最終吃到食物的自然就是Debugger客人(獲得命令行參數),至此系統就忙著執行Debugger客人的啟動程式請求而把發出最初始啟動程式請求的用戶和那盤食物(都送給Debugger客人做命令行參數了)給遺忘了。 在系統執行的邏輯里 這就意味著,當一個設置了IFEO項Debugger參數指定為“notepad.exe”的“iexplore.exe”被用戶以命令行參數“-nohome bbset”請求執行時,系統實際上到了IFEO那裡就跑去執行notepad.exe了,而原來收到的執行請求的文件名和參數則被轉化為整個命令行參數“C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome ”來提交給notepad.exe執行,所以最終執行的是“notepad.exe C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome bbs.即用戶原來要執行的程式文件名iexplore.exe被替換為notepad.exe,而原來的整串命令行加上iexplore.exe自身,都被作為新的命令行參數發送到notepad.exe去執行了,所以用戶最終看到的是記事本的界面,並可能出現兩種情況,一是記事本把整個iexplore.exe都作為文本讀了出來,二是記事本彈出錯誤信息報告“文件名不正確”,這取決於iexplore.exe原來是作為光桿司令狀態請求執行(無附帶運行命令行參數)的還是帶命令行參數執行的。 Debugger參數存在的本意 是為了讓程式員能夠通過雙擊程式文件直接進入調試器里調試自己的程式,曾經調試過程式的朋友也許會有一個疑問,既然程式啟動時都要經過IFEO這一步,那麼在調試器里點擊啟動剛被Debugger參數送進來的程式時豈不是又會因為這個法則的存在而導致再次產生一個調試器進程?微軟並不是傻子,他們理所當然的考慮到了這一點,因此一個程式啟動時是否會調用到IFEO規則取決於它是否“從命令行調用”的,那麼“從命令行調用”該怎麼理解呢?例如我們在命令提示符里執行taskmgr.exe,這就是一個典型的“從命令行調用”的執行請求,而我們在點擊桌面上、普通應用程式菜單里的taskmgr.exe時,系統都會將其視為由外殼程式Explorer.exe傳遞過來的執行請求,這樣一來,它也屬於“從命令行調用”的範圍而觸發IFEO規則了。為了與用戶操作區分開來,系統自身載入的程式、調試器里啟動的程式,它們就不屬於“從命令行調用”的範圍,從而繞開了IFEO,避免了這個載入過程無休止的迴圈下去。 由於Debugger參數的這種特殊作用,它又被稱為“重定向”(Redirection),而利用它進行的攻擊,又被稱為“重定向劫持”(Redirection Hijack),它和“映像劫持”(Image Hijack,或IFEO Hijack)只是稱呼不同,實際上都是一樣的技術手段。 實質問題 講解完Debugger參數的作用,我們來看看“映像劫持”到底是怎麼一回事,遭遇流行“映像劫持”病毒的系統表現為常見的殺毒軟體、防火牆、安全檢測工具等均提示“找不到文件”或執行了沒有反應,於是大部分用戶只能去重裝系統了,但是有經驗或者歪打正著的用戶將這個程式改了個名字,就發現它又能正常運行了,這是為什麼?答案就是IFEO被人為設置了針對這些流行工具的可執行文件名的列表了,而且Debugger參數指向不存在的文件甚至病毒本身! 舉例超級巡警的主要執行文件AST.exe為例,首先,有個文件名為kkk.exe的惡意程式向IFEO列表裡寫入AST.exe項,並設置其Debugger指向kkk.exe,於是系統就會認為kkk.exe是AST.exe的調試器,這樣每次用戶點擊執行AST.exe時,系統執行的實際上是作為調試器身份的kkk.exe,至於本該被執行的AST.exe,此刻只能被當作kkk.exe的執行參數來傳遞而已,而由於kkk.exe不是調試器性質的程式,甚至惡意程式作者都沒有編寫執行參數的處理代碼,所以被啟動的永遠只有kkk.exe自己一個,用戶每次點擊那些“打不開”的安全工具,實際上就等於又執行了一次惡意程式本體!這個招數被廣大使用“映像劫持”技術的惡意軟體所青睞,隨著OSO這款超級U盤病毒與AV終結者(隨機數病毒、8位字母病毒)這兩個滅殺了大部分流行安全工具和殺毒軟體的惡意程式肆虐網路以後,一時之間全國上下人心惶惶,其實它們最大改進的技術核心就是利用IFEO把自己設置為各種流行安全工具的調試器罷了,破解之道尤其簡單,只需要將安全工具的執行文件隨便改個名字,而這個安全工具又不在乎互斥量的存在,那麼它就能正常運行了,除非你運氣太好又改到另一個也處於黑名單內的文件名去了,例如把AST.exe改為IceSword.exe。   以上文字來自於百度百科 下麵就來看一下C#代碼的簡單實現:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
namespace 設置映象劫持
{
    public partial class Form1 : Form
    {
        public Form1()
        {
   InitializeComponent();
        }
  [STAThread]
  static void Main()
  {


   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new Form1());
  }
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;//開始定時器

       }

        private void dra()//定時器周期時間,主要用來繪製時間,和本文關係不大
        {
            Graphics gr = this.CreateGraphics();
            Brush br1 = new SolidBrush(Color.Green);
            Brush br = new SolidBrush(Color.Red);
            gr.FillRectangle(br1, 20, 20, 120, 40);
            gr.DrawString("映像劫持",new Font ("宋體",12),br,21,21 );
            gr.FillRectangle(br1, 150,20, 120, 40);
            gr.DrawString(DateTime.Now.ToLongTimeString(), new Font("楷書", 12), br, 151, 20);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
          
            dra();
           
        }

        private void button1_Click(object sender, EventArgs e)//設置映像劫持,本文的核心
        {
            int s=0;
            for (int i = 0; i < comboBox1.Items.Count; i++)
            {
                string []name=new string [comboBox1.Items.Count ];
                name[i]= comboBox1.Items[i].ToString();
                if (name[i] == comboBox1.Text)
                {
                    s++;
                }
            }
            if(s==0)
            {
                comboBox1.Items.Add (comboBox1.Text );

            }
            else
            {

            }
                try
                {
                    RegistryKey reg;
                    reg = Registry.LocalMachine;

                    reg = reg.CreateSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\" + comboBox1.Text);
                    reg.SetValue("Debugger", comboBox2.Text);
                    reg.Close();
                    MessageBox.Show("映像劫持成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Refresh();

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
          
       

        private void button2_Click(object sender, EventArgs e)//解除映像劫持,本文的核心
        {
            try
            {
                RegistryKey reg;
                reg = Registry.LocalMachine;

                reg.DeleteSubKeyTree(@"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\" + comboBox1.Text,true);
               
                reg.Close();
                MessageBox.Show("解救映像成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Refresh();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                label1.Text = "解救映像名:";
            }
        }

    }
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、開啟註冊表“win鍵+R鍵”並輸入regedit 二、在註冊表項 HKEY_CURRENT_USER\ Software\ Microsoft\ Command Processor 新建一個項,並修改數據為“cd /d C:\”,在/d空格後就是你要的路徑 修改成功是這樣的 ...
  • 描述: 森炊今天沒吃藥很開森,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早,森炊就開始做預算了,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一 ...
  • 工作中經常需要瞭解plcdb塊的數據!由於工作使用OPC類庫進行通訊,開發,配置,使用都比較麻煩, 特在網上找到一個名為PLCcom.dll的類庫,可以實現PLC讀寫操作,下麵演示C#如何使用PLCcom.dll類庫 首先看一下封裝對PLCcom調用的幫助類: using System;using ...
  • 知識點目錄 >傳送門 首先介紹什麼是抽象類? 抽象類用關鍵字abstract修飾的類就是叫抽象類,抽象類天生的作用就是被繼承的,所以不能實例化,只能被繼承。而且 abstract 關鍵字不能和sealed一起使用,因為sealed是不允許繼承,這樣就是抽象類的意義衝突了。 現在我們知道知道了抽象類長 ...
  • "上一篇文章" 簡單簡單分析了fiddlercore自帶樣例的代碼,本篇文章進入主題,介紹如何使用fiddlercore截獲 HTTPS 流量。 當時學習完樣例代碼後,我覺得結合註釋來抓HTTPS的包應該也很簡單,結果按照註釋的提示修改了下代碼後,還是抓不到,反覆嘗試了很多方法都沒有解決,在goog ...
  • 描述 本篇文章主要概述ASP.NET MVC,具體包括如下內容: 1.MVC模式概述 2.WebForm概述 3.WebForm與MVC區別 4.ASP.NET MVC發展歷程 5.運用程式結構 6.ASP.NET MVC 預設約定 一 MVC模式概述 1. MVC模式運用領域 分析: (1)當前, ...
  • WinMain即(函數運行入口): int WINAPI WinMain (HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow) { MessageBox(NULL,TEXT("Hello,Window 9 ...
  • 最近粗淺的學習了下AutoMapper 這個做對象映射的第三方工具,覺得非常方便使用,所以簡單的總結了一下我能想到的簡單的對象映射的方式。 占時先不考慮源對象成員到目標對象成員的指定映射(即成員名不一致),先準備好兩個類Students-StudentsDto;Teachers-TeachersDt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...