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

roma912

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

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

  • Посещение

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

    7

Сообщения, опубликованные roma912

  1. 4 часа назад, Vlad2 сказал:

    Спасибо помог) 

    Только не могу разобраться, как изменить заголовок, который идет по умолчанию "Content-Type". 

    Пробовал и так и сяк, получал исключение.

    Вроде он меняется как request.addfield(Content-Type, value);
    Или же в самом запросе request.post(link, postdata, ValueofContentType);

    Какой-то из 2х методов, сейчас не помню

  2. 21 минуту назад, Garik66 сказал:

    Да уж!;) 

    И тут 

     

    У ТС бабах и желание учиться совсем отпало.

    Ну эта игра не особо подходит для поиска указателей т.к. все адреса там и так зеленые статичные
    Да если и захочет научиться, то возьмет другую игру и попробует заного сам
    (И Weapon* я не проверял на отвал после перезапусков, но он по значению был довольно близко к адресу значения текущего кол-ва патрон на оружии)

     

     

  3. Если хочешь быструю скорость передвижения
    Ищи int или float
    По типу - Ходьба = 1
    Зажал шифт, ищешь увеличившиеся значения и так по кругу
    Потом уже пишешь скрипт

    А с полетом можно делать изменения координат на c++ с биндом на определенные клавиши

  4. 9 минут назад, Senpai сказал:

    А мне надо без обводки. Крч, координаты клиентской области

    Вычитай значит просто толщину этой рамки и все. Оно будет статично, что на win7, что на win10
     

    • Плюс 1
  5. 1 час назад, partoftheworlD сказал:

    Знания не подвластные простому смертному. И только избранный сможет найти описание функции, и правильно использовать её.

    Особенно когда это древнее знание лежит на первой полке всемирной книги знаний ?

  6. Начну с общего, что будет полезно для каждого

    Реверсинг определенной функции

    (Объясню, допустим нашли структуру в любой игре, неважно чего (Персонаж, техника или пр.) , потом вышли на метод использующий эту структуру. 

    Так вот интересен твой ход мыслей в восстановлении самого метода в IDA) 

    Так сказать ход мыслей, рассуждения, догадки и выводы

    Игра на твой вкус

    Данная статья помогла бы находить более интересные поля, методы и пр. 

  7. Предположение 1: Игра на юнити? Если да, то лучше взламывать такие иначе 

    Предположение 2: Зачем тебе указатель если ты хочешь сделать скрипты, делай изменения в самом методе

    Предположение 3: Опять же, если все что выше не помогает (что очень врятли), делай скрипт который будет выносить динамичнский адрес структуры в метку се

  8. 7 минут назад, Garik66 сказал:

    ИМХО -инструкция работает не только с нужным адресом, нужен фильтр.

    @roma91212 а  просто так (без eax) пробовал?:

    Аналогично, что использую регистр, что не использую. Также все засоряется элементами и вылет
    Ну а сам адрес работает только с моим адресом, проверил

  9.  

    А что если значение переменной обычный счетчик срабатывания кода? При достижении определенного количества срабатывает сборщик мусора.

    По сути он и должен срабатывать, однако после лимита в 2047 начинается краш вместо очистки

  10. Интересный баг при использовании Rapid Fire script

     

    Под скриптом переменная которая получается отвечает за количество fx элементов
    Ну даже если ее заморозить соответсвенно все равно перегрузится

    Очень странно что переполняется количество fx элементов и буфер cmd

     

    Сам скрипт (врятли что-то даст в данной ситуации)

     

    Спойлер
    
    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat
    
     
     
    aobscanmodule(Rapid,iw4sp.exe,8B 41 28 89 85 EC 01 00 00) // should be unique
    alloc(newmem,$1000)
    
    label(code)
    label(return)
    
    newmem:
    
    code:
      mov eax, 0
      mov [ebp+000001EC],eax
      jmp return
    
    Rapid:
      jmp newmem
      nop
      nop
      nop
      nop
    return:
    registersymbol(Rapid)
    
    
    
    [DISABLE]
    Rapid:
      db 8B 41 28 89 85 EC 01 00 00
    
    unregistersymbol(Rapid)
    dealloc(newmem)

     

     

    Console log: 

    Спойлер

    G_WriteGame 'autosave\favela_escape' 'AUTOSAVE_LEVELSTART'
    Writing savegame "AUTOSAVE_LEVELSTART" to file "save\autosave/favela_escape.svg".
    Done writing savegame "AUTOSAVE_LEVELSTART".  Time to write: 2 ms
    Com_TouchMemory: 0 msec. Using sum: -554166749
    Com_TouchMemory: 0 msec. Using sum: -554166749
    Com_TouchMemory: 0 msec. Using sum: -554166749
    too many existing special models (more than 128)
    too many existing special models (more than 128)
    FX_BOLT_LIMIT(255) exceeded - not spawning bolted effect
    FX_BOLT_LIMIT(255) exceeded - not spawning bolted effect
    FX_ELEM_LIMIT(2048) exceeded - not spawning fx elem
    too many existing special models (more than 128)
    MAX_PACKET_USERCMDS
    MAX_PACKET_USERCMDS


    G_Spawn: no free entities

     

  11. 36 минут назад, srg91 сказал:

    Круто!

    Я просто чуть-чуть добавлю, для улучшения стилистики кода на будущее.

     

    Вместо классов с публичным модификатором доступа (class + public:) можно использовать struct:

      Показать контент
    
    
    struct Vector3
    {
    	float x;
    	float y;
    	float z;
    };
    

    struct - тот же класс, только он public по умолчанию

     

    Очень советую больше использовать auto, тогда многие вещи превращаются в лаконичное:

      Скрыть контент
    
    
    auto Entity = reinterpret_cast<LocalPlayer*>(TemporaryObject);
    
    
    auto pPlayer = reinterpret_cast<LocalPlayer*>(player);
    
    
    auto i = EntityList.find(TemporaryObject);

     

     

    Простые структуры прекрасно инициализируются:

      Скрыть контент
    
    
    Vector3 entityPos = {
      TempEntity->pPosition->pos_x,
      TempEntity->pPosition->pos_y,
      TempEntity->pPosition->pox_z
    };
    

     

     

    Да и переменные в структуре можно указать в одну строку:

      Скрыть контент
    
    
    struct Vector3
    {
    	float x, y, z;
    };
    

     

    Писать class в таких местах не обязательно:

      Скрыть контент
    
    
    struct Actors
    {
    	char pad_0000[64]; //0x0000
    	LocalPlayer* pLocalPlayer; //0x0040
    }; //Size: 0x0044

     

     

    И не используйте в C++ C-подобные приведения типов (как (float)1), как минимум можно записать это как 1. 

    Если где-то ошибся, пишите, пожалуйста :)

     

    Все правильно да. За чистотой кода конечно не следил
    А так да, спасибо за замечания, постараюсь в следующий раз сделать немного лучше чем в данный 

     

    // Я больше не буду ставить  "В угол"       за нарушение пукта правил 1.8.

    Спойлер
    1. При ответе на какой-либо пост необходимо цитировать только ту часть, на которую дается ответ, но не все сообщение целиком. Это делается для того, чтобы не приходилось проматывать громадные портянки цитат больших сообщений.

    И править пост за Вас тоже. Garik66

  12. 4 минуты назад, JustHack сказал:

    Нууу, если уж это статья для профи, то задам пару непонятных мне (рачишке) вопросов.

    1. Как восстановить
      
      virtual bool ProjectToScreen(float ptx, float pty, float ptz, float *sx, float *sy, float *sz); //
      
    2. Что делает этот код
      
      static SSystemGlobalEnvironment* Singleton()
      	{
      		return (SSystemGlobalEnvironment*)(0x383FAEB8);
      	}
      И да, хотелось бы четкий скрин, а то на этом линии указывают даже не на врагов ?

     

    Найти указатель на SSystemGlobalEnvironment, есть информация на стороннем форуме
    В этом указателе, есть еще несколько (необходимый на IRenderer для w2s)

    Возвращает указатель на SSystemGlobalEnvironment из памяти приложения (в данном случае самой игры, т.к. это injectable dll)

    Насчет скрина, не понимаю для чего тебе. Указывает только на врагов
    Тут просто игрок находится в прицеле
    Да и к чему эти вопросы если ты все и так сам знаешь
     

    • Понравилось 1
  13. Sniper Ghost Warrior 2 (2013)
    Cryengine 3

    Понадобится:
    Dx9 или Dx11 Hook, игра поддерживает оба Directx
    (Тут не будет рассмотрен хук Directx)
    Изначально для рисования местоположения противника надо выйти на EntityList или нечто подобное
    Начинаем свой поиск через хп игрока, потом смотрим, что читает по адресу, и находим небольшой кусок кода который работает со всеми Entity
    Выглядит примерно так
     A4ijzcE.png

     

    Работает как с хп локального игрока так и хп врагов / союзников
    yedire8.png

     

    Именно этим мы и воспользуемся, на с++ напишем хук, который будет брать указатель на врага и сохранять в некий список
    А после этого мы будем читать список и рисовать линию к этим врагам
    Довольно нестандартный способ решения т.к тут не используется EntityList, по которому можно было бы проследить именно четкое смещение между врагами

    Далее были найдены координаты игрока. 
    Ну и последнее что необходимо, это ProjectToWorld или же по другому WorldToScreen для перевода 3D координат на 2D плоскость (Окно игры)

    Собственно реверснутые классы ниже
     

    Спойлер
    
    class Vector3
    {
    public:
    	float x;
    	float y;
    	float z;
    };
    
    class Vector2
    {
    public:
    	float x;
    	float y;
    };
    
    class Vector4
    {
    public:
    	float x;
    	float y;
    	float z;
    	float w;
    };
    
    class Position
    {
    public:
    	char pad_0000[88]; //0x0000
    	float pos_x; //0x0058
    	char pad_005C[12]; //0x005C
    	float pos_y; //0x0068
    	char pad_006C[12]; //0x006C
    	float pox_z; //0x0078
    	char pad_007C[8]; //0x007C
    }; //Size: 0x0084
    
    class LocalPlayer
    {
    public:
    	char pad_0000[12]; //0x0000
    	class Position* pPosition; //0x000C
    	char pad_0010[132]; //0x0010
    	float m_health; //0x0094
    	char pad_0098[172]; //0x0098
    }; //Size: 0x0144
    
    class Actors
    {
    public:
    	char pad_0000[64]; //0x0000
    	class LocalPlayer* pLocalPlayer; //0x0040
    }; //Size: 0x0044
    
    class pWorld
    {
    public:
    	class Actors* pActors; //0x0000
    	char pad_0004[64]; //0x0004
    }; //Size: 0x0044
    
    class Actor
    {
    public:
    	char pad_0000[324]; //0x0000
    }; //Size: 0x0144
    
    class IRenderer
    {
    public:
    	virtual void Function0(); //
    	virtual void Function1(); //
    	virtual void Function2(); //
    	virtual void Function3(); //
    	virtual void Function4(); //
    	virtual void Function5(); //
    	virtual void Function6(); //
    	virtual void Function7(); //
    	virtual void Function8(); //
    	virtual void Function9(); //
    	virtual void Function10(); //
    	virtual void Function11(); //
    	virtual void Function12(); //
    	virtual void Function13(); //
    	virtual void Function14(); //
    	virtual void Function15(); //
    	virtual void Function16(); //
    	virtual void Function17(); //
    	virtual void Function18(); //
    	virtual void Function19(); //
    	virtual void Function20(); //
    	virtual void Function21(); //
    	virtual void Function22(); //
    	virtual void Function23(); //
    	virtual void Function24(); //
    	virtual void Function25(); //
    	virtual void Function26(); //
    	virtual void Function27(); //
    	virtual void Function28(); //
    	virtual void BeginFrame(); //
    	virtual void Function30(); //
    	virtual void Function31(); //
    	virtual void Function32(); //
    	virtual void Function33(); //
    	virtual void EndFrame(); //
    	virtual void Function35(); //
    	virtual void Function36(); //
    	virtual void Function37(); //
    	virtual void Function38(); //
    	virtual void Function39(); //
    	virtual void Function40(); //
    	virtual void Function41(); //
    	virtual void Function42(); //
    	virtual void Function43(); //
    	virtual void Function44(); //
    	virtual void Function45(); //
    	virtual void Function46(); //
    	virtual void Function47(); //
    	virtual void Function48(); //
    	virtual void Function49(); //
    	virtual void Function50(); //
    	virtual void Function51(); //
    	virtual void Function52(); //
    	virtual void Function53(); //
    	virtual void Function54(); //
    	virtual void Function55(); //
    	virtual void Function56(); //
    	virtual void Function57(); //
    	virtual void Function58(); //
    	virtual void Function59(); //
    	virtual void Function60(); //
    	virtual void Function61(); //
    	virtual int GetHeight(); //
    	virtual int GetWidth(); //
    	virtual void Function64(); //
    	virtual void Function65(); //
    	virtual void Function66(); //
    	virtual void Function67(); //
    	virtual void Function68(); //
    	virtual void Function69(); //
    	virtual void Function70(); //
    	virtual void Function71(); //
    	virtual void Function72(); //
    	virtual void Function73(); //
    	virtual void Function74(); //
    	virtual void Function75(); //
    	virtual void Function76(); //
    	virtual void Function77(); //
    	virtual void Function78(); //
    	virtual void Function79(); //
    	virtual bool ProjectToScreen(float ptx, float pty, float ptz, float *sx, float *sy, float *sz); //
    
    	char _0x0004[25396];
    	DWORD m_width; //0x6338 
    	DWORD m_height; //0x633C 
    	char _0x6340[8448];
    
    };//Size=0x8440
    
    class SSystemGlobalEnvironment
    {
    public:
    	char pad_0000[16]; //0x0000
    	IRenderer* pRenderer; //0x0010 
    
    
    	static SSystemGlobalEnvironment* Singleton()
    	{
    		return (SSystemGlobalEnvironment*)(0x383FAEB8);
    	}
    
    };

     

     

    После поисков остается только написать все это на плюсах
    EntityList будет получаться посредством хука на с++
    //SniperGhostWarrior2.exe + 0xDCB8E3
    Ровно тут и ставим хук для получения врагов
    Остается только восстановить инструкции и сделать свой список Entity

     

    Спойлер
    
    __declspec (naked) void hEntity() {
    	_asm {
    		comiss xmm0, [ecx + 0x94]
    		mov TemporaryObject, ecx
    	}
    	AddToSet(TemporaryObject);
    	_asm {
    		xor eax, eax
    		ret
    	}
    }

     

     

    Тут мы восстанавливаем оригинальные инструкции и перемещаем указатель врага в переменную TemporaryObject
    Ну а после добавляем ее в наш некий EntityList где хранятся все указатели на врагов

     

    Спойлер
    
    void AddToSet(DWORD TemporaryObject)
    {
    	if (!TemporaryObject || TemporaryObject == NULL)
    		return;
    
    	//Cast Entity to LocalPlayer Struct
    	LocalPlayer* Entity = reinterpret_cast<LocalPlayer*>(TemporaryObject);
    
    	/*
    	Enemy got less 200 health,
    	Ally (bot) got 80k health or some higher
    	Vehicle's around 16k
    	*/
    	if (Entity->pPosition->pox_z > 500.0f || Entity->m_health <= 0.0f)
    		return;
    
    	//Entity already contains in set, rewrite
    	std::set<DWORD>::iterator i = EntityList.find(TemporaryObject);
    
    	if (i != EntityList.end())
    	{
    		//Here can new fresh pointer to player
    	}
    	else
    	{
    		//Entity is valid and no in list
    		EntityList.insert(TemporaryObject);
    	}
    }

     

     

    Теперь остается только в цикле читать EntityList и проверять валидность, а также отрисовывать (используя dx9 endscene hook) врагов за стенками и прочим
    Для этого воспользуемся методом ProjectToScreen из реверснутого класса IRenderer

    Самая основная часть ниже, в которой и происходит все действие

    Спойлер
    
    //Start cycle into Enemies
    	for (auto Entity : EntityList) {
    
    		if (Entity == player)
    		{
    			continue;
    		}
    
    		//Cast iteration object to LocalPlayer*
    		LocalPlayer* TempEntity = reinterpret_cast<LocalPlayer*>(Entity);
    
    		if (TempEntity->m_health <= 0 || !TempEntity || TempEntity == NULL || TempEntity->pPosition->pos_x == 0 || TempEntity->pPosition->pos_y == 0 || TempEntity->pPosition->pox_z == 0)
    		{
    			continue;
    		}
    
    		
    		LocalPlayer* pPlayer = reinterpret_cast<LocalPlayer*>(player);
    
    		Vector3 entityPos;
    		entityPos.x = TempEntity->pPosition->pos_x;
    		entityPos.y = TempEntity->pPosition->pos_y;
    		entityPos.z = TempEntity->pPosition->pox_z;
    
    		Vector3 vScreen;
    		vScreen.x = pPlayer->pPosition->pos_x;
    		vScreen.y = pPlayer->pPosition->pos_y;
    		vScreen.z = pPlayer->pPosition->pox_z;
    		
    
    		if (WorldToScreen(&entityPos, &vScreen))
    		{
    			Line(1600 / 2, (float)1, vScreen.x, vScreen.y, 2, 1, D3DCOLOR_ARGB(255, 255, 255, 0));
    		}
    
    	}

     



    Теперь можно протестировать работу
    Все отлично отрисовывается, линия идет прямо под врагов
    (Насчет того что нет моделек игроков, такая проблема возникает только на dx9
    При включении dx11 такой проблемы не наблюдается)
    Хук делал под d9, поэтому получилось вот так)
    4TCvGUy.jpg

    Cryengine 3 Classes Reverse

     

    Указатель на SSystemGlobalEnvironment можно найти через строку ai_CompatibilityMode

    Находим в IDA эту строку, переходим по Xref'y, Декомпилируем метод в псевдокод и получаем поинтер на SSystemGlobalEnvironment

     

    Спойлер

    A7Svrj6.png

     

    EdjDroX.png

     

     

    Теперь у нас есть указатель на SSystemGlobalEnvironment

    Спойлер

    C4vX696.png

     

    Указатель SSystemGlobalEnvironment  0х385BF490

     

    Теперь необходимо найти смещение до Renderer, для этого мы будем использовать Reclass
    На этот раз ищем строку Draw2DLine
    И повторяем манипуляции выше
    В итоге мы находим смещение от SSystemGlobalEnvironment до IRenderer (0x10)

    Спойлер

    zY3EPWw.png


    В Reclass мы получаем вот такую картину

    Указатель на SSGlobal + 0x10 (Renderer)

    Спойлер

    63stynT.png



    Теперь необходимо найти метод ProjectToScreen который есть в классе IRenderer
     

    Спойлер

    ul8XUjB.png



    Ищем в IDA строку ProjectToScreen
    Xref, pseudocode как и до этого

    Спойлер

    Npaj4uQ.png

     

    Остается только от указателя на рендер определить адрес метода ProjectToScreen  (Renderer + 0x140)
     

    Спойлер

    nLxpQcW.png

     

    В указателе Renderer лежит виртуальная таблица методов и на 0х140 необходимый нам, определяем его в Reclass

    Спойлер

    ikyOImm.png



    Берем адрес, в данном случае 0x19AD8608 и прибавляем к нему смещение до ProjectToScreen (0x‭19AD8748‬)

    Спойлер

    sEllL4c.png


    Теперь можно сгенерировать все реверснутые классы и использовать метод ProjectToScreen

    • Понравилось 1
    • Плюс 1
  14. В 07.02.2019 в 08:26, JustHack сказал:

    Просто восстанови IRenderer.

    
    virtual bool ProjectToScreen(float ptx, float pty, float ptz, float * sx, float * sy, float * sz) = 0;
    virtual void GetModelViewMatrix(float *mat) = 0;
    virtual void GetProjectionMatrix(float *mat) = 0;
    

     


    Собственно нашел некую структуру (SSGlobal)
    Указатель на pRenderer
    Вопрос в том, находятся ли методы GetModelViewMatrix и GetProjViewMatrix Под ProjectToScreen или же оно в ином месте

    	class IRenderer
    	{
    	public:
    		virtual void Function0(); //
    		/*
            	Собственно до 79 метода
            */
    		virtual void Function79(); //
    		virtual bool ProjectToScreen(float ptx, float pty, float ptz, float *sx, float *sy, float *sz); //
    
    		char _0x0004[25396];
    		DWORD m_width; //0x6338 
    		DWORD m_height; //0x633C 
    		char _0x6340[8448];
    
    	};//Size=0x8440

     

  15. 24 минуты назад, JustHack сказал:

    Тебе не нужно искать матрицу руками, если используешь хук d3d

    То, что получает метод с девайса (хукнутый), похоже больше на кашу, или же некую единичную матрицу, но никак не похоже на proj matrix

    Однако если есть соображения, буду признателен

  16. Изрядно надоело искать эту матрицу, на протяжении недели
    Скажу что есть на данный момент: 
    - LocalPlayer

          - Model Position

          - Health

    - Entity

           - Такие же данные как у LocalPlayer

     

    Directx 9 hook, WorldToscreen

    По сути есть все необходимое для создания обычного Esp, проблема только в матрице которую я не могу найти....

    Уже пробовал искать путем -1 ... +1
    На выходе получаю порядка 800 адресов

    • Понравилось 1
×
×
  • Создать...

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

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