2014-10-04 44 views
-1

一切似乎工作正常,但我的代碼什麼都不做。 我想注入shellcode,它開始calc到記事本。Delphi代碼注入

這裏是我的代碼:

const 
    shellcode:array[0..124] of BYTE = (// exec of calc.exe 
    $fc,$e8,$44,$00,$00,$00,$8b,$45,$3c,$8b,$7c,$05,$78,$01,$ef,$8b, 
    $4f,$18,$8b,$5f,$20,$01,$eb,$49,$8b,$34,$8b,$01,$ee,$31,$c0,$99, 
    $ac,$84,$c0,$74,$07,$c1,$ca,$0d,$01,$c2,$eb,$f4,$3b,$54,$24,$04, 
    $75,$e5,$8b,$5f,$24,$01,$eb,$66,$8b,$0c,$4b,$8b,$5f,$1c,$01,$eb, 
    $8b,$1c,$8b,$01,$eb,$89,$5c,$24,$04,$c3,$5f,$31,$f6,$60,$56,$64, 
    $8b,$46,$30,$8b,$40,$0c,$8b,$70,$1c,$ad,$8b,$68,$08,$89,$f8,$83, 
    $c0,$6a,$50,$68,$7e,$d8,$e2,$73,$68,$98,$fe,$8a,$0e,$57,$ff,$e7, 
    $63,$61,$6c,$63,$2e,$65,$78,$65,$00,$00,$00,$00,$00); 

var 
    pi: TProcessInformation; 
    si: TStartupInfo; 
    ctx: Context; 
    remote_shellcodePtr: Pointer; 
    Written:Cardinal; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    FillMemory(@si, sizeof(si), 0); 
    FillMemory(@pi, sizeof(pi), 0); 

    CreateProcess(
    Nil, 
    PChar('notepad.exe'), 
    Nil, Nil, False, 
    NORMAL_PRIORITY_CLASS, Nil, Nil,      // NORMAL_PRIORITY_CLASS 
    si, pi); 

    ctx.ContextFlags := CONTEXT_CONTROL; 
    GetThreadContext(pi.hThread,ctx); 

    remote_shellcodePtr:=VirtualAllocEx(pi.hProcess,Nil,SizeOf(shellcode),MEM_COMMIT, 
    PAGE_EXECUTE_READWRITE); 

    WriteProcessMemory(pi.hProcess,remote_shellcodePtr,@shellcode, 
    Sizeof(shellcode),written); 
    ctx.Eip:=Integer(remote_shellcodePtr); 
    ctx.ContextFlags := CONTEXT_CONTROL; 
    SetThreadContext(pi.hThread,ctx); 

    ResumeThread(pi.hThread); 
end; 

也許是問題的CreateProcess。安全設置可以是CREATE_SUSPENDED | IDLE_PRIORITY_CLASS。 但是,這告訴我,它是未定義的。

+0

我不確定你的問題在這裏,但我猜這是「說我這是未定義的」部分。它有助於您在發佈**精確**錯誤信息時發生錯誤 - 您在該信息的正前方顯示該信息,因此沒有理由不將其包含在您的問題中,因此我們也有這個信息。 (如果這不是你遇到的問題,那麼請[編輯]你的問題,並更加清楚你的問題。) – 2014-10-04 22:54:20

+2

總是檢查Windows API函數的結果。你稍後會感謝你。 – 2014-10-04 22:58:14

+0

你的問題是什麼? – 2014-10-07 03:51:45

回答

1

IDLE_PRIORITY_CLASSCREATE_SUSPENDED在Windows單元中定義。要將它們兩者結合使用,請將它們組合在一起。

當大衛在評論中指出,到CreateProcess第二個參數需要修改的,所以你不能傳遞一個恆定的給它,而應該分配給一個局部變量,該變量調用UniqueString,然後用它來代替:

var 
    AppToLaunch: string; 
begin 
    AppToLaunch := 'notepad.exe'; 
    UniqueString(AppToLaunch); 

    CreateProcess(nil, PChar(AppToLaunch), nil, nil, False, 
       IDLE_PRIORITY_CLASS or CREATE_SUSPENDED, 
       nil, nil, si, pi); 
+0

非常感謝,但我也必須將notepad.exe更改爲rundll32.exe。 – 2014-10-05 09:11:36

+0

@kiss所以繼續前進,並做到這一點 – 2014-10-05 11:57:04

+0

@ken第二個參數CreateProcess需要可修改。不要傳遞存儲在只讀存儲器中的文字。分配給本地var並在其上調用UniqueString。 – 2014-10-05 11:57:58