簡體   English   中英

用C ++加密/用x86解密

[英]Encrypt in C++ / Decrypt in x86

我的學校作業有問題。 任務是編寫一個變形的Hello World程序。 該程序將產生10個.com文件,打印“ Hello World!”。 執行時。 10個.com文件中的每個文件都必須與其他文件不同。 我了解變質與寡變與多態的概念。 我的程序當前創建10個.com文件,然后將機器代碼寫入文件中。 首先,我只寫了機器代碼來打印問候世界並對其進行了測試。 工作正常。 然后,我嘗試將解密例程添加到機器代碼的開頭。 這是我當前的字節數組:

#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))
BYTE pushCS = 0x0E;
BYTE popDS = 0x1F;
BYTE movDX = 0xBA;
BYTE helloAddr1 = 0x1A;
BYTE helloAddr2 = 0x01;
BYTE movAH = 0xB4;
BYTE nine = 0x09;
BYTE Int = 0xCD;
BYTE tOne = 0x21;
BYTE movAX = 0xB8;
BYTE ret1 = 0x01;
BYTE ret2 = 0x4C;
BYTE movBL = 0xB3;
BYTE keyVal = 0x03; // Encrypt/Decrypt key

typedef unsigned char BYTE;

BYTE data[] = { 0x8D, 0x0E, 0x01, 0xB7, 0x1D, 0xB3, keyVal, 0x30, 0x1C, 0x46, 0xFE, 0xCF, 0x75, 0xF9,
              movDX, helloAddr1, helloAddr2, movAH, nine, Int, tOne, movAX, ret1, ret2, Int, tOne,
               0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0D, 0x0D, 0x0A, 0x24 };

機器代碼的解密部分是“數據”的前14個字節。 該解密例程將獲取經過混淆的機器代碼字節,並通過使用與加密它們相同的密鑰對字節進行異或來解密它們。 我使用以下代碼加密我的C ++代碼中的字節:

for (int i = 15; i < ARRAY_SIZE(data); i++)
{
    data[i] ^= keyVal;
}

考慮到代碼從偏移量100開始,我已經一遍又一遍地驗證了我的尋址是正確的。我注意到的是,當keyVal為0x00時,我的代碼運行良好,並且我得到了10個打印Hello World!的.com文件。 但是,這對我沒有好處,因為0x00會使所有內容保持不變。 當我提供一個像0x02這樣的實際密鑰時,我的程序將不再起作用。 它只是掛起,直到我關閉DosBox。 關於此起因的任何提示都將有很大幫助。 我有一些有趣的垃圾插入計划(實際的變態部分),但在弄清楚此加密/解密問題之前,我不想繼續進行下去。

機器代碼的解密部分是“數據”的前14個字節。

對於(int i = 15; i <ARRAY_SIZE(data); i ++)

不匹配,因為在C ++數組中索引從0開始。

在數組中, data[15] == helloAddr1 ,這意味着您不加密data[14] == movDX元素。 仔細檢查應加密哪些元素,如果需要,請從i = 14開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM