Как подменить ресурс?

Тема в разделе "WASM.WIN32", создана пользователем DruID, 1 июл 2005.

  1. DruID

    DruID New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2005
    Сообщения:
    20
    Есть прога - запакована неизветно чем (сигн. 6A 00 FF 15),

    Распаковывать не надо. Надо в ней подменить один Dialog, а при замене секции .rsrc криптор ругается, де "образ поврежден или заражен и тд.".

    Использую FindWindow, FindWindowEx, SendMessage или SetWindowText\GetWindowText, но моя прога должна постоянно висеть в памяти и ожидать наличие нужного окна, а там уже менять его. А хотелось бы сделать загрузчик, который после загрузки подменить этот ресурс и все.

    Как это сделат или какие WinAPI делают это (EnumResourceNames, FindResource, LoadResource...)?
     
  2. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    1) проникаем в процесс см. статью ms-rem

    дальше два пути

    2.1) findResource, lockResource, VirtualProtect и потом пишем свой ресурс на место старого - проверено работает

    но если станый ресурс >= чем новый

    2.2) хучим функции findresource, loadresoure? в общем те функции которые использует процесс и отдаём хендлы на свои ресурсы

    дерзай
     
  3. DruID

    DruID New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2005
    Сообщения:
    20
    Почитал, но что-то как-то не понял.

    Может примерчик по 2.1
     
  4. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    я на паскале писал
    Код (Text):
    1.  
    2. var source:TResourceStream;
    3. dest:TResourceStream;
    4. var oldprotect:cardinal;
    5. begin
    6. Dest:=TResourceStream.Create(HInstance,'VIDEOS_HTMl','#23');
    7. if not  VirtualProtect(Dest.Memory,Dest.Size,PAGE_READWRITE,@oldprotect)then
    8. if IsBadWritePtr(Dest.memory,Dest.Size) then raise exception.Create('badwriteptr');
    9. ZeroMemory(Dest.memory,Dest.size);
    10. source:=TResourceStream.Create(HInstance,'Videoindex_htm','#23');
    11. MoveMemory(dest.memory,source.Memory,source.Size);
    12. if Not virtualProtect(Dest.Memory,Dest.Size,oldprotect,@oldprotect)then
    13.  raise exception.Create('failed to restore protection');
    14.  




    в TResourceStream.Create делается

    findResource, lockResource
     
  5. DruID

    DruID New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2005
    Сообщения:
    20
    Big Thanx to staier!



    Все разобрался, работает, причем даже когда новый ресурс > старого!

    Теперь вот думаю, может ли это как-то повлиять на работу программы, погонял пока проблемс нет.

    Наверно все-таки по

    2.2) хучим функции findresource, loadresoure? в общем те функции которые использует процесс и отдаём хендлы на свои ресурсы

    придется делать, если кто-нибудь делал подобное подскажите последовательность действий(функций), а там я сам разберусь.
     
  6. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    тебе надо выяснить какую из функций использует target

    findresourcea

    findresourcew

    findresourceExA

    findresourceExW



    выяснить это можно с помощью отладчика

    и/или дизассемблера





    поставить на неё хук

    в хуке

    проверить , не ищется ли нужный тебе ресурс

    если нет то вызвать оригинальную функцию и вернуть управление target



    если это тот ресурс , который тебе нужен , ты

    ищеш свой ресурс и выдаёшь HRSRC на него



    всё...



    в xpsp2 например , все эти функции сводятся к вызову

    LdrFindResource_U - недокументированной функции

    можно ставить хук на неё, но придётся разбираться что там за параметры



    это можно сделать по исходникам wine