一、目的與目標
1.1 主題目的
部門新人較多,希望通過本次分享讓同學們對以下知識點有個認識:
- 破解原理
- IL原理
- 強簽名與加密
- resx文件
由於時間有限,本文作為部門分享演示過程中輔助性文檔,會對文中一些關鍵點列出參考學習的博客地址,供大家課后學習。
1.2 本次實戰最終要達到的效果
本次實戰中所要達成效果如下圖:
1. 登錄時跳過,判斷是否注冊函數,直接進入業務操作模塊;
2. 修改logo大圖,改成其他圖片,如下圖所示;
圖一 破解前 圖二 破解后(去掉登錄限制)
二、破解過程
一個程序破解的過程,無論是.net還是c++等,過程大致都是這樣。
1.了解業務過程(繞過的點);
2. 找到對應的源代碼;
3. 刪除驗證代碼;
4. 重新為編譯可執行文件;
*,只是c++等,需要更為復雜的逆向工程,脫殼等步驟;
那我們就按此步驟開始;
【【源代碼】】從此處獲取
2.1. 找到需要繞過的點;
經過對需要破解的程序分析,最早突破就在找到【登錄】按鈕的代碼位置;通常驗證的函數都應該獨立封裝為一個函數;所以得出兩種繞過驗證的方式:
- 刪除業務邏輯中的驗證代碼;
- 修改驗證業務邏輯,不管是否注冊都返回已注冊;
2.2. 找到對應源代碼
這里借用反編譯工具來將IL反編譯可讀性更高的c#代碼,這樣更快速的幫助我們定位到button點擊事件或驗證函數(當然沒有這步也是可以,只是為了提高我們理解代碼的速度)。
反編譯工具通常用這兩種“Reflector” 和 “ILSpy” ,Reflector的反編譯代碼還原度更高但是非開源非免費(可以找低版本6.8以下),ILSpy反編譯程度不如Reflector高,但是開源免費,大家可以視自己具體的需求來選取;
1. 使用Reflector查看源代碼, 操作說明
2. 查看WindowsFormsApp1.exe ,如下圖可以看到,按鈕【登陸】的業務邏輯為,先調用Class1.getKey()方法來判斷是否注冊;
圖四,反編譯后查看按鈕點擊事件
2.3. 使用ildasm將exe和dll 逆向成IL文件
2.3.1 使用ildasm 將exe反編譯為il文件並修改
我們使用微軟官方提供了ildasm.exe來將.net程序反向成il文件
- 找到 ildasm.exe 通常在C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools;或者使用vs提供的開發人員命令操作符。
但是需要注意路徑,在demo中我已經將ildam和ildasm都打包到文件夾中了
2. 輸入 ildasm.exe WindowsFormsApp1.exe /out=il\windowsformsapp1.il
3. 修改IL代碼,跳過驗證:
1.打開windowsformsapp1.il;
2. IL重點行數分析:
128行,調用 Class1.getKey(),壓入值到堆棧;
129行,idc.i4.0在Stack 中int長度為4,值為0=>對應代碼為if(Class1.getKey()==false)中的false
130行,ceq 比較
136行,定義文本"請先注冊"
137行,調用MessageBox.show
138行, pop 彈出堆棧中的值
139行,轉向 IL 0028,對應代碼if(){}else{}那個代碼塊
3. 修改il方式一 (不調用:Class1.getkey())
將128行修改為:IL_0001: ldc.i4.1 //call bool [ClassLibrary1]ClassLibrary1.Class1::getkey()
使用2.3.2重新生成exe,反編譯后可以看到代碼變成下圖:
4. 邏輯修改二,依然調用驗證。但是取消else代碼塊
將139行注釋。注釋后可以參照方法2.3.2重新編譯生成exe。查看新的exe的源代碼如下:
2.3.2 重新生成windowsformsapp1.exe(記得這一步哦)
ilasm.exe windowsformsapp1.il /out=windowsformsapp1.exe
2.3.3 其他修改方案
不改windowform1.il,修改ClassLibrary.dll的驗證邏輯
類似方案一,留作大家自己研究
2.4. 修改資源文件,修改圖片;
修改exe中的圖片,使用以下步驟:
1. 將resources文件轉為resx
ResGen.exe WindowsFormsApp1.Properties.Resources.resources WindowsFormsApp1.Properties.Resources.resx
2. 使用vs打開新生成的resx文件,替換舊圖片icon-02.png,如下圖:
3. 或用記事本打開resx文件,將base64文本替換為新圖片的base64
4. 重新編譯為resources
ResGen.exe WindowsFormsApp1.Properties.Resources.resx WindowsFormsApp1.Properties.Resources.resources
* .resources,編譯后的資源文件,是無法直接打開無法直接保存圖片文件;使用反編譯工具反編譯后默認是產生.resources;而.resx 可被VS打開的文件;
那怎么將resources轉為resx呢,我們可以利用官方提供的Resgen.exe進行文件轉換
https://docs.microsoft.com/zh-cn/dotnet/framework/tools/resgen-exe-resource-file-generator
三、防御方法
既然.net這么輕易的被破解,那我們要怎么對我們的程序進行安全防護,以保證我們的代碼安全呢;主要也是通過以下兩點:
- 使用強簽名,防止DLL被篡改;
- 使用代碼混淆工具,防止被反編譯源碼;
強簽名:
本文不在描述,強簽名的作用和使用方式
代碼混淆工具:
代碼混淆工具有很多,如:微軟官方的Dotfuscator,有開源的ConfuserEX;還有其他的xeoncode、foxit;
代碼混淆可以單獨作為一個主題鋪開來說(java,ios 等等都面臨這個問題,所以不要過分擔心.net)
ConfuserEx操作步驟:https://blog.csdn.net/xiaoyong_net/article/details/78988264
四、最后
最后,作為開發人員的我們並不應該法盜用他人勞動成果,這篇文章只是為了讓大家更好的認識IL語言,以及IL語言模式的缺點與防御方式,讓大家能夠更改好的提高防范意識,本文並未真正深入到破解細節中去,僅起來點睛入門的作用,有興趣的同學可以自行深入去研究,win32下的逆向工程、加殼、脫殼等技術;
【【源代碼】】從此處獲取