2013-08-22 2 views
-2

저는 테스트 용으로 DLL Injection을 사용하는 프로젝트를하고 있습니다. 모든 것이 잘 작동한다면 아마도이 기술을 사용할 것입니다. 그러나 지금까지는 문제가 발생했습니다. 아마도 DLL 프로젝트를 처음 코딩하기 때문일 것입니다. 빨리 이해할 수 있도록 일시 중단 된 explorer.exe 프로세스를 만들고 일시 중지 된 탐색기 안에이 DLL을 주입합니다. 모든 것이 작동했지만 DLL에 타이머를 넣으려고 할 때 문제가 발생했습니다. DLL을 코드 봐 :DLL과 TTimer가 작동하지 않습니다.

uses 
    SysUtils, 
    Classes, 
    Windows, 
    ExtCtrls, 
    Dialogs; 

{$R *.res} 
type 
    TMyTimer = Class(TTimer) 
    public 
    procedure OnMyTimer(Sender: TObject); 
    end; 

var 
    MyTimer: TMyTimer; 

procedure EntryPoint(Reason: integer); 
begin 
    if Reason = DLL_PROCESS_ATTACH then 
    begin 
     MessageBox(0, 'DLL Injected', 'DLL Injected', 0); 
     MyTimer := TMyTimer.Create(nil); 
     MyTimer.Interval := 5000; 
     MyTimer.OnTimer := MyTimer.OnMyTimer; 
     MyTimer.Enabled:= true; 
    end 
    else 
    if Reason = DLL_PROCESS_DETACH then 
    begin 
     MessageBox(0, 'DLL De-Injected', 'DLL De-Injected', 0); 
    end; 
end; 

procedure TMyTimer.OnMyTimer(Sender: TObject); 
begin 
    MessageBox(0, 'Timer Running', 'Timer Running', 0); 
end; 

begin 
    DLLProc:= @EntryPoint; 
    EntryPoint(DLL_PROCESS_ATTACH); 
end. 

가 좋아을, 그래서 일시 중단 된 Explorer.exe에서 프로세스의 DLL을 주입 할 때, 나는 'DLL 주조'는 메시지가 나타납니다 ...이 후, 타이머와 매 5를 만들어야합니다 몇 초 만에 'Timer Running'이라는 메시지가 나옵니다. 그러나이 메시지를받지 못했고, 모든 것을 시도했지만 아무것도 작동하지 않았습니다 ... 어떤 도움이 필요합니까? 그게 완전히 엉망 이냐, 뭐야?

+0

힌트 :'EntryPoint'에'DLL_THREAD_DETACH'로 사례를 넣으십시오. –

+1

당신이 "모든 것"에 포함시키는 것을 열거하십시오. –

+0

모든 것이 : 일시 중지 된 explorer.exe 프로세스를 작성하고 DLL을 삽입하여 DLL을 삽입하십시오. 삽입 됨 .... – user1526124

답변

4

Delphi TTimer 개체는 Win32 SetTimer API 함수를 둘러싼 느슨한 래퍼입니다. VCL 래퍼는 숨겨진 창을 만든 다음 SetTimer를 호출하여 해당 창을 전달합니다. 그러면 타이머가 SetTimer를 호출 한 스레드의 메시지 큐에서 WM_TIMER 메시지를 합성하여 Windows에서 실행됩니다. 시나리오의 경우 해당 스레드는 사용자가 만든 원격 스레드입니다. 따라서 타이머 이벤트가 실행 되려면 해당 스레드에 메시지를 디스패치해야합니다.

일반적으로 나는 주입 된 DLL 안에 VCL을 넣는 지혜를 묻습니다. 확실히 고통 스러울 것입니다. VCL for 타이머가 필요한 경우 SetTimer를 직접 호출하는 것이 더 간단합니다.

더 자세히 알고 싶으면 다른 스레드를 만들어야한다고 조언합니다. 현재 모든 주입 코드가 DllMain에서 실행 중입니다. 주제에 대한 DllMain과 Raymond Chen의 기사를 읽으십시오. 특히 DllMain이 DLL 로더 잠금이 유지 될 때 실행되는 부분을 설명합니다. DllMain에서 아무 것도하지 말아야합니다. CreateThread를 호출 할 수 있습니다. 그렇게하지 마세요.

+0

나는 다음과 같은 것을 시도하고있다 : 만약 Reason = DLL_PROCESS_ATTACH이면 begin MessageBox (0, 'DLL Injected', 'DLL Injected', 0); SetTimer (0, 0, 3000, @DoTimer); '끝; 내 DoTimer 절차는 다음과 같습니다 : 'procedure DoTimer; begin MessageBox (0, 'Timer Running', 'Timer Running', 0); end; ' Timer Running에서 메시지 상자를받지 못했습니다 .... – user1526124

+0

물론 아닙니다. 당신은 근본적인 문제를 파악하지 못했습니다. 메시지 펌프가 없다. 그리고 당신은 DllMain에 대한 조언을 무시했습니다. DllProc에 새 스레드를 만들어야하고 그 스레드에서 모든 코드를 넣어야합니다. 거기에서 메시지 펌프를 실행해야합니다. GetMessage (...)가 시작하는 동안 알 수 있습니다. TranslateMessage (...); DispatchMessage (...); 종료; –

+1

@user -'stdcall'과 적절한 콜백을 사용해야 할 때도 있습니다 (TimerProc 참조). 어쨌든 적절한 구현 세부 사항에 들어가기 전에 SetTimer를 호출 한 직후에 어떻게 될지 생각해보십시오. 결과는 다음과 같습니다. 실행은 'EntryPoint'의 'end'에 도달하고 바로 그 후에 원격 스레드가 dll에서 분리됩니다. 그래서 어떤 스레드에서 타이머 proc를 호출 할 것인가? 아마도 [뒤로] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684841%28v=vs.85%29.aspx)에서 다시 시작해야합니다. –

4

TTimer는 Window Messages에 의존하므로 메시지 루프가 필요합니다.

+0

Uhmmm, 죄송하지만 정확히 무슨 뜻입니까? 예를 들어 진입 점에없는 절차 내에서 타이머를 생성해야합니까? – user1526124

+0

아니요, 그는 타이머가 작동하기 위해 메시지 펌프에 의존한다는 것을 의미합니다. 이 DLL에 메시지 펌프가 없으면 작동하지 않습니다. –

+0

dll에서 타이머를 수행하기 위해 인터넷을 통해 본 모든 예제는 정확히 다음과 같습니다. 메시지 펌프 란 무엇입니까? 어떻게 할 수 있습니까? 죄송합니다. 실제로 이것이 무엇을 의미하는지 모르겠습니다 ... – user1526124