Windows PE变形练手3-把通用模板机器码直接覆盖目标PE
把通用模板機器碼直覆蓋目標PE
? ? 這個地方真是嘗試了好久,遇到很多坑點,Win?PE那本書上的東西有點不夠,也就直接寫書上的例子會發現很多地方不是說的那樣,里面提供的信息太少了,就比如里面并沒有提被注入的目標PE的隨機基址問題,比如說中給了一套模板(模板里面有一些變量定義了沒有使用,還有獲取Kernel32.dll的地方是錯誤的,還有通用模板運行的時候內存溢出了...)額...總之不要在意這些細節。我自己摸索著弄吧,這個地方。
? ? 今天打算嘗試幾種姿勢手動把自己的模板機器碼添加到目標PE某個位置讓其加載我們的功能。
? ? 對于模板代碼來說,要注意的問題之前說過了,注意導入表、注意數據段、注意重定位等等。其實重定位還是很好解決的。導入表和數據段可以解決,但是很麻煩,需要重構,這也就意味著給我們的目標無形中帶來了兼容性的問題。學習的時候可以過度開發。深刻研究,但是一旦你是為了實現功能而寫代碼的時候建議一定要從簡,我們的目的是實現功能。出招過慢通常是因為姿勢過多[這個是別人提醒我的話]。OK不廢話,說正題。
嘗試1:
(1)隨便寫一個程序,作為宿主文件,記住代碼多寫點。別弄的代碼段只有很少內容,結果自己注入的模板字節碼比原來.text還大。[記住這個文件的隨機基址一定要關閉,如果你用的是VS的話,在這里]
?
(2)編寫一個通用模板程序(加載dll的),匯編代碼在最后,開發環境(vs2012+masm32),這個程序的基址隨不隨機無所謂,因為一會只是把.text段部分拷貝過去。
下圖是生成的載體EXE:
?
?
(3)然后把1生成的那個exe,的程序入口改成對應FOA=0X400的地方。在把2生成的EXE的代碼段部分拷貝到1的FOA=0X400處,運行1生成的exe會發現成功加載了相關dll。
下圖是改PE頭里面程序入口地址:
然后是替換代碼段的部分:
?
? ? 最后那個E9?XXX?我沒有修改,這個地方是留著最終嵌入到目標程序某個位置,執行完之后最好是跳轉回原來的函數入口,這樣就不會影響原目標載體的正常執行,同時又能執行我們自己的代碼邏輯。
這個實驗是要是為了驗證載體的獨立行和可行性。因為源程序里并沒有嵌入代碼里的那些調用函數,也沒有導入表,也沒有數據段。這樣只要讓目標文件的邏輯指向咱們的入口就OK了,咱們是完全獨立的。同時上面注意一個問題,就是再寫被注入載體例子的時候,我是關掉了隨機基址選項。接下來實驗二嘗試打開隨機基址選項。因為實際嵌入別人程序很多時候對方的隨機基址選項是開著的。開不開隨機基址,看PE頭信息就能看出來:
嘗試2:
? ? 這次打算解決上一個例子的不足。關于隨機基址的問題,在平時使用的過程中,通常要做的是嵌入到別人的程序里,所以咱們認為很多的程序的那個選項是開著的,也就是基址是隨機的,這個地方我剛剛做了很多嘗試,我一開始是發現我嵌入的代碼在call的地方失敗了,call的地址什么都沒有,然后我就在嵌入模板里在這個位置上做了很多次嘗試,結果都失敗了。我用全局變量重定位的姿勢搞了這個call,結果還是不行(可能是姿勢錯誤)。后來我反復編譯我自己的一個helloworld[因為我也不知道到底那個選項改了什么],發現那個選項對代碼段沒有影響,額...既然我的代碼是獨立可以運行的,同時那個東西對代碼段又沒有影響,那是不是在我的程序里,我可以直接把那個隨機的選項抹掉:
結果我是在PE頭里找到那個位置,把那個改成0,發現可以成功運行,然后我又找來chrome等別的程序,測試了幾個,發現可以。
? ?
????然后打算下個PE比較工具看下具體細節,隨便點擊了一個界面進去了:
看到的這個:
一如既往的”喜歡的界面”,看那個大大橙色點擊下來你就會下載一個你都不知道是啥的東西,對,都怪你,不仔細看細節。然后在下面不起眼的地方找到了“真實”的下載地址,下載了個這貨:
依然很熟悉的套路
????百度上搜索東西,下載很多都是下載個這么個東西,超級大禮包。[打著簽名哦,而且國內殺軟幾乎都方行了],也許上面也是,都沒違規只是做的不明顯讓你取消安裝。但是國外貌似不承認這種所謂的不違規:
? ? 下面是avast上執行這個exe的結果,執行前沒報毒,也就是祖國的這款大禮包程序并沒有對avast的動態掃毒做免殺,打著簽名還被avast報毒,這肯定是一點都沒有免殺...
????最后經過重重困難,在虛擬上安裝了UC,然后運行不起來。FK。浪費時間。算了這個地方醬紫。繼續?實驗2?的測試流程
?
?
?
????然后就硬著試了一次:把目標PE頭里面的這個字段直接抹成0,然后在用?實驗1?的姿勢去做,結果發現是可以的。OK?說下這次嘗試的姿勢步驟:
?
(1)找到本機chrome.exe,修改PE頭的兩個地方
?{
??????A:基部重定位表地址為0
??????B:程序入口地址RVA(FOA=0x400)
?}
?
(2)?然后編譯嵌入模板文件,把.text(FOA=400)處的機器碼拷貝到(1)改變之后的對應FOA=0X400的位置上。
(3)?把測試dll和改好后的exe放到,chrome原來文件夾下,記住改名為chrome.exe,無意發現,chrome.exe如果換了名字之后就運行不起來了,額...不知道這個是處于防護還是什么,應該不是防護,防護的話這么做感覺沒什么卵用,難道是怕別人做類似chrome->chrome2,my.exe->chrome.exe?這類事??反正便面上看沒卵用。
(4)?運行chrome會發現相關dll被加載,點擊確定之后chrome崩潰,崩潰是必然,因為首先沒有給最后的那個跳轉指令E9?XXXX更改實際值,同時因為暴力覆蓋了原來代碼部分,導致代碼損壞。So這就是下個實驗要做的事,把代碼嵌入到某個位置,比如某個間隙,某個段(比如最后一段),或者自己單獨創建一個段。放在里面等等。然后修改函數入口跳轉進來,做完事再跳轉到之前該跳轉的位置。
?
下面是實驗2的一些細節截圖:
下圖成功通過chrome.exe加載了dll。
?
下圖是我本機上原版chrome重命名后起不來,彈的錯誤窗口:
?
????劫持過程中發現360彈窗,注意木馬名稱。之前沒見過這個顏色的窗,我沒記錯的話之前是見過紅色的[應該是加載服務或者驅動的時候],黃色的[鏡像劫持或者hook的時候,直接cmd強行修改密碼也是黃色]...不過不重要,可能就是隨便換個皮膚吧,還順便打個廣告。主要是看描述和名稱。同時還發現一個問題,如果是改chrome的話發現有保護,改自己寫的代碼并沒有保護,沒猜錯應該是有這種特判邏輯,有時間研究下怎么過這個。不過這個不重要了,平時很少分析國內殺軟。也不知道國內殺軟都什么套路,就像發現電腦管家的一個優點就是界面賊帥,但是隨便TDL無簽名加上一個驅動,然后干掉它。全程沒有提示。額.....
????360提示報毒之后,被修改的chrome.exe被干掉了,但是那個劫持I.dll,沒被清理掉。這個地方差評,也許是還沒到我加載這個DLL的時候就已經被截斷了,所以就直接把exe干了。然后并沒有在沙箱里跑我,看我操作那些文件,進一步清理。不過這樣做也可以理解。沒有理由繼續深一步清理。產品---用戶,效率---過度開發。很多時候過度開發就是在浪費生命。
?
之后的實驗是在不破壞原來PE結構的前提下附加我們的補丁代碼。姿勢有很多,我覺得我會選擇擴展最后一節大小來做這個事,不過越簡單的東西也就越容易被檢測出來,想到最后一節擴展,突然想起個事,最后一節改完之后,然后對其,然后修改PE頭。貌似對于大簽名的文件來說簽名還是正常的。這個之前分析過。BUT,這么改肯定要修改PE頭的另兩個字節,入口地址和代碼重定位值。簽名跟定無效了。So......
感覺今天廢話說的有點多,可能是周末時間多,無聊吧。看到都好奇,就簡單看看。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Windows PE变形练手3-把通用模板机器码直接覆盖目标PE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows PE变形练手2-开发一套
- 下一篇: Python练习1-文档格式化成html