2012-11-10 31 views
0

爲了說明這一點,是的,這是一個項目,用於從外部控制可執行文件。不,我沒有任何惡意的意圖,這個項目的最終結果無論如何都不會有用。我正在使用32位XP安裝的cygwin寫這篇文章。在c中寫入跳轉指令

我需要做的是將COM文件的前幾位改爲跳轉指令,以便在執行時跳轉到COM文件的最後。我查看了彙編程序手冊來查找該命令的字節數,以便我可以用C語言對其進行硬編碼,但沒有運氣。

第一個問題:我可以用C做這個嗎?在我看來,我可以在任何COM文件的開頭插入OpCodes,以便它可以執行該文件而不是COM文件。

第二個問題:有人知道我在哪裏可以找到OpCodes的資源,以便我可以將它們插入到我的文件中?或者,有沒有人知道跳轉指令的字節數?

如果您對此的真實性有任何疑問,請隨時詢問。

+1

在您的平臺上添加更多細節。你真的是指一個16位的DOS「COM」文件嗎?如果是這樣,說明從文件的第一個字節開始。只需在那裏插入你的跳轉,然後解析你的指令,就可以在你的存根中重新創建它,或者只是希望它不重要。你想達到什麼目的? –

+0

是的,我的意思是一個16位的DOS「COM」文件。但是我問的是「插入你的跳躍」的具體情況。這是我無法弄清楚的。你有具體的嗎? – user912447

+1

你有沒有試過Google搜索「x86指令集」? –

回答

1

Intel® 64 and IA-32 Architectures Software Developer Manual Volume 2A Instruction Set Reference解釋了JMP指令的編碼(實模式是IA-32的子集)。

對於一個16字節的附近跳轉(在當前代碼段內),您將使用0xE9,然後使用相對偏移量跳轉到。如果跳轉是COM文件的第一個字節,那麼偏移量將與地址0x103有關 - COM文件的第一條指令總是加載在地址0x100處,跳轉與3字節跳轉後的指令有關。

0

請注意,首先您的程序必須具有操作系統,ABI和機器指令集。 (例如,它不會在Linux/x86-64或Linux/PowerPC下運行)

您可以將機器指令作爲字節序列寫入C。你必須寫哪些字節(即適當的跳轉指令的編碼)留給你!

當然,這不是便攜式C.但基本上你可以做一個memcpy與一些適當的源字節區。

也許像asmjitGNU lightning這樣的圖書館可能會激勵你。

你可能不能直接使用它們,但研究它們的代碼可以幫助你。

另請參見x86維基百科頁面的更多參考。

+0

感謝您的回覆。然而,你說的那部分是我留下的,正是我所要求的。查找這些字節的資源。例如,X86手冊是否會提供這些信息?我不認爲它確實如此,但我希望能夠糾正。 – user912447

+0

當然,Intel x86指令集手冊確實有這些信息,GNU Lightning和asmjit也都提供這些信息。維基百科頁面直接給出了提供這些信息的鏈接。 –

+0

我對如何從C/C++生成彙編代碼(asmjit和GNU Lightning)會給我跳轉指令的OpCodes感到困惑。在我看來,這是相反的方向,我需要知道如何在C中寫入跳轉以獲得程序集的輸出。 – user912447

1

在XP上應該有debug.exe。只需啓動它,開始用'a'
類型jmp ff00編寫代碼,如果相應的十六進制轉儲未顯示,dis/[u]將結果與'u'組合。