WinForm的EXE破解(基於IL修改)


一、目的與目標

1.1 主題目的

  部門新人較多,希望通過本次分享讓同學們對以下知識點有個認識:

  • 破解原理
  • IL原理
  • 強簽名與加密
  • resx文件

   由於時間有限,本文作為部門分享演示過程中輔助性文檔,會對文中一些關鍵點列出參考學習的博客地址,供大家課后學習。

1.2 本次實戰最終要達到的效果

   本次實戰中所要達成效果如下圖:

1. 登錄時跳過,判斷是否注冊函數,直接進入業務操作模塊;

2. 修改logo大圖,改成其他圖片,如下圖所示;

clipboard_thumb11                 clipboard_thumb1  

                                圖一 破解前                                                             圖二 破解后(去掉登錄限制)

二、破解過程

  一個程序破解的過程,無論是.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()方法來判斷是否注冊;

clipboard_thumb13

圖四,反編譯后查看按鈕點擊事件

2.3. 使用ildasm將exe和dll 逆向成IL文件

2.3.1 使用ildasm 將exe反編譯為il文件並修改

      我們使用微軟官方提供了ildasm.exe來將.net程序反向成il文件

  1. 找到 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;

clipboard_thumb17

        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,反編譯后可以看到代碼變成下圖:

clipboard_thumb18

           4. 邏輯修改二,依然調用驗證。但是取消else代碼塊

                將139行注釋。注釋后可以參照方法2.3.2重新編譯生成exe。查看新的exe的源代碼如下:

clipboard_thumb21

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,如下圖:

clipboard_thumb22

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下的逆向工程、加殼、脫殼等技術;

【【源代碼】】從此處獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM