Пишу патч на Ассемблере для программы, осталось только доделать процедура для запуска программы после её пропатчения. Вот код Код (Text): RunPath proc uses ebp invoke CreateProcess,addr szTargetFileName,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE or CREATE_SEPARATE_WOW_VDM,NULL,NULL, addr StartInfo, addr ProcessInfo invoke WinExec,addr szTargetFileName,SW_NORMAL xor eax,eax ret RunPath endp После выполнения этого кода патч выдает ошибку и пропатченая программа не запускается. Я думаю это и за того что, пока патч запусчин программа занята патчем. (Файл занят другой программой) Вопрос как освободить программу от патча.
жжошь, пишы исчо зависит от того, как ты открывал файл. Скорее всего, надо сделать CloseHandle подозреваю, что ты криво пропатчил и сам файл оказался битым, а не в этом коде ошибка тоже неплохо
Пишу.... Вот так, открываю вроде правильно. Код (Text): INVOKE CreateFile, ADDR szTargetFile, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL Где именно, надо, поставить CloseHandle? Код (Text): xor ecx, ecx lea eax, nOffsets lea edx, nNewBytes patch: pushad pushad INVOKE SetFilePointer, hTargetFile, 00525E53h, NULL, FILE_BEGIN popad add edx, ecx INVOKE WriteFile, hTargetFile, edx, 1, ADDR nBytesWritten, NULL invoke CloseHandle,eax popad inc ecx cmp ecx, SIZEOF nNewBytes je endpatch jmp patch endpatch: … Ставлю CloseHandle, после WriteFile, безуспешно программа всё равно занята патчем... Если не патчить, программу а просто проверить этот код без функции патча то он запускает программу патч программу правильно патчит, просто не выходит сделать так чтобы после, пропатчения, программы,программа ,не была, занята патчем. Именно и за этого патч, и не запускает программу. Если попытаться запустить программу когда патч работает, то Винда выдает ошибку "Файл занят другой программой",0_O... Спасибо, я знаю... P.s Может тут дело не только в CloseHandle...
INVOKE WriteFile, ... invoke CloseHandle,eax Функция WriteFile возвращает не Handle файла, а всего-лишь флаг успешности И вообще заведи нормальные переменные для Handle и др., а не парься с pushad, или используй то что api сами сохраняют значения регистров edi, esi, ebx, ebp.
ну это никак не свидетельствует о том, что патч сделан правильно вобщем, правильно тебе Y_Mur подсказывает
Y_Mur, MSoft, парни спасибо вам огромное!!! Мне нужно было указать для CloseHandle, hTargetFile, а не eax Вот код Код (Text): RunProgramm proc ,hWnd:HWND invoke CloseHandle, hTargetFile invoke CreateProcess,addr szTargetFileName,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE or CREATE_SEPARATE_WOW_VDM,NULL,NULL, addr StartInfo, addr ProcessInfo .IF EAX==0 INVOKE MessageBox, hWnd, ADDR szOpenErrorMsg, ADDR szOpenErrorTitle, MB_ICONERROR OR MB_OK .endif xor eax, eax ret RunProgramm endp Assembler Rules.....
затея запускать программу патчем не совсем здравая -- зачем каждый раз переписывать пропатченый файл ???
С чего ты взял, что я собираюсь переписывать пропатченый файл... Не совсем здравая идея это писать патч на Делфи. Я сделал так после того как нажата кнопка Path и Path, успешно отроботол после некоторых проверок, появляется Msg и user сам выберет запустить ему пропатченную программу иле нет.
я думал что все намного просще запустил patch.exe someprog.exe и на этом все, а у тебя там интерфейс и все такое ...