軟件安全5.File infection(手動實現)

功能實現ios

hello world程序中注入代碼,實現正常顯示hello world並實現彈框。windows

因爲PEview不能編輯,故使用功能更強大的CFF explorer函數

1. 改變address of entry point爲新插入節所在的位置。
  • 記錄原先的address of entry point
    address of entry point
  • 添加新節empty space,軟件會自動改變文件的相應信息如numberofsectionssizeofimage
    添加新節
  • 複製新節的地址,將addressofentry改成它。
    這是程序正常執行後會跳轉到的地址
  • 保存後,將該節的屬性改成可執行。
    在最後一欄上右鍵選擇changeflagspa

    2. 用ollydbg添加這一新節的內容
  • 安裝ollydbg插件multimate assembler,下載地址:http://rammichael.com/downloads/multiasm.rar ,直接將對應版本.dll複製到ollydbg.exe文件所在目錄便可。
  • 點擊
    按鈕,程序會跳轉到不能前進爲止,這也是咱們添加的新節所在的位置。在該位置填寫咱們須要實現的功能,例如彈出messagebox
    須要填充的位置
  • 添加的彙編內容爲:
;彙編添加的位置
<0044D000>
push 10;messagebox的參數
push @caption
push @text
push 0; NULL
call 0x75F08860; messagebox進程的地址
jmp 0x00411046;返回原先的`addressofentry` 要加上imagebase 00400000
@caption:
    "end sector\0"
@text:
    "Team number:4; Team member:XXX\0"
  • 遺留的問題是,怎麼尋找messagebox函數的地址。因爲大部分軟件都會有界面,所以會調用user32.dll文件,於是能夠運行messagebox函數,從user32.dll中獲取地址的代碼以下:
#include<iostream>
#include<windows.h>
using namespace std;
typedef void(*MYPROC)(LPTSTR);
HINSTANCE LibHandle = LoadLibrary("user32");
MYPROC ProcAddr = (MYPROC)GetProcAddress(LibHandle, "MessageBoxA");
int main()
{
    cout << ProcAddr << endl;
    system("pause");
    return 0;
}
  • 插入代碼後:
    紅色爲新插入的代碼,此時按F8可進行步進調試(或按箭頭直接執行程序),若代碼正確,則會正確跳轉到messagebox函數,最終跳回本來的addressofentry
  • 選中新添加的代碼,右擊選擇copy,再點擊save file,保存到exe文件上。
    程序運行時,首先彈框:
    代碼注入成功 隨後正常運行。
相關文章
相關標籤/搜索