MaxToCode加密過程全解析!

 

原地址:http://aplo.cnblogs.com/archive/2006/07/18/453600.html

http://www.21road.net/?action=show&id=591

看到了關於MaxToCode的破解文章我也來談談我的破解過程。
我也研究過,並且自己寫出了一個類似的程序,MaxToCode起到一定保護作用,因爲任何給予CRT的託管代碼都逃不過Profile的檢查,如果編寫一個Profile程序(可以參考MSDN),在CRT編譯開始的時候動態讀取內存內容,就可以得到Assembly的實際編碼內容。
先講一下MaxToCode的原理,
被MaxToCode加密過的程序運行過程如下:

1.CRT加載加密Assembly。
2.程序調用加密Assembly中的類。
3.執行被調用加密Assembly中類的靜態構造函數(這就是MaxToCode進行IL轉換時候添加的,如果該類存在靜態構造函數,則把該函數改名,然後添加自己的函數,再在函數末尾調用原來的函數。MaxToCode添加靜態函數的原因就是,在執行加密的類代碼之前,動態解密加密Assembly原來的IL代碼,再將代碼根據IL表恢復原有代碼存放的內存地址,這時候CRT編譯加密類的某個被調用的方法時,程序代碼時已經是原有代碼了,並不是加密過的代碼。其主要應用的Win32API是MemoryWrite,MemoryRead
經過第3步以後,內存中的代碼已經是沒有加密的代碼了,這時候可以動態讀取內存,得到源代碼,OK!破解了。
4.程序按照原有的執行順序執行。
………………

MaxToCode大體的執行過程就是這個樣子的。可能會略有出入。不過思路應該是一致的,

根據上面的執行過程我們也不難猜出其的加密過程(不一定完全一致,思路差不多)

1.利用ildasm.exe反編譯程序,得到IL代碼。(調用Win32API:CreateProcess或者WinExec,並加上程序運行參數)
2.去掉簽名和註釋。
3.分析IL代碼(應該是利用正則表達式)
4.判斷Assmebly中每個Class是否含有靜態構造函數,如果沒有加上自己的函數作爲該類的靜態構造函數,否則將原有的方法改名,添加自己的函數並在函數末尾調用被改名的函數。該函數就是動態解密的函數,這個函數在它附帶的DLL中。
5.保存更改好的IL代碼。並利用 ILAsm.exe 編譯更改的代碼。(這時候並沒有加密原有函數)
注:MaxToCode中間處理的IL代碼被保存在“C:/Documents and Settings/[用戶名]/Local Settings/Temp”臨時目錄裏,好像是這個,因爲破解太久了記不清了,你可以搜索一下“C:/Documents and Settings/[用戶名]”而且在其編譯IL完後,好像沒有刪除更改和沒有更改的IL代碼。你可以利用windows的搜索上面這個目錄後綴爲il的文件。應該就是了。
6.打開編譯好的文件(DLL或EXE)根據文件的原數據,找到每個類方法的文件偏移量以及大小,讀取其內容進行加密,寫入文件的其它位置(具體我沒有分析,你可以新建一個Section,也可以修改原有的Section,然後更改偏移量。具體做法很多,你可以參考PE文件結構),最後修改原有每個類方法的數據(不知道是不是糊填的,沒有研究)並保存該DLL或EXE,並將MaxToCode附帶的解密DLL拷貝到程序目錄下。
7.加密過程完成。

基本思路是如此,此外還會涉及到別的比如資源等等。

差不多也就說到這裏了。MaxToCode完全可以對它進行解密。而且無論其算法在安全,利用CRT自動檢測文件的特性(比如說不能修改其入口地址等等,如果出錯就報錯。),繞過它的算法。進行破解。

總而言之,對於大型程序來講。模糊處理還是一種最安全有效的方法。因爲沒有人能夠看懂幾百萬行,沒有註釋,變量名隨機的代碼。
除非那個人是“天才”。

這裏有我做的一個類似的加密程序(沒有做簽名處理,所以不要用帶簽名的程序)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章