2017-08-26 116 views
0

我想知道是否有任何衆所周知的技術來爲應用程序聲明代碼流。在我的情況下,我想用我自己的字節碼來執行我爲項目寫的一個虛擬磁盤。我非常有興趣試圖消除字節碼的流動,以瞭解這種技術。我通過inet進行了搜索,很少或根本沒有關於它的信息。技術來破壞代碼流?

乾杯。

+1

這個問題非常具體,我不明白爲什麼它被擱置。這當然總是一個關卡的問題(任何事情都可以用足夠的努力來打破),但是如果你的代碼使用你自己的虛擬機,那麼在我看來你已經開始相當安全了。讓事情變得更加複雜的一個想法是用你的語言來實現另一個虛擬機,並且通過運行在虛擬機中的這個虛擬機來執行關鍵部分(一開始;-))。我在第一次翻譯的時候做了類似這樣的事情,但最終我被一個硬件快照(這是關於蘋果的複製保護)擊敗了。 – 6502

回答

1

我曾在一個項目(幾年前)混淆了Flash ActionScript代碼以破壞逆向工程和安全遊戲的嘗試。每次有人加載遊戲時,我們都會製作一個混淆閃光燈的工具。

實際的混淆是在VM模型上完成的,它基於以下簡單模式,您必須根據虛擬機的特定字節碼定義這些模式。對我們來說,最難的部分是編寫Flash格式的讀寫器,然後將實際的代碼字節轉換爲帶參數的字節碼助記符。但是,一旦你在那裏,這很容易。

您查找具體說明,然後將其替換爲出現的不同指令。例如。一些標準的代碼看起來是這樣的:

load_to_stack 100 
:label_01 
do_something 
get_from_stack 
decrement 
put_to_stack 
jump_if_non_zero label_01 

然後有一兩件事你可以做的是,一旦你找到一個代碼行,說你jump_if_non_zero <label>更換符合jump to <end of code>並在代碼的最後你加jump_if_non_zero label_01。這將導致在代碼結束時出現多個條件跳轉,並在其他地方直接跳轉。

還有更多可以做的事情,比如用add 100代替add 99; increment,以及類似的其他數學運算。

然後你可以找到有條件的跳轉和反轉條件,點跳轉到文件結尾(按照上面的技巧),並無條件地將必要的跳轉作爲下一條指令。喜歡的東西

​​

更改

jump_if_zero :new_label_at_end 
jump :forward 
:additional_label 
do_something 
:forward 
[.....] 
:new_label_at_end 
jump :additional_label 

技巧像上面的代碼混淆的一個反編譯大的時間。而且你可以獲得更多的創造性,這實際上是虛擬機中的各種指令,並且你願意讓你的混淆器複雜化,並且接受由於附加操作而產生的代碼可能會慢一些。

希望這會有所幫助。