Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
... Да я искал когда дотка была запущена иначе как?
Код у меня длинный очень длинный в принципе там половина для find_pattern
get_module_info, get_executable_memory_regions, get_memory_regions, pattern_to_bytes, find_pattern
сначала проверь что у тебя сигскан работает на некоем тестовом корпусе с тестовым шаблоном(просто массив маленький сделай с байтиками и в своем же массиве ищи для теста, не трогая игру пока что), потом целиком ReadProcessMemory весь модуль(сразу несколько мегабайт, а не блоками) и там уже протести, и только потом с блоками извращайся если захочешь, и потом уже можешь по всей памяти поиск делать и т.д.; инкрементально разрабатывай по одному компоненты, тести и складывай их вместе по мере работоспособности а не всё сразу пиши.
я правда так и не понял в чем у тебя проблема, скриншоты скинь, подробнее опиши
Проверил адрес который выдает код на Memory View и они полностью идентичны но находяться в разных местах это что значит мне надо расширить сигну в верх и вниз?
ты количество "вещей" неправильно определяешь. это не одна вещь.
1) есть сам pattern matching, это не более чем поиск шаблона в корпусе(есть еще и другие алгоритмы кроме naive алгоритма, но не суть и его хватает впринципе)
2) в экстерналах там чтение чужой памяти, адресация в своем и чужом адресном пространстве и т.д.; в интерналах попроще
3) обработка результатов(ну найти то ты нашел, а дальше же еще надо доставать что тебе интересно из найденных инструкций)
4) ну и собственно можно еще проблему препроцессинга паттерна сюда добавить(из строки типа 12 34 ?? 78 разбиение на байты 12 34 00 78 и маску FF FF 00 FF)
это все разные и независимые вещи, просто для решения интересующих задач требуется применение сразу всех. это и не просто и не сложно, это цепочка из разных отдельных шагов которая в совокупности приводит к нужному результату, каждый шаг это отдельная подзадача, и их надо сначала по отдельности решать и только потом уже в одну цепочку собирать.
если примерно описать цепочку для экстернала, то:
копируешь себе весь модуль для простоты(из памяти доты в память свого процесса)
ищешь у себя в своей этой копии шаблон(получаешь позицию относительно начала того места где искал)(ну и препроцессинг паттерна можешь прикрутить перед этим, я не стал этого делать в примере)
прибавляешь полученную позицию к адресу модуля в адресном пространстве доты и получаешь адрес совпадения в пространстве доты
и дальше че угодно потом делаешь с этим адресом(например снова считываешь по нему из памяти доты)
Код:
match_alignment_fuzzy(addr, pattern, mask):
for i ∈ [ 0; pattern.size ):
if (addr[i] & mask[i]) != pattern[i]:
return false
return true
pattern_match_first_naive(input_start, input_size, pattern, mask):
alignments = (input_size - pattern.size) + 1
for i ∈ [ 0; alignments ):
if match_alignment_fuzzy(input_start + i, pattern, mask):
return i
return -1
mod_addr, mod_size = dota_process.get_module_info("client.dll")
my_local_copy_of_module = dota_process.read_memory(mod_addr, mod_size)
offset = pattern_match_first_naive(my_local_copy_of_module.ptr, my_local_copy_of_data.size, "\x12\x34\x00\x78", "\xFF\xFF\x00\xFF") //12 34 ?? 78
if offset == -1 error blahblahblah
result_in_dota_address_space = mod_addr + offset
alignment это место потенциально возможного совпадения(в naive каждый alignment проверяется)
на картинке их шесть штук(8-3+1) - на позициях 1,2,3,4,5,6; на позициях 7 и 8 чисто физически не может быть совпадений т.к. шаблон три символа, а осталось два и один символ соответственно
маска это для двоичного умножения(умножение на FF даст то же что и было т.е. ничего не делает, умножение на 0 дает 0)