eXeL@B —› Вопросы новичков —› Вопрос про WriteProcessMemory Delphi7 |
. 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 03 ноября 2019 19:08 · Личное сообщение · #1 Здравствуйте, уважаемые пользователи. Помогите мне решить невнятную проблему. Объясню суть, имеется программа, написанная на c#, мне необходимо изменить всего лишь один байт в памяти этой программы при её работе. Для изменения памяти я использую функцию, которую использовал очень часто: Code:
Всё работает, байт меняется. НО есть одно НО, через время работы программы на ПК возникает ошибка "На компьютере не достаточно памяти", следом идут всяческие ошибки с закрытием этой программы. Но суть в том, что если эту программу перезапустить и сделать тоже самое, эта ошибка появится уже очень скоро, через минут 5 работы. Складывается такое ощущение, что память забивается непонятно где и не освобождается при закрытии этой программы. Однако, если не менять этот байт, программа успешно может работать и 48 часов без перебоев. Также я заметил, что если изменить этот байт через CheatEngine - всё также хорошо работает. Вопрос, в чем проблема возникает? Проверяется на х64 системе. Прошу мне помочь. |
|
Создано: 03 ноября 2019 19:31 · Личное сообщение · #2 |
|
Создано: 03 ноября 2019 19:35 · Личное сообщение · #3 |
|
Создано: 03 ноября 2019 19:44 · Личное сообщение · #4 |
|
Создано: 03 ноября 2019 19:46 · Личное сообщение · #5 Есть вариант VirtualProtectEx убрать на всякий случай, ибо Code:
Аргумент 4 это NewAccessProtection, и 40 это: Code:
И раз с читенжин проблем нет, может быть имеет смысл посмотреть как он это делает. ----- 2 оттенка серого |
|
Создано: 03 ноября 2019 19:51 · Личное сообщение · #6 Могу написать полностью, как происходит "патч". Code:
В ProcessID находит ID нужного процесса. Именно такой же адрес и на такой же байт и делается замена в CheatEngine. Повторюсь, там это проходит правильно. |
|
Создано: 03 ноября 2019 20:12 · Личное сообщение · #7 |
|
Создано: 03 ноября 2019 20:25 · Поправил: wladimir55 · Личное сообщение · #8 Хорошо, напишу всю функцию и с поиском этого адреса, но думаю дело не в этом, потому что имеется и другой способ, с установкой хука, где происходит немного иначе, но проблема остаётся та же, но сначала хотел работаться с этой проблемой. Code:
HexBytes - массив байт для поиска. Адрес находит правильно, тот же самый что находит и CheatEngine. Добавлено спустя 12 минут Напишу функции из Windows.pas: function VirtualProtectEx(hProcess: THandle; lpAddress: Pointer; dwSize, flNewProtect: DWORD; lpflOldProtect: Pointer): BOOL; external kernel32 name 'VirtualProtectEx'; function VirtualProtectEx(hProcess: THandle; lpAddress: Pointer; dwSize, flNewProtect: DWORD; var OldProtect: DWORD): BOOL; stdcall; overload; function WriteProcessMemory; external kernel32 name 'WriteProcessMemory'; function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; stdcall; Быть может в них что-то поменялось? Всё-таки Delphi 7 |
|
Создано: 03 ноября 2019 20:40 · Поправил: Kindly · Личное сообщение · #9 а что у тебя в @oldProtect? там же должно VirtualAlloc вызываться перед VirtualProtect. на асме помню вставку писал: Code:
----- Array[Login..Logout] of Life |
|
Создано: 03 ноября 2019 20:45 · Личное сообщение · #10 |
|
Создано: 03 ноября 2019 20:49 · Личное сообщение · #11 |
|
Создано: 03 ноября 2019 21:20 · Поправил: Kindly · Личное сообщение · #12 wladimir55 пишет: Не понимаю для чего там VirtualAlloc. в моем инлайне надо было так oldProtect получить для VirtualProtect, но я после записи не устанавливал атрибуты обратно и присваивал им сразу ERW, а у тебя чтоли античит атрибуты проверяет, раз ты обратно после записи пытаешься чето присвоить? oldProtect должен быть PDWORD, как-то так: PDword(@oldProtect)^ В отладчике уверен что все правильно исполняется? wladimir55 пишет: и всё работало отлично, правда это было на Windows 7. Сейчас же программа другая, не игра даже, и Windows 10... SReg пишет: тут же не форум гадалок. ----- Array[Login..Logout] of Life |
|
Создано: 03 ноября 2019 21:26 · Личное сообщение · #13 |
|
Создано: 03 ноября 2019 22:31 · Личное сообщение · #14 |
|
Создано: 03 ноября 2019 22:39 · Личное сообщение · #15 |
|
Создано: 03 ноября 2019 22:56 · Личное сообщение · #16 |
|
Создано: 03 ноября 2019 23:00 · Личное сообщение · #17 wladimir55 Совершенно очевидно что твой кривой гавнокод не освобождает память которую усиленно выделяет в твоем кривом гавно цикле где ты успешно продемонстрировал непонимание работы try/finally, а заодно отсутствие базовых знаний языка ибо только идиот будет использовать для boolean переменной string. | Сообщение посчитали полезным: d745150 |
|
Создано: 04 ноября 2019 00:37 · Личное сообщение · #18 Проблема в том, что проблема в не том, как я ищу... Если я использую поиск на CheatEngine, а в программе указываю адрес, а она делает MemWrite - происходит тоже самое. Поэтому я и скинул изначально именно его, потому что ошибка где-то там Добавлено спустя 2 минуты Я прошу помощи. А меня обвиняют только в гавнокоде, по сути, который не имеет значения к проблеме. Но вы успешно пытаетесь выставить меня идиотом. |
|
Создано: 04 ноября 2019 00:43 · Личное сообщение · #19 |
|
Создано: 04 ноября 2019 01:14 · Личное сообщение · #20 |
|
Создано: 04 ноября 2019 06:13 · Поправил: Alchemistry · Личное сообщение · #21 |
|
Создано: 04 ноября 2019 07:45 · Поправил: UniSoft · Личное сообщение · #22 |
|
Создано: 04 ноября 2019 08:29 · Личное сообщение · #23 |
|
Создано: 04 ноября 2019 08:37 · Личное сообщение · #24 |
|
Создано: 04 ноября 2019 09:15 · Личное сообщение · #25 ClockMan пишет: а ошибка 100% и за GetMem.... Сомневаюсь... Я не спец в Delphi, но если бы столкнулся с проблемой, то просто бы посмотрел в отладчике. Но в данном коде вот какие косяки я вижу: FreeAndNil(); для строк, зачем? Delphi сама их удалит корректно. RAD 10.3 вообще падает при вызове FreeAndNil(); со строкой. FreeMem(Buf); Оператор "exit" не значит просто покинуть функцию, код же обернут в try..finally, и что получаем, двойной вызов: FreeMem(Buf); FreeAndNil(HexBytes); CloseHandle(ProcessHandle); Весь код, что лежит в finally будет выполнен, не смотря на Exit |
|
Создано: 04 ноября 2019 10:12 · Личное сообщение · #26 |
|
Создано: 04 ноября 2019 10:26 · Поправил: Kindly · Личное сообщение · #27 у тебя как и сказали: Code:
не высвобождается, потому что если условие не выполняется: Code:
то у тебя Code:
которое не выполнится, тебе нужно впихнуть в exception для выгрузки. у тебя два try, что позволяет использовать костыль exception и finally одновременно. дело вкуса, но лучше юзать AllocMem, вместо GetMem, которая выделяет память с мусором. возврат делай булевым, либо на крайний случай числовым, если необходимо больше разных типов состояний и далее в case обертуй со своими строками там. и вообще кодес кривой, ошибки остаются. ----- Array[Login..Logout] of Life |
|
Создано: 04 ноября 2019 11:35 · Личное сообщение · #28 Да там сплошное UB в его кодесе, можно прикопаться практически к любой строке, лютый мемори лик, цикл который отрабатывает неопределенно большое количество раз, в котором идиот сначала переводит число в строку, и в следующей же строчке переводит его обратно из строки в число, некорректные сравния с ляпами от незнания языка итд. Это настолько аутично что этой теме место на помойке, либо можно дальше глумится над ленивым ТС и его потугами получить что-то ничего не делая. |
|
Создано: 04 ноября 2019 12:34 · Личное сообщение · #29 |
|
Создано: 04 ноября 2019 12:37 · Личное сообщение · #30 |
. 1 . 2 . 3 . >> |
eXeL@B —› Вопросы новичков —› Вопрос про WriteProcessMemory Delphi7 |
Эта тема закрыта. Ответы больше не принимаются. |