小議異或演算法實現外殼加密的程式設計

來源:互聯網
上載者:User

 

摘要:對於目前的軟體行業來說,加密的目的只是爭取儘可能長的時間內不被解密,在這段時間內收回開發投資並開發產品的新版本。用外殼法可以對Windows下的可執行檔進行加密,本文利用異或演算法對檔案的關鍵代碼節來實現了這種加密,防止通過使用Soft-ice或者其他的調試軟體來對程式進行反組譯碼,阻止分析來源程式,以此來實現對軟體的保護。
關鍵詞:加密  外殼  異或演算法  附加程式碼片段
0 引言
電腦軟體產品是一種知識密集的特殊產品,生產一個軟體產品需要大量的人力物力,生產難度大,成本高,周期慢。但是,軟體產品的複製卻是相當的容易。這就導致了非法複製、盜版軟體之風的泛濫。加密是目前保護智慧財產權的一種有效方式。但任何加密軟體都可能被破譯、我們不能因噎廢食。加密與解密,是矛和盾的關係,要想防止被解讀,必須提高加密技術。
1 外殼加密法
在windows平台下的加密系統是一個對windows核心的探索,軟體加密技術一般應該包括四個方面:防拷貝、防篡改、防跟蹤和防解讀。本文主要解決其中的一個問題——防解讀,即防止通過使用Soft-ice或者其他的調試軟體來對程式進行反組譯碼,阻止分析來源程式,以此來實現對軟體的保護。
對windows下的可執行檔加密可採用外殼加密法,它是直接處理待加密軟體,在原軟體的外面罩上一層“外殼”,這層外殼在原軟體運行前先得到執行,從而達到加密的目的。這種方法實現起來相對困難,需要清晰瞭解windows可執行檔的格式,而且還要解決外殼與原軟體之間的串連問題,但如果採用了進階的反跟蹤與變形技術,經加密後的軟體不僅操作絲毫不用改變,而且還有很好的保密性。
“外殼”的意思就是給可執行檔檔案加上一個殼。它是一段特殊的小程式,其作用是對dos下的可執行檔進行壓縮,壓縮後的檔案一般只有原來的一半大小,但執行起來毫無困難。就是給原來的程式加了個殼,使用者執行的實際上是這個外殼程式。而這個外殼程式負責把使用者原程式在記憶體中解開壓縮,並執行解開後的真正的程式。由於一切工作都是在記憶體中運行,使用者根本不知道也不需要知道其運行過程。
採用的加密方法是外殼式的,主要目的就防止靜態分析。
所謂靜態分析就是使用反組譯碼軟體(如W32dasm,unasm等等),對可執行檔本身進行反組譯碼。它反組譯碼的結果是按照檔案中的指令代碼直接翻譯而來的。
2 用異或演算法實現外殼加密
外殼式就是加密軟體把一段代碼附加到執行程式上,並把程式入口指向附加的代碼中。在此之前,我們先用一段程式對代碼節,這個關鍵的節進行加密。當被加密的程式裝入記憶體之後,附加代碼首先執行,它是一個解密模組,通過附加代碼對加密的模組進行解密,恢複原程式,並轉入原來的程式中執行。但是,當有人試圖通過靜態分析的方法,對程式進行閱讀和修改時,他們只會得到一個加密後的密文。這就是因為我們已經對關鍵的節(Section)進行了加密處理,這樣,原程式完全可以抵禦如W32dasm這樣的功能強大的反組譯碼軟體的靜態分析。但外殼程式並不能保證不被反組譯碼軟體的動態分析和修改,這是由其特殊的作用和反跟蹤的脆弱性所決定的。
加密的核心代碼主要是用win32彙編來完成的。我們先建立一個緩衝區,再把代碼節的內容作為字串讀入緩衝區,在緩衝區中進行異或,將異或後的資料寫入寄存器。我們還將產生一個新的檔案,作為我們加密後的檔案,所以,我們用FileStream.Writebuffer的方法將修改後的檔案頭和程式碼片段寫入一個新的檔案。
現在,通過自己的加密模組,已經對原檔案作出了一些修改,其中最大的改動就是對程式碼片段的異或。現在的程式碼片段已經是一段密文,但是如果就這樣的話,原程式是無法直接啟動並執行,那麼也失去了軟體保護的意義了。為了讓程式正常運行,就一定要先解密,再運行。所以,就需要修改原程式的入口地址,讓加密後的軟體先執行我們的解密模組。在PE檔案中,我們只需要把AddressOfEntryPoint指向我們自己的附加程式碼片段,讓附加程式碼片段先執行就達到了目的。
異或演算法加密的主程式如下:
procedure xorcode(const paddress:dword;const count:integer);
  begin
    asm
      push esi
      push edi
      push ecx
      push ebx
      mov ecx,count
      mov ebx,paddress
@l2:  mov ah,[ebx]
      xor ah,0ffh                  //逐個位元組與一個值異或
      mov [ebx],ah
      inc ebx
      dec ecx
      cmp ecx,0
      jne @l2
      pop ebx
      pop ecx
      pop edi
      pop esi
    end;
  end;
異或代碼節主程式:
with FNTHeaders.Sections[i] do
  begin
      if i=0 then                        //如果是第一個節(代碼節)則異或
        begin
           ppecodebuffer:=AllocMem(SizeOfRawData);
mov(Dword(Pointer(FFileBase+VirtualAddress)),DWord(ppecodebuffer),SizeOfRawData);
xorcode(DWord(ppecodebuffer),sizeofrawdata);
         NewFile.Position := PointerToRawData;
         NewFile.WriteBuffer(ppecodebuffer^,SizeOfRawData);
        end
        else
          begin                                  //除代碼節外的節全部複製
            NewFile.Position := PointerToRawData;
            NewFile.WriteBuffer(Pointer(FFileBase + VirtualAddress)^,SizeOfRawData);
          end;
  end;
其中有自訂一個函數mov,如下:
procedure mov(const Src:Dword;const Dest:Dword;Count:Integer);   //移動並異或
  begin
    asm
      push esi
      push edi
      push ecx
      mov esi,Src
      mov edi,Dest
      mov ecx,Count
      rep movsb
      pop ecx
      pop edi
      pop esi
    end;
  end;
通過運行這個加密程式,就把一個檔案最重要的一個塊,就是的每個檔案都必須有的代碼節.text(或稱Code)進行了加密。
本程式實現了對Windows NT下的可執行檔的加密,基本上可以滿足在一般場合下的程式加密需要。因此,由本程式加密產生的可執行檔可以防止非法使用者對原程式的直接修改和靜態分析。
   [聲明]:本文由《中華論文網》網收錄,僅供論文寫作研究參考使用之,著作權屬原作者所有。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.