[Delphi] Добавить/изменить ресурсы в чужом exe, dll

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RedFern.89, 17 Nov 2010.

  1. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    как такое реализовать?
     
  2. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Code:
    procedure patch_exe;
    var
    f: file;
    l: Longint;
    FileName, oldstring, newstring, s: string;
    begin
    oldstring := Что меняем;
    newstring := На что меняем;
    FileName := Имя файла;
    s := oldstring;
    AssignFile(f, FileName);
    Reset(f, 1);
    for l := 0 to FileSize(f) - Length(oldstring) - 1 do
    begin
    Application.ProcessMessages;
    Seek(f, l);
    BlockRead(f, oldstring[1], Length(oldstring));
    if oldstring = s then
    begin
    seek(f, l);
    BlockWrite(f, newstring[1], Length(newstring));
    end;
    Application.ProcessMessages;
    end;
    CloseFile(f);
    end;
    
     
    1 person likes this.
  3. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    что и на что менять?)

    Code:
    oldstring := Что меняем;
    newstring := На что меняем;
    
     
  4. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    537
    Likes Received:
    200
    Reputations:
    293
    Для этого тебе нужно знать что менять, в статье как создать билдер троя на vb Это было... кажись я видел эту статью на хакзоне...
     
  5. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    я пишу билдер фэйков)) сорсы естесственно выложу)) так что всем будет интерессно и ваша помощь имеет значние
     
  6. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот кусок кода: Писался столет назад, когда еще криптерами занимался Смысл кода - из одного файла взять занчек, в другой пнуть. т.е. непосредственно работа с ресурсами.
    Чтобы разобраться во всем почитай про функции
    BeginUpdateResource - открытие файла для изменения ресурсов
    UpdateResource - зама замена, удаление, добавление
    EndUpdateResource - закрытие

    Code:
    function szUpdateResource(hModule: THandle; lpszType: PChar;lpszName: PChar;hUpdate: Cardinal): BOOL; stdcall;
    var
     hRes,hResLoaded,nSizeOfRes:dword;
     pData:pointer;
    begin
     result:=true;
     if (NOT ALL_ICON) and (LOAD_ICON) then exit;
     hRes:=FindResource(hModule,lpszName,lpszType);
     hResLoaded:=LoadResource(hModule,hRes);
     pData:=LockResource(hResLoaded);
     nSizeOfRes:=SizeofResource(hModule,hRes);
     UpdateResource(hUpdate,lpszType,lpszName,0,pData,nSizeOfRes);
     FreeResource(hResLoaded);
     LOAD_ICON:=true;
    end;
    
    procedure AddResIcon(to_file:string;from_file:string);
    var
     hFile,hCopy:DWORD;
    begin
     hCopy:=LoadLibrary(pchar(from_file));
     if hCopy=0 then
      begin
       MessageBox(0,'ICON FILE OPEN ERROR','WARNING',MB_OK+MB_ICONINFORMATION);
       exit;
      end;
     hFile:=BeginUpdateResource(pchar(to_file),FALSE);
     LOAD_ICON:=false;
     EnumResourceNames(hCopy,RT_ICON,@szUpdateResource,hFile);
     LOAD_ICON:=false;
     EnumResourceNames(hCopy,RT_GROUP_ICON,@szUpdateResource,hFile);
     EndUpdateResource(hFile,FALSE);
     FreeLibrary(hCopy);
    end; 
    
     
    1 person likes this.
  7. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    slesh, а hModule - это указатель на файл? т.е. как передать ему файл? так?


    Code:
    hMod := LoadLibrary('c:\123.exe');
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Это если ты собираешься выдирать ресурсы из чужого файла. ТО его в оперативу загружай через LoadLibrary. В примере всё есть.
    Хотя лучше грузить через LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE
    это более безопасно и быстрее
     
  9. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Насколько я знаю стандартным апи нельзя добавлять новые ресурсы,можно только заменять только те что уже есть.
     
  10. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    Slesh, касательно той функции, что ты привел. Как задать имя ресурса? допустим я укажу тип: RT_BITMAP, а как ему имя задать? всеравно иконка не меняеца в файле((
     
  11. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    там же параметр pchar. Чаще всего ресурсы не по именам идут, а по номеру
     
  12. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    Вобщем, когда-то писал для таких же целей, прошу прощения за неграмотность :rolleyes:
    Code:
    procedure ReplaceRes(ResType, ResName, filename, replace:string; ResLang:integer);
    var
    FS: TFileStream;
    S,F: Cardinal;
    P: pointer;
    begin
    FS:= TFileStream.Create(replace,fmOpenRead);
    S:= FS.Size;
    GetMem(P,S);
    FS.ReadBuffer(P^,S);
    F:= BeginUpdateResource(pchar(filename),False);
    UpdateResource(F,pchar(ResType),pchar(ResName),ResLang,P,S);
    EndUpdateResource(F,False);
    Freemem(P,S);
    end;
    
    ResType, ResName, ResLang - думаю понятно :)
    filename - путь к экзешнику
    replace - путь к файлу, который выступает в роли заменяемого ресурса

    Итак, пример использования:
    Code:
    ..................
    begin
    .................
    ReplaceRes('Menu', '272', 'CCleaner.exe', 'c:\MyMenu.txt', 2057);
    .................
    end;
    .........................
    
     
    2 people like this.