冰楓論壇

 找回密碼
 立即註冊
查看: 237|回覆: 0
打印 上一主題 下一主題

[開源] c++實現的一種代碼膨脹變形殼

[複製鏈接]

326

主題

34

好友

1244

積分

金牌會員

飛翔至夢想的彼端~

Rank: 6Rank: 6

UID
86990
帖子
6476
主題
326
精華
0
積分
1244
楓幣
5290
威望
1155
存款
0
贊助金額
150
推廣
0
GP
155
閱讀權限
70
性別
保密
在線時間
1039 小時
註冊時間
2014-12-27
最後登錄
2018-2-19

積分勳章 解說達人 在線終極王 論壇支持王 論壇粉絲 發帖達人 懶人勳章 太陽勳章 長老勳章 神手勳章 2016年紀念勳章 私服達人 音樂勳章 2017年紀念勳章 2017端午節紀念勳章

跳轉到指定樓層
1
發表於 2017-12-29 22:52:30 |只看該作者 |倒序瀏覽
本帖最後由 xxx9638527410 於 2017-12-29 21:17 編輯

主要實現3個功能:
1.代碼膨脹
2.代碼變形
3.對地址常量包括字符串常量進行加密

代碼膨脹:
代碼膨脹無非就是指令等價替換,不過這裡沒條指令最好能有多個膨脹規則,這樣會加大還原難度。
原始程序大小為6kb,經過5次混淆後,大小變為66kb.
624198_wo7v3n27ujpg2hn
混淆前代碼:
624198_uoznqohalhhqwhx

混淆後代碼:
624198_gldb2dx7yp0p3gu
624198_m42w3e0kk7jpsyk
從上圖會發現有大量的垃圾代碼生成。

說一下代碼變形:
1.有分支跳轉改成無分支跳轉。
在逆向分析時主要是通過條件跳轉來確定函數的流程,根據跳轉的目標地址來確定這是一個分支還是一個循環。如果將所有條件跳轉改成無分支跳轉,那麼程序只有在動態執行時,才能確定流程。這大大提高了逆向分析的難度。另外,ida在進行還原偽c代碼時,遇到無分支跳轉,會進行截斷,導致後面指令無法還原偽c代碼。這對靠f5吃飯的人說就gameover了。因為此時已經控制了代碼流程, 如果在後面加一些垃圾指令,會導致後面的代碼全部識別錯亂,只有運行時才確定要跳到哪個位置。

另外對jmp imm, call imm和call [imm](一般這種間接call都是api調用) 也改成無分支跳轉。
本來沒打算對這類指令進行處理,但是發現效果還挺好,乾脆就加上吧。因為jmp imm也可以作為判斷分支或者循環的依據,而call也是一個比較關鍵的指令,尤其是call api,在逆向分析時,通過觀察api的前後代碼來確定代碼到底在幹嘛。這樣一處理,你靜態分析時看不到任何條件跳轉,看不到任何call調用(除了call reg,當然了,靜態分析你也看不出來call reg)。

另外對條件跳轉和call這類指令的下一條指令加一些垃圾代碼,會導致後面的整段指令識別錯誤。也會給別人留下個坑,比如一般人想步過這個函數調用,會在函數的下一條指令地址處下斷點,但這條指令實際上永遠不會執行。

實現思路:
1.將跳轉目標地址保存到一個地址數組表裡面,在建一個索引表記錄地址表的索引,在對索引進行隨機加密。運行時根據條件碼得到正確的索引表地址,在對索引進行解密,得到正確的目標地址偏移。
代碼變形前:
624198_db143rqu6fkfo2e

代碼變形後:

624198_l6uynalbvpv8g7o
兩幅圖對比發現call memset 變成了一大串指令,最後以ret結尾。這一大串做了一個事情,去索引表找到地址表的索引,在根據這個索引去地址表找到正確偏移值,加上基地址,得到目標地址。同時會把返回地址壓棧,實際上返回地址是可以隨意更改的,我是按照代碼塊進行處理的,隨意加一些垃圾指令, 把後面的代碼塊往下移動一點就好了,這個自己改,另外索引加密這個我註釋掉了,去掉就可以。大家發現這裡先push了2個寄存器,在這裡偷了點懶,實際上最好應該是用反彙編引擎掃一下當前哪些寄存器是被佔用的,再從沒被佔用的寄存器中隨機分配2個寄存器。如果沒有可利用的寄存器,在這麼做。

call memset是一個立即數,再來看下scanf (call [imm])
代碼變形前:
624198_hr32bljae3qq269

代碼變形後:

624198_kf2ynuwm8spg93j

再來看下f5後的代碼:
代碼變形前:
624198_2tsjqpnjxchrw4p

代碼變形後:
624198_xp7wbimk35cb0tt
從上圖可以發現變形後,ida根本就沒有識別完整個函數,只識別了一點點。ida遇到無條件跳轉會截斷當前函數。

對地址常量包括字符串常量進行加密:
在進行逆向分析時,很多人第一反應會去看看有沒有一些敏感字符串,根據ida的交叉引用來確定目標地址。
另外一些地址值可能也比較關鍵,比如回調函數。而這類常量賦值一般都是mov指令和push指令,對mov imm,push imm這類指令的立即數做隨機加密,就可以起到一個保護的作用。
加密前:
624198_gzdxm1v2glvfrml
加密後:

624198_co8f722ur7fkr4z


以上純屬個人見解,有對代碼保護(代碼膨脹變形,vmp)比較感興趣的,可以去wprotect群(群號:210887170)互相交流。在這裡提前祝大家元旦快樂。


轉至看雪
by淡淡的熒光
[發帖際遇]: xxx9638527410 因吃了太多「垃圾食物」,「胃全」是垃圾,就診後獲得醫療理賠 1 楓幣. 幸運榜 / 衰神榜
收藏收藏0 推0 噓0
把本文推薦給朋友或其他網站上, 有用戶註冊將增加您在本站積分: 1威望. 1推廣
您需要登錄後才可以回帖 登錄 | 立即註冊

正在連接伺服器...
打開冰楓聊天室
廣告刊登意見回饋關於我們職位招聘

Copyright ? 2011-2018 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|意見反饋|手機版|Archiver|冰楓論壇

GMT+8, 2018-2-20 07:49

APP Store下載 Play Store下載
回頂部

http://www.vxiaotou.com