Предистория: Я нашел программу InLocate (раньше RapidTranslation), она типа позволяет делать on-the-fly, Посмотрел, позволяет, НО не ресурса, а только текста и только для Menu, Dialog, String. Я понимаю в ней используется FindWindow, FindWindowEx, SendMessage SetWindowText, GetWindowText и др. аналогичные. Так, что реально InLocate, не подменяет ресурс. Так вот, вопрос: Есть ли программы и готовые решения, которые будут подменять любой ресурс на лету? Типа есть программа zzz.exe c всякими ресурсами (Menu, Dialog, String, RCData, HTML, XML, SPLA, BIN и др), для нее создаем отдельный файл ресурсов, назовем его zzz_mod.dll (где эти же ресурсы, только подправленные). Далее запускаем zzz.exe, видимо через какой-то launcher.exe, который заставляет zzz.exe брать ресурсы не из себя, а из zzz_mod.dll. Если таких готовых программ - нет, то возможно ли реализовать это на практике?
Надо, для программ с всякими защитами от модификаций, а также для запакованных\закриптованых и тд. знаю, пользуюсь и не только им.
ну ладно идея такая делаешь стаб для длл то есть экспортишь все функции которые она экспортирует. в неё записываешь ресурсы нужные тебе при вызове фенкций пренаправляшь их на исходную dll
staier У него ресурсы уже в ехе. Тут нужно подгружать dll со своими ресурсами и подставлять в функции ресурсов вместо hModule ехе hModule подгруженной библиотеки.
Нашел решение, надо перехватывать и подменять FindResource или LoadResource, щас буду думать как это сделать...
Сделал, но почему-то не работает, мож где-то ошибка??? Делал так: Создаю процесс, внедряю длл, в ней хуки на FindResourceA и LoadResource. Дальше в длл: ... Handle:=LoadLibrary('mod_res.dll'); //здесь ресурсы ... function NewFindResourceA(Instance: THandle; Name, ResType: PChar): THandle; stdcall; ... begin Modres := TrueFindResourceA(Handle, Name, ResType); Result := TrueFindResourceA(Instance, Name, ResType); end; ... function NewLoadResource(Instance, ResInfo: THandle): THandle; stdcall; begin if Modres=0 then Result:= TrueLoadResource(Instance, ResInfo); else Result:= TrueLoadResource(Handle, Modres); end; ... В итоге выдается ошибка "Stream read error", в чем дело не пойму.