Перейти к содержанию

uhx

Пользователи+
  • Постов

    325
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Весь контент uhx

  1. В общем-то да, именно этим и стоит заняться. Тут я полностью согласен, никто за тебя твой код дебажить не будет, поэтому вперед. Проверь, рисуются ли у тебя ВООБЩЕ линии. Правильно ли ты ее рисуешь? Судя по тому, что надпись пропадает/появляется, то дело именно в линии, поэтому копай в ее сторону. Почему ты не выставляешь ее толщину? line->SetWidth( 1.0f ); Где ты вообще создаешь ID3DXLine? Короче, странный ты. Говоришь и в то же время пишешь, что надпись-таки верно отображается. Так на кой нам твой W2S, если он верно работает? У тебя что не рисуется то, линия? Значит ее и проверяй. Почему мы должны гадать - не пойму. Просто проверь свой код хоть как-то... смысл тут кучу тем уже плодить вокруг одного. Возьми исходники чужие, благо их полным полно, и сверься, проверь тот код, посмотри на свой, сравни и тд.
  2. Да, конечно. Прежде чем скидывать, я его прогнал сам у себя. Ну а по сути да, в C++ не особо важно как делать. Можно просто объявлять через struct name, и потом заводить как name *pName; PS только щас догнал, что у себя в проекте я тоже копирую матрицу
  3. Это я посоветовал так сделать, чтобы читать матрицу сразу по указателю, а не копировать ее в свой массив. Насколько я понимаю, запись с typedef эквивалентна такому: /* typedef struct D3MATRIX { float m[4][4]; } *PD3MATRIX; */ struct D3MATRIX { float m[4][4]; }; typedef D3MATRIX *PD3MATRIX; Тем более, в случае с typedef ты можешь вообще опустить имя структуры, но назначить ей псевдоним (*PD3MATRIX). Я часто встречал такую запись в тех же хедерах winnt, поэтому уже привык к такой записи. Да и в Си она позволяет опускать слово struct при объявлении переменной. PS переведите в гугле слово typedef xD
  4. пляяя Я просто показал пример использования. Раз уж на то пошло, то принтф может куда угодно выводить, хоть в файл, только перенаправь поток и все. И консоль тоже можно включить: AllocConsole().
  5. Да не, просто вариант без лишней переменной. Забудь. Все верно: начинается с нуля. Лучше используй вариант с обычным указателем, не надо ничего копировать.
  6. Да и зачем вообще тебе ее КОПИРОВАТЬ? Ты можешь сделать просто указатель на эту самую матрицу и брать напрямую из нее значения, не копируя ничего. typedef struct D3MATRIX { float m[4][4]; } *PD3MATRIX; PD3MATRIX viewMatrix; ... viewMatrix = (PD3MATRIX)( engine_dll + v_matrix_on ) ... printf( "%.2f", viewMatrix.m[0][0] );
  7. http://www.cplusplus.com/reference/cstdio/sprintf/ LPCSTR это же обычный const char* ViewMatrix[i][j] = (engine_dll + v_matrix_on) + ( j + i * 4 ) * 4;
  8. Истинно так. VsosniyAntiCheat бдит и банит все и вся!!1!1
  9. Нет. Таких мимолетных лагов не должно быть, уж поверь) Тут parthoftheworlD прав, это скорее всего копия, которая иногда содержит что-то другое. Можешь попробовать на основе ее значений поискать другую, такую же.
  10. Да, похоже на нее. Это может не от матрицы зависит, а что то другое?
  11. Почему у тебя матрица 5х4?? Да и судя по значениям - это не она. Похожа, да, но не то. https://gamehacklab.ru/topic/5726-csgo-поиск-видовой-матрицы-сигнатура/ Я тут примерно описал, как она выглядит.
  12. Это не видовая матрица же... Ты ее хоть раз видел вообще? Ты понимаешь что ты ищешь, или нет? Плюс тебе уже partoftheworlD ответил какой адрес брать.
  13. Я не буду здесь объяснять, что такое видовая матрица и для чего она нужна - для этого есть специальные книжки и статьи (раз, два) Обычный Step-by-Step гайд с пояснениями. Искать будем в Counter-Strike: Global Offensive, но в принципе подойдет и любая другая игра. Никаких консольных команд для облегчения поиска использовать я не буду, дабы способ мог пройти в любой другой игре. Значит так, сначала цепляемся к процессу игры, затем устанавливаем параметры поиска: Scan Type: Value between... Value Type: Float Почему именно так? Дело в том, что точное значение искать довольно рискованно. Во-первых, флоат вообще довольно неточная штука, а во-вторых - мы не знаем точного угла нашей камеры. Например, в csgo угол наклона (pitch) варьируется от -89.0 до 89.0 градусов , а в других играх может и прямой угол получаться, т.е. 90 градусов. Теперь опускаем камеру до упора вниз, так что наш угол наклона получится 89 градусов. По идее, в видовой матрице это значение отобразится как ~0,999, но мы все равно будем искать диапазон. Ну а теперь выставляем диапазон: от 0.9 до 1.1 и сканируем Нам тут же нашло овер9000 значений, но ща мы их отсеим. Камеру до упора вверх и сканим теперь следующий диапазон: Оп-па. Теперь значений осталось всего-ничего: 521. Нет, это конечно много, но не настолько. Можно конечно по приколу отсеить те значения, что изменились за время чтения данной строки, но тут может поджидать сюрприз: в некоторых играх камера может немного "ходить" туда-сюда. Но если вы уверены в том, что она статична, то флаг вам в руки. Сейчас осталось только и делов: отсеить весь хлам, ну а дальше будем смотреть на найденное и анализировать. Можно так же до упора туда-сюда камеру водить, но я сделал так: направил ее примерно параллельно земле и прожал скан от -0.2 до 0.2. После пары-тройки дополнительных сканов у меня осталось примерно 60 значений. Многовато для ручного перебора, но я знаю, что мне нужны только "зеленые", т.е. статические адреса. Пролистав чуть ниже, я тут же натолкнулся на целый ряд таких значений: Выносим все эти ячейки в список адресов и начинаем их перебирать: ПКМ по первому же адресу -> Browse this memory region ( Ctrl + B ) Выставляем тип отображаемых значений на float, чтобы проще было наблюдать за всеми значениями матрицы. ПКМ -> Display Type -> Float ( Ctrl + 9 ) Смотрим на первую матрицу: На всю матрицу у нас должно быть только 3-4 больших значения и все они должны быть в одной колонке. Ну или так: каждое четвертое значение имеет большую величину. Желательно сразу их выровнять по 4 колонке. Остальные значения находятся в диапазоне от 0 до +-1.33 Тут мы видим, что она явно какая-то не такая: Nan-значения, остальные нули и тд. Но даже если она выглядит более-менее правдиво, то достаточно подвигать туда сюда камерой ( + побегать! ), чтобы убедиться в том что это не она: только два значения меняются, а остальные статичны. По идее меняться должны все значения, кроме одного в первой строке, оно скорее всего будет равняться нулю. Дальше увидите. Проделываем те же действия с другими матрицами: оцениваем их визуально + меняем состояние камеры в игре и смотрим на значения. Просматривая вторую и третью матрицы я заметил, что между ними есть участок памяти, который наиболее активно изменяется при движении/изменении углов камеры. Фиолетовым я выделил адреса второй и третьей матрицы, а между ними зеленым - интересующий участок. Как видите, здесь есть 4 довольно больших значения ( на фоне других ) и одно из них (0x1F97E26C) остается неизменным. Но в других играх оно может немного меняться: оно отвечает за угол поворота ( по часовой ). Это в тех играх, где камера туда-сюда наклоняется, например, при передвижении пресонажа, но оно в таком случае все равно не будет сильно большим. Теперь выделяем предполагаемое начало матрицы, жмем ПКМ->Add this to address list и копируем адрес. Теперь Ctrl + G и переходим по скопированному адресу. Смотрим: Ба! Выглядит отлично. Значения не сравнивайте между скринами, за это время я немного подвигал камеру опять, поэтому они изменились. Ну, оффсет для статического адреса сделать вообще не сложно: берем адрес матрицы и вычитаем из него базовый адрес модуля: 0x1F97E264 - client.dll = 0x4A7E264 Если все еще не понятно, как таки найти view matrix, то можете посмотреть видеоурок от Guided Hacking: https://www.youtube.com/watch?v=-WL1Gpe9VRo Ну, так как во многих обновляемых играх, особенно в кс, оффсетам свойственно меняться, а каждый раз искать по новой эту матрицу не очень хочется, то можно сделать сигнатурку. По ней мы будем автоматически вытаскивать наш оффсет из исполняемого кода. Точнее даже не оффсет, а уже конкретный адрес. Добавляем первое значение нашей матрицы в список адресов и ставим бряк. Тут же ловим кучу инструкций, которые взаимодействуют с нашей матрицей: Берем самую первую и смотрим: Это похоже на какой-то метод класса матрицы, который может использоваться не только нашей матрицей, но и другими. Что-то типа оператора присвоения. Если поставить бряк на эту инструкцию, то можно в этом убедиться: в регистр ecx попадает не только "наш" адрес, но и куча других. Что же делать? Все просто: будем "раскручивать" цепочку вызовов функций. Ставим Breakpoint ( F5 ) на инструкцию push ebp. Это начало функции. Затем ПКМ по ней же и выбираем "Set/Change break condition" и выставляем фильтр на брейкпоинте, чтобы он остановился когда функция будет работать с нашей матрицей. Тут, конечно же, адрес вашей матрицы вместо моего. И в тот же миг "ловим" наш поток. Смотрим на регистры и на стек: В регистре ecx наша матрица, стек разворачиваем на "полную" и видим такую картину: Это адрес функции, которая нас вызвала. В чем суть вообще того, что мы сейчас делаем? Все дело в том, что нам надо выйти на ту единственную функцию, которая работает ТОЛЬКО с нашим адресом. Т.е. там, где все начинается. Там же, вероятно, мы и сможем узнать откуда игра берет адрес этой матрицы и мы сделаем сигнатурку. Значит так, теперь снимаем наш брейкпоинт и прыгаем по адресу из нашего стека: client.dll + 67379B Отлично. Что мы видим? А, ну это соответственно тот самый вызов функции, из которой мы пришли. Можно тут так же поставить брейкпоинт и убедиться, что функция всё так же работает с несколькими матрицами. Так, а с каким регистром-то у нас там работали инструкции? С ecx, точно. Смотрим буквально на пару строк выше и видим инструкцию: lea ecx, [edi+00000284] Похоже, тут в наш регистр загружается адрес матрицы. Хм, а сама матрица тоже лежит в какой-то структуре, адрес которой лежит в edi. А значит теперь нам надо искать ту инструкцию, которая загружает в регистр edi адрес 0x1F97DFE0. Это уже адрес нашей структуры, т.е. ( 0x1F97E264 - 0x284 ). Теперь ищем по нему. Прокрутив в самый верх функции можно увидеть, что в edi значение перекладывается из регистра ecx. client.dll+673740 - 55 - push ebp client.dll+673741 - 8B EC - mov ebp,esp client.dll+673743 - 81 EC 80000000 - sub esp,00000080 client.dll+673749 - 56 - push esi client.dll+67374A - 57 - push edi client.dll+67374B - 8B F9 - mov edi,ecx Теперь делаем то же самое, что и в предыдущий раз: брейкпоинт (на push ebp), condition, и прыгаем на предыдущую функцию. Тут наблюдаем такую картину: Фигассе, сказал я се. Приехали, значение вытаскивается из стека) Можно попрыгать по функции и найти когда значение пушится в стек, но мне лень, поэтому я просто прокрутил функцию в самый верх и не прогадал: поставив бряк на начало функции я тут же поймал в ecx прежний адрес структуры, которую мы пытаемся выследить. Но эта функция все еще работает с каким-то адресом помимо нашего, поэтому раскручиваем дальше: те же действия, прыгаем на предыдущую функцию. Тут такая же ситуёвина, все делаем точь в точь, пока не наткнемся на ту самую функцию, где у нас бряк будет ловить в регистре только наш адрес. А вот и она: Думаю, тут все ясно. Мы поймали разрабов с поличным: адресок-то прямо вот он, в ecx кладется. Двойной клик по строчке чтоб увидеть полный адрес: client.dll+1F2C68 - B9 E0DF971F - mov ecx,1F97DFE0 А вот и адрес нашей структуры. Дело за малым, выделяем кучку инструкций для того чтобы составить уникальную сигнатуру, по которой мы сможем найти в дальнейшем этот участок кода. Получаем такую строчку: B9 E0 DF 97 1F 50 6A 00 6A 03 83 EC 08 8D 45 DC F3 0F 11 44 24 04 F3 0F 10 45 F8 F3 0F 11 04 24 И теперь "замазываем" наш адрес, который после перезапуска игры 100% поменяется. B9 ?? ?? ?? ?? 50 6A 00 6A 03 83 EC 08 8D 45 DC F3 0F 11 44 24 04 F3 0F 10 45 F8 F3 0F 11 04 24 Все, сигнатура готова. У меня примерно так выглядит всё в коде: pViewMatrix = (D3DXMATRIX*) CEngine::FindPattern( "client.dll", "B9 ?? ?? ?? ?? 50 6A 00 6A 03 83 EC 08 8D 45 DC F3 0F 11 44 24 04" ); if( pViewMatrix ) { pViewMatrix = (D3DXMATRIX*)( *(DWORD*)( (DWORD) pViewMatrix + 1 ) + 0x284 ); } Да, не забываем, что это адрес СТРУКТУРЫ, но не матрицы. Матрица имеет своё, внутреннее смещение по структуре: 0x284. Сканер сигнатур сами как-нибудь сделаете, это уже к кодингу относится Да и на самом деле, эту сигнатуру можно использовать даже в CE.
  14. Просто посмотри какой-нибудь урок по нахождению видовой матрицы. Почему ты по столбцу только считаешь их? Как бы значения идут слева-направо.
  15. Хоспадее, да переключи ты режим отображения на Float. ПКМ -> Display Type -> Float. Ну или просто Ctrl + 9 Да, просто экраном вверх-вниз. Я искал значение между 0.9 и 1.1. Потом поднимал экран вверх и искал между -1.1 и -0.9, потому что там угол ~89 максимальный, проще промежуток искать, все равно левак отпадет на 2-3 скане.
  16. Вот как она примерно выглядит: Она должна при прямых углах отображать твои координаты камеры, поэтому X и Y позиции должны быть видны в ней. Как у меня: -113 в матрице и 113 в позиции. 159.38 в матрице и -159.38 ну и тд... + у нее статический адрес, но она слетает обычно после апдейтов. Практически всегда. То, что у тебя - это похоже не то. Я сейчас буквально за 15 минут нашел матрицу + сигнатуру под нее, а то надоело что после апдейтов слетает. Могу какой-то гайдец запилить, хотя об этом уже столько сказано было... шо капец
  17. А зачем тебе ReadProcessMemory, если ты уже в процессе игры? Взял и нарисовал все значения на экране. ID3DXFont->DrawTextA Нет, такого нет. У разработчиков и так все исходники перед лицом, они легко могут эту матрицу использовать, какая им разница в каком месте она лежит. Вообще, тебе следовало бы взяться сначала за что-то одно: либо асм (реверс), либо цпп. Судя по твоим вопросам ты ни там ни там не разбираешься, а учить тебя всем особенностям C++ вряд ли кто то захочет - информации и без того полно.
  18. Флаг тебе в руки. Но ты хотя бы пробовал посмотреть, что тебе выдает GetTransform на выходе? Я не знаю почему так, не знаток DX и все такое, но через GetTransform ты не достанешь видовую матрицу. Ты думаешь всем по приколу мучаться и искать оффсет на нее? Типа все так делают, потому что оффсеты - это круто?) Через DX можно разве что при помощи GetVertexShaderConstantF достать ее, но там тоже придется танцы с бубном устраивать, поэтому какого-то уникального решения нет, потому что в каждой игре по своему хранится эта видовая матрица, и приходится постоянно ее выискивать. Тут пару дней назад до тебя тоже человечек один писал по этому поводу, тык. Дело в том, что GetTransform возвращает единичные матрицы, а при помощи них ты никаких преобразований не получишь) Сам только что проверил в CS:GO. Слева GetTransform, справа - через оффсет.
  19. По моему это так не работает. Лучше сам найди матрицу.
  20. Перебором)) А лучше просто найди ручками видовую матрицу и сделай классический W2S, без D3DXVec3Project, а то я думал что ты через константы нашел их, поэтому такой код предложил. Сам как-то так делал.
  21. А что тебе собственно еще то нужно? О_о
  22. Да, но не забывай про DirectX. Ты говоришь сейчас про так называемый режим окна "Fullscreen Windowed". Это обычное окно во весь экран без рамок, и тут возможно рисовать свой external оверлей, ибо винда обрабатывает каждое окошко. А есть Fullscreen. Чувствуешь разницу? Нет? Я пока тоже. Ну так вот, при инициализации DirectX ты скармливаешь ему параметр Windowed. Если оно равно false, то такое понятие как "окно" исчезает. У тебя даже Alt-Tab не будет работать без необходимой процедуры. Я так понимаю, на этом этапе DirectX меняет графический режим на свой (единственное что нашел), и, как ты уже понял, в таком режиме он рисует только своё окно и на то что в Windows маячит еще несколько окон ему вообще пофигу, он даже не отвлекается на них. Думается мне, что тут даже GDI не встревает в такой момент, что позволяет достичь значительного прироста FPS. Соответственно, что нам остается? Пральна, внедрится в какую-нибудь функцию отрисовки фрейма DirectX, и тут у нас рождается internal оверлей. PS вообще как там графический режим работает и что-куда переключается я толком сам не знаю. Я вообще в графике не шарю почти Так, порылся чутка в инете, нашел вот ту штуку на msdn, думаю она тут рулит.
  23. Так как задача выходит за рамки "найти значение", то тут придется пореверсить. Нужно хотя бы немного понимать как оно там работает и прыгать туда-сюда по инструкциям. На самом деле задача непростая) Что за игра хоть? Ой.. увидел. Path of Exile. На самом деле я сам пытался ее как то пореверсить, но нифига не вышло) Там неплохой скилл нужен. На гитхабе есть какой то хак под пое, посмотри. Но там жесть)
  24. Да, я в курсе. Вообще у них конечно другое предназначение, чем просто "разбиение, чтоб не месить в один файл" Я думал здесь именно на модули и разбита игра, ибо не знал что CE способен вытаскивать подобную инфу, думал он только функции из экспорта подписывает. В таком случае все это можно вытащить через какой-нибудь .NET Reflector. PS IDA Pro как-то очень стремно этот код на шарпе дизассемблирует))
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.