+ Reply to Thread
Results 1 to 10 of 10

Thread: Чудеса да и только, или как инжектить сторонний код в explorer.exe

  1. #1
    DJ1hAD0's Avatar

    Bug Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Здравствуйте!
    Я пишу программу на FASM, учусь инжектить код своей длл в explorer.exe. Проблема в том, что моя программа бсодит при попытке выполнения CreateRemoteThread. Логи говорят что была попытка выполнения кода по адресу 0000000. Атрибуты области памяти в процессе - RWE. Однако контекст процесса рушится и EIP почему-то обнуляется.
    OllyDBG 1.01 восторгается настолько, что намертво виснет при попытке трейсить эту функцию. Битый час пытаюсь найти инфу по проблеме в гугле, пока безуспешно. Подскажите хотя бы, в каком направлении нужно мыслить:)
    Система WinXP SP3 5.1.2600

    Вот, собственно, исходник:
    Code:
    format	 PE GUI 4.0
    entry	 start
    include 'win32a.inc'
    
    RemoteCodeStart:
    
        call .delta
       .delta:
        pop   ebp
        sub   ebp, .delta
    
    metka:
    
       lea	 eax, [ebp+mylib] 
        push  eax ;имя модуля для LoadLibraryA
        call [ebp+pLoadLibraryA]
        push eax;возвращенное значение-хендл моей библиотеки
        lea   eax, [ebp+nameproc];имя моей экспортируемой функции hello
        push  eax;толкаем его в стек
        call  [ebp+pGetProcAddress]
        call eax;вызываем функцию hello из моей либы
    .thrend:
        push  0
        call  [ebp+pExitThread]
        ret
    
    pLoadLibraryA		 dd  0
    pGetProcAddress           dd  0
    pExitThread		         dd 0
    mylib                          db 'Mylib.dll',0
    nameproc                    db 'hello',0
    RemoteCodeEnd:
    RemoteCodeSize equ RemoteCodeEnd-RemoteCodeStart
    
    
    start:
         mov eax,[LoadLibraryA]
         mov [pLoadLibraryA],eax;указатели
         mov eax,[GetProcAddress]
         mov [pGetProcAddress],eax
    
    
        invoke  FindWindow,szWndName,0;ищем окно эксплорер.ехе
        mov     [hWnd],eax
    
        invoke  GetWindowThreadProcessId,[hWnd],ProccessID;определяем пид
        mov     [ThreadID],eax
    
        invoke  OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,eax,[ProccessID]
        mov     [hProcess],eax;открываем процесс с правами записи
    
        invoke  VirtualAllocEx,[hProcess],0,RemoteCodeSize,MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
        mov     [RemoteThreadBaseAddress],eax;выделяем блок памяти
    
        invoke  WriteProcessMemory,[hProcess],eax,RemoteCodeStart,RemoteCodeSize,Writed;пишем туда свой код
    
        invoke  CreateRemoteThread,[hProcess],0,0,[RemoteThreadBaseAddress],0,0,RemoteThreadID;запускаем его. тут крашится наша программа , при попытке ;отладить код внутри експлорера все бсодит. в логах пишет, что ошиблась при попытке выполнения кода по адресу 0000000. 
    
        ret
    
    RemoteThreadID		      dd ?
    Writed			      dd ?
    hWnd			      dd ?
    szWndName		      db 'Shell_TrayWnd',0
    hProcess		      dd ?
    ThreadID		      dd ?
    ProccessID		      dd ?
    RemoteThreadBaseAddress       dd ?
    
    section '.idata' import data readable writeable
     library kernel32,'KERNEL32.DLL',\
    	  user32,'USER32.DLL'
    
      include 'api/kernel32.inc'
      include 'api/user32.inc'
    Вот исходник инжектируемой либы (дельфи, мать ее за ногу:) :

    Code:
    library mylib;
    
    uses
      SysUtils, Classes;
    
    function hello;
    begin
      MessageBoxA(0,'Inject OK!','test',MB_OK);
    end;
    
    exports hello name 'hello';
    
    begin
    end.
    P.S. Я нуб, пинайте аккуратно, пожалуйста

  2. #2
    keyst0rke's Avatar

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Для начала можно просто запустить удалённый поток.

  3. #3
    DJ1hAD0's Avatar

    Default

    Quote Originally Posted by 0_o View Post
    Для начала можно просто запустить удалённый поток.
    можно с этого места подробнее? Вероятно, я чего-то недопонял, но именно на этом-то этапе все и падает.

  4. #4

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Система 64-битная?

  5. #5
    DJ1hAD0's Avatar

    Default

    Quote Originally Posted by space View Post
    Система 64-битная?
    32битная

  6. #6

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Это код для code injection, dll инжектируются по другому

    Перед вызовом CreateRemoteThread добавь:

    Code:
    HANDLE hKernel32 = GetModuleHandleA("kernel32.dll");
    HANDLE hLoadlib  = GetProcAddress(kernel32, "LoadLibraryA");
    и поправь
    Quote Originally Posted by DJ1hAD0 View Post
    invoke CreateRemoteThread,[hProcess],0,0,[RemoteThreadBaseAddress],0,0,RemoteThreadID
    на
    Code:
    invoke  CreateRemoteThread,[hProcess],0,0,*hLoadlib*, *адрес полученный с VirtuallAllocEx*, 0, RemoteThreadID
    А вообще, отлаживай код на любом другом, не системном процессе.
    Last edited by ximera; 13-10-2013 at 22:50. Reason: У нас для кода существует тег специальный, пользуйтесь не стесняйтесь ;-)

  7. #7
    DJ1hAD0's Avatar

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Спасибо за поправки! Правда пока ничего не заработало, но на некоторые нюансы мне глаза открылись
    А вообще, отлаживай код на любом другом, не системном процессе.
    В любые другие приложения все нормально инжектится, а вот именно эксплорер все равно вываливается. Даже с учетом ваших поправок в коде.
    Last edited by DJ1hAD0; 14-10-2013 at 07:38.

  8. #8

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Что-то я невнимательно в первый раз прочитал листинг...

    Записать в процесс нужно только одну строчку - путь до длл(c:/path/to/dll), соответственно и выделять память только под эту строчку и с правами readwrite, после этого вызвать удаленный поток который выполнит функцию LoadLibraryA с аргументом-строкой, которая и записывалась в процесс.
    То есть нужно подправить аргументы в 2 функциях:
    Code:
    VirtualAllocEx
    WriteProcessMemory
    Все что должно выполниться после загрузки длл нужно писать в инициализирующей функции длл(не знаю как на делфи это будет выглядеть, гугл в помощь) или, на худой конец, после загрузки длл создать еще 1 или несколько удалённых потоков, которые будут выполнять функции из этой длл
    Code:
     
    HANDLE hMyDll = GetModuleHandleA("имя импортируемой длл");
    HANDLE hMyFunc  = GetProcAddress(hMyDll, "имя функции в длл");
    CreateRemoteThread(hProcess, 0, 0, hMyFunc, 0, 0, RemoteThreadID)
    Last edited by space; 14-10-2013 at 13:21.

  9. Пользователь сказал cпасибо:
    DJ1hAD0 (22-10-2013)
  10. #9

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Получается что я пытаюсь не исправить ошибку в первом решении, а написать другое решение, впрочем для инъекции длл оно как раз лучше подходит...

  11. 2 пользователя(ей) сказали cпасибо:
    DJ1hAD0 (22-10-2013) Dark Koder (22-10-2013)
  12. #10
    DJ1hAD0's Avatar

    Default Re: Чудеса да и только, или как инжектить сторонний код в explorer.exe

    Разобрался :) Нашел на youtube тутор по инжекту длл, немного покумекал над основной концепцией и все получилось! Спасибо всем, кто советовал и/или хотя бы просто участвовал душой :)
    P.S. space , чувак спасибо за нужные заметки :)
    Last edited by DJ1hAD0; 22-10-2013 at 11:26.

+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:31
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org