AdvApiHook под 64x (InjectDLL)

Тема в разделе "WASM.X64", создана пользователем H1nt, 15 окт 2006.

  1. H1nt

    H1nt New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    3
    Код (Text):
    1. Function InjectDll(Process: dword; ModulePath: PChar): boolean;
    2. var
    3.   Memory:pointer;
    4.   Code: dword;
    5.   BytesWritten: dword;
    6.   ThreadId: dword;
    7.   hThread: dword;
    8.   hKernel32: dword;
    9.   Inject: packed record
    10.            PushCommand:byte;
    11.            PushArgument:DWORD;
    12.            CallCommand:WORD;
    13.            CallAddr:DWORD;
    14.            PushExitThread:byte;
    15.            ExitThreadArg:dword;
    16.            CallExitThread:word;
    17.            CallExitThreadAddr:DWord;
    18.            AddrLoadLibrary:pointer;
    19.            AddrExitThread:pointer;
    20.            LibraryName:array[0..MAX_PATH] of char;
    21.           end;
    22. begin
    23.   Result := false;
    24.   Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
    25.                            MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    26.   if Memory = nil then exit;
    27.   Code := dword(Memory);
    28.   Inject.PushCommand    := $68;
    29.   inject.PushArgument   := code + $1E;
    30.   inject.CallCommand    := $15FF;
    31.   inject.CallAddr       := code + $16;
    32.   inject.PushExitThread := $68;
    33.   inject.ExitThreadArg  := 0;
    34.   inject.CallExitThread := $15FF;
    35.   inject.CallExitThreadAddr := code + $1A;
    36.   hKernel32 := GetModuleHandle('kernel32.dll');
    37.   inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
    38.   inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
    39.   lstrcpy(@inject.LibraryName, ModulePath);
    40.   WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
    41.   hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
    42.   if hThread = 0 then exit;
    43.   CloseHandle(hThread);
    44.   Result := True;
    45. end;
    При вызове функции в Win2003x64 - она возвращает FALSE. Выход из функции происходит по условию "hThread = 0". Подскажите в чем может быть проблема? Реально ли использовать эту функцию под x64? Возможно ли внедрять 32х разрядную DLL в 64х разрядный процесс?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Нет.

    После коррекции - да.
     
  3. H1nt

    H1nt New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    3
    Спасибо за ответ.
    Я так понимаю необходимо скорректировать только запись Inject и её заполнение?
     
  4. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    И еще применить язык позволяющий компилировать 64 битный код.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    PE386
    А в делфи последних версий нет x64?
     
  6. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Насколько я знаю, нет (и теперь врядли когда-нибудь появиться).
     
  7. H1nt

    H1nt New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    3
    GetLastError выдаёт Access is Denied (функция CreateRemoteThread). Не могу понять почему это происходит... Ведь по идее надо во внедряемом коде только указатели заменить на 64х разрядные (т.е. дописать к ним старшие нулевые 4 байта). Подскажите где я не прав.