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

VDV

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

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

  • Посещение

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

  1. Разобрался - расскажи другим, возможно, на форуме появятся люди, у которых возникнет такая же проблема. И да, хороший рассказ подразумевает плюс в репутацию, и, возможно, не только...

    а скайп? :-D

    А по делу вот что:

    void PrintText(int x, int y, D3DCOLOR col, LPD3DXFONT pFont, const char *pString2, ... ) // создаем функцию,которая ничего не возвращает типа "void" , рассмотрим переменные
    int x , int y - координаты,то есть расположения текста на экране
    D3DCOLOR col - переменная col - сдесь мы устанавливаем цвет текста,это уже отдельная тема , требующая более подробного и углубленного описания
    LPD3DXFONT pFont - где мы рисуем , LPD3DXFONT , это уже отдельная тема , требующая более подробного и углубленного описания
    const char *pString2 - что мы выводим на экран , какую информацию и в каком формате
    {
    char buf[1024]; - создаем буфер , чтобы наверняка уже размером 1024 байт
    RECT FontRect = { x, y, x+800, y+50 }; - это область применеия текста , то есть за границами указанных параметров текст отображаться не будет ,RECT - это уже отдельная тема , требующая более подробного и углубленного описания
    ======================================================================================================================================
    собственно переходим к функции которая и позволяет нам выводить информацию в любом формате , будь то адрес или значение адреса
    va_list vaList; - создаем аргумент для va_list
    va_start(vaList, pString2); инициализируем наш аргумент в переменной "pString2"
    vsprintf_s(buf, pString2, vaList); - о функции vsprintf_s нужно говорить отдельно , в кратце она необходима для вывода информации на экран
    какие аргументы она принимает : buf - наш буфер , куда мы кладем то что хотим вывести на экран
    va_end(vaList);
    pFont->DrawText( NULL, buf, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col); - это параметры вывода текста,нужно разбирать отдельно
    }

  2. К сожалению мне этот вариант не понятен, мне бы видео с уроком посмотреть

    я тебя умоляю : на этом форуме их предостаточно , они у тебя под носом , сделай 3 клика мыши и смотри на здоровье , а так посоветую начать просмотр с Кенга - он для новичков самый раз и объясняет очень понятно

  3. попоробуй без джампа , вот такой простенький луа скрипт:


    ammo=
    [[
    label(metkaAmmo)
    registersymbol(metkaAmmo)
    aobscan(timer_adress,69 6E 65 72 00 63 6F...........твои байты оружия или здоровья , те байты которые не имеют числовой константы ты пишешь как "XX")
    ammo_adress:
    metkaAmmo:
    тут занопивай инструкцию которая рассчитывает урон , или подсчитывает жизни
    ]]
    autoAssemble(ammo)

  4. мне использование AOBscan-a тоже больше по душе, но уж очень долго бывает он ищет адрес по сигнатуре. Ладно буду думать и курить форумы о том как можно быстрее сканировать память.

    мгновенное сканирование = AOB scan на с++ в dll формате естественно

  5. ты затратил кучу времени на ручной поиск , сделай как я тебе говорю :

    1.найди адрес с деньгами (динамику как ты хочешь)

    2. нажми "Найти указатель на этот адрес" , должно найти много значений.

    3. выйди из игры , не закрывая список найденных указателей

    4. зайди в игру , заатчся к процессу снова

    5. еще раз найди адрес с деньгами (динамику как ты хочешь)

    6. перейди в список указателей и нажми "отсев" в верхнем меню , в меню отсева напиши адрес денег , который ты нашел 2 раз.

    7. дождись окончания процедуры отсева - все поинтеры которые остались и будут динамическими адресами с "цепочкой офсетов"

    Если при дальнейшем перезаходе в игру поинтер будет не верный , повтори пункт 3,4,5,6

    таким образом в процессе отсеивания остаются 3 оффсета, которые успешно не работают на другом pc...

    на другом компьютере есть огромная вероятность , что работать не будет , спросишь почему? Я отвечу - потому что распределение памяти у каждого компьютера происходит по разному , это зависит на прямую от операционной системы , размера оперативной памяти и еще многих факторов. Какой выход из ситуации?Выход очень прост - сделай простенький трейнер на том же СЕ с помощью АА или ЛуаСкрипта , с использованием AOB scan и я тебя уверяю - работать будет эта штука всегда и на всех компьютерах

  6. ну во - первых отсев адресов ты не правильно делаешь , во-вторых в СЕ 6.2 есть такая штука - называется "Найти указатель на этот адрес"(в русской версии) - это автоматический поиск указателей , используй её , а в-третьих чем тебе статически адрес не нравится , найди статику , зачем тебе динамический адрес и еще и с кучей офсетов , что ты хочешь сделать?

  7. Понимаешь, это тоже самое, что ко мне подойдёт человек на улице и попросит оставить ему свой номер телефона.

    Но в твоём случае вопрос касается WinAPI, а не самого C++.

    На MSDN дано описание функции, там всё написано чётко, коротко и ясно.

    И задам тебе встречный вопрос, если не знаешь что это такое, то зачем используешь? Для каких целей?

    моя цель - поиск байт и возврат динамического адреса, FindPattern не справляется с этой задачей(только для отдельных случаев) , если есть другой способ я только за , я о нем не знаю...На счет скайпа - это ты преувеличил......если ты чего-то боишься я могу для тебя создать скайп со своего ip и дать логин и пароль тебе.

  8. Ты уж извини но давать свой скайп, я думаю никто не будет.

    Тебе Xipho уже всё объяснил. И на MSDN описание функций очень понятное, так что нет такого варианта что ты мог не понять для чего она.

    я просто не понимаю , что такого в скайпе объяснить.....Я не такой как вы , с++ мне трудно даётся - я не понимаю многого в с++ , поэтому и прошу помощи у Вас, объяснить какую-то функцию не можете......- она запретная какая-то ....?

  9. Дело не в моих принципах. Просто, если я приведу тебе готовый код, ты его скопипастишь, и будешь использовать до тех пор, пока не возникнет какая-либо нестандартная ситуация, в которой у тебя снова возникнут проблемы. В этом случае ты снова будешь обращаться за помощью. А если же ты разберешься, какой функционал выполняет эта функция (тавтология, знаю), то уже в любой ситуации ты сможешь изменить свой код так, чтобы все работало. Даю наводку - VirtualQuery опрашивает регионы памяти, начиная с указанного ей адреса. В приведенном тобой коде, который ты где-то нашел, как раз в цикле перебираются все регионы памяти, пока не будет найден нужный. Тебе же этот код нужно изменить так, чтобы в каждой итерации цикла вызывалась функция FindPattern, в которую будут передаваться данные, полученные вызовом VirtualQuery. Если присмотришься к структуре MEMORY_BASIC_INFORMATION (а, точнее, почитаешь о ней на MSDN), увидишь, что в нее сохраняются некоторые данные. Что это за данные - легко понять по названиям членов структуры. Так вот, для FindPattern в каждой итерации вышеприведенного цикла тебе всего лишь нужно передавать определенные данные из указанной структуры. Ну и, разумеется, предусмотреть выход из цикла, если сигнатура найдена.

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

  10. я не знаю как её применить с FindPattern совместно - если ты на счет исходного кода , да я прошу помочь с исходным кодом , я не пойму как его сделать , на практике лучше всего обучаться.

    На счет

    VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );

    я тут понимаю только переменную pvAddress, для чего mbi я не помойму.

    Если объяснить на примере кода - это выше твоих принципов - я не знаю тогда, объясни в л\с или скайп.

    нашел вот это:

    MEMORY_BASIC_INFORMATION mbi = {0};
    unsigned char *pAddress = NULL,
    *pEndRegion = NULL;

    DWORD dwFindData = 0xBAADF00D,
    dwProtectionMask = PAGE_READONLY | PAGE_EXECUTE_WRITECOPY
    | PAGE_READWRITE | PAGE_WRITECOMBINE;

    while( sizeof(mbi) == VirtualQuery(pEndRegion, &mbi, sizeof(mbi)) ){
    pAddress = pEndRegion;
    pEndRegion += mbi.RegionSize;
    if ((mbi.AllocationProtect & dwProtectionMask) && (mbi.State & MEM_COMMIT)){
    for (pAddress; pAddress < pEndRegion ; pAddress++){
    if (*pAddress == dwFindData){

    }
    }
    }
    }

  11. В твоем посте я не вижу примера твоего совместного применения VirtualQuery с функцией FindPattern. Вот когда приведешь своего применения - тогда я постараюсь помочь, и указать на возможные ошибки. А пока я лишь вижу, что ты процитировал вызов функции VirtualQuery из мсдн, и функцию FindPattern из урока Кодера.

    я не знаю как её применить с FindPattern совместно - если ты на счет исходного кода , да я прошу помочь с исходным кодом , я не пойму как его сделать , на практике лучше всего обучаться.

    На счет

    VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );

    я тут понимаю только переменную pvAddress, для чего mbi я не помойму.

    Если объяснить на примере кода - это выше твоих принципов - я не знаю тогда, объясни в л\с или скайп.

  12. как правильно использовать эту функцию и для чего она вообще(msdn читал-не понял до конца)?

     MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );

    я пытаюсь применить эту функцию к(совместно) AOB scan :

    DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
    {
    for(DWORD i=0; i<dwLen; i++)
    if (bCompare((BYTE*)(dwAddress+i),bMask,szMask))
    return (DWORD)(dwAddress+i);
    return 0;
    }

    потому что когда я начинаю сканировать массив в промежутке памяти допустим

    FindPattern(0х15000000 , 0х3000000 , блаблабла.......)

    Кроме краша нечего не происходит.

    А когда я указываю определенный модуль и его длину , то все нормально находит. Хотя если сканер не найдет указанный массив в пределах модуля и выйдет за приделы модуля - тоже краш.

    Такой сканер отлично подходит для поиска статических адресов и поиска внутри модуля , а вот как быть с динамикой? она может быть где угодно при перезапуске игры - за пределами модуля , посредине модуля , в начале,в конце и т.д. Как найти решение , может я не правильно применяю функцию FindPattern???Если правильно , то как на счет "VirtualQuery" , как правильно её применить?

  13. Правильнее будет, так как я тебе прислал)


    if (CoordPlayerX != NULL && HIWORD(CoordPlayerX)) // так ещё лучше будет
    {
    /// манипуляции с координатами
    }

    благодарен сейчас попробую

    сделал вот так :

    void XP()
    {
    float IX = 0;
    float IX1 = 0;
    int* address = 0;
    int* CoordPlayerX = 0;
    DWORD old_protect = 0;
    DWORD PCoordX = (DWORD)GetModuleHandle("Game.exe") + 0x1235478;
    DWORD offsetsX[] = {0x8 , 0x100 , 0x8, 0x740 , 0x70};
    if(fly==1)
    {
    CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);
    if(CoordPlayerX != NULL && HIWORD(CoordPlayerX))//Правильно я проверку вставил?
    VirtualProtect (CoordPlayerX, 10 , PAGE_EXECUTE_READWRITE , &old_protect);
    {
    Coord* PlayerX = Coord::Singleton(CoordPlayerX);// Краши уменьшились , но все равно остались
    IX = *(float*)address;
    if (GetAsyncKeyState(VK_F1))
    {
    PlayerX->CoordX = IX+FlySpeed;
    }
    if (GetAsyncKeyState(VK_F2))
    {
    PlayerX->CoordX = IX-FlySpeed;
    }
    }
    }
    }

    я так думаю , происходит вот что , когда вызывается класс а в нем функция возврата адреса

    Coord* PlayerX = Coord::Singleton(CoordPlayerX);

    , читается поинтер и находится адресс, так вот скорее всего

    ReadPointer(PCoordX, offsetsX ,5);

    - тут косяк или поинтер иногда не читается или доступа не хватает или я не знаю что ему надо вообще...

  14. Скорее всего CoordPlayerX принимает значение 0.

    Проверку делай - if (CoordPlayerX != NULL)

    спасибо тебе , а как можно сделать проверку на то - прочитался ли вообще адрес

    CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);

    так правильно???

    if ( !ReadPointer) вернуть фолс или как правильнее будет?

  15. Делаю следующее:

    работаю с координатами:

    1. создал класс (для тренировки)

    class Coord;

    class Coord
    {
    public:
    float CoordX; //0x0000
    char _0x0004[60];
    static Coord* Singleton (int*address)
    {
    return (Coord*)address;
    }
    };//Size=0x0040

    2.Создал поток в котором производил махинации с координатами:

    void XP()
    {
    int* address = 0;
    int* CoordPlayerX = 0;
    if(fly==1)
    {
    DWORD old_protect = 0;
    DWORD PCoordX = (DWORD)GetModuleHandle("Game.exe") + 0x1235478;// поинтер верный
    DWORD offsetsX[] = {0x8 , 0x100 , 0x8, 0x740 , 0x70};//смещения тоже
    CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);//адресс прочитан верно , адресс динамический естественно
    Coord* PlayerX = Coord::Singleton(CoordPlayerX);// вот из-за этой штуки происходит краш , не сразу конечно , но через секунд 30 -120,не пойму почему
    IX = *(float*)address;
    VirtualProtect (address, 10 , PAGE_EXECUTE_READWRITE , &old_protect);//протекцию обнулил для прикола , толку 0 - все равно краш
    VirtualProtect (CoordPlayerX, 10 , PAGE_EXECUTE_READWRITE , &old_protect);// протекцию обнулил для прикола , толку 0 - все равно краш

    if (GetAsyncKeyState(VK_F1))
    {
    PlayerX->CoordX = IX+FlySpeed;//запись происходит вроде-бы нормально
    }
    if (GetAsyncKeyState(VK_F2))//запись происходит вроде-бы нормально {
    PlayerX->CoordX = IX-FlySpeed;
    }
    }
    }

    все отлично работает , но есть одна ошибка,помогите разобраться в чем пожалуйста.

  16. Поспешу разочаровать тебя, ты вызываешь не функцию, а ктулху походу (шучу :-D ).

    Ты обращаешься к полю класса.

    В твоём же случае говорю тебе ещё раз, тебе нужно передавать ссылку на класс, а не переменную, которая хранит адрес класса.

    тему можно закрыть.

    вот так нужно было возвращать адресс ,если кому интересно, как и сказал кодер , "ссылку на класс", все работает , благодарность кодеру.

    return (RecoilPlayer*)address;

  17. тему можно закрыть - написал свою собственную функцию подсчета ФПС,кому интересно код ниже:

    создаем переменные для подсчета

    int  FPScounter = 0;
    float FPSfLastTickCount = 0.0f;
    float FPSfCurrentTickCount = 0.0f;
    int timerFPS;

    создаем функцию войд в потоке желательно(она нечего не возвращает , просто считает ФПС), если вы не знаете что такое поток ,сделайте цикл "for"

    void FPS()
    {
    FPSfCurrentTickCount = clock() * 0.001f;
    FPScounter++;
    if((FPSfCurrentTickCount - FPSfLastTickCount) > 1.0f)
    {
    FPSfLastTickCount = FPSfCurrentTickCount;
    timerFPS=FPScounter;
    FPScounter = 0;
    }
    PrintText2(1, 1, SKYBLUE,dMenu.pFont, "%d",timerFPS);//Выводим с помощью стандартной функции принт текст
    }

    не забываем подключать

    #include <time.h>

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

    функция принт текст , спасибо отдельное Армандо за предоставленную функцию.

    void PrintText2(int x, int y, D3DCOLOR col, LPD3DXFONT pFont, const char *pString2, ... ) // тут вам нужно главное указать "где рисовать",в моем случае pFont.
    {
    char buf[1024];
    RECT FontRect = { x, y, x+800, y+50 };//500 30
    va_list vaList;
    va_start(vaList, pString2);
    vsprintf_s(buf, pString2, vaList);
    va_end(vaList);
    pFont->DrawText( NULL, buf, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
    }

  18. К сожалению может ты и знаешь, что она делает, но точно не знаешь как ей что-то делать.

    Советую потренироваться на чём-нибудь попроще.

    ты прав , но куда уж проще записи в адрес , дай скайп в п\м

  19. Об этой функции ты можешь почитать здесь - http://www.cplusplus...cstring/memcpy/

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

    и так делал:


    DWORD a = 0x1;
    memcpy (&locPlayer ,&a, sizeof(DWORD));

    все равно нет толку.

  20. пробуй через memcpy, если не получится перед записью выполняй VirtualProtect, а после восстанови исходную защиту памяти.

    я не знаю вот так через мемспу?

    VirtualProtect (locPlayer, 10 , PAGE_EXECUTE_READWRITE , &old_protect);
    memcpy (locPlayer ,(DWORD*)0x1, 10 );
    VirtualProtect (locPlayer, 10 , old_protect , &old_protect);

  21. Такая же ошибка как и в первой твоей теме.


    DWORD* value = *(DWORD**)0x15F328C;
    *value++;

    Как-то так, если мне память не изменяет, давно не занимался взломом игр.

    Спасибо огромное , но не работает жалко очень , не могу элементарно в адрес записать.....

  22. Столкнулся с проблемой записи в адрес:

    необходимо в адрес записать какое-нибудь значение , ну к примеру когда я нажимаю ПКМ , к адресу прибавляется значение 1.

    пробовал вот так сделать,не получилось:

    DWORD a = *(DWORD*)(0x1);

    DWORD b = *(DWORD*)(0x15F328C);

    a+b;

    b=b+a;//в потоке и в цикле ноль действий

    и т..д.

    ------------------------------------------------------------

    Как правильно делать запись вообще?

  23. Смотри ты делаешь переменную, просто со значением адреса класса, но адрес у неё другой.

    Тебе же надо сделать так, чтобы адрес этой переменной соответствовал адресу класса.

    Вот к примеру:


    // adress of class Player = 0x4000 (Player*);
    int** address = &Player;

    Я туплю короче....

    Я понимаю так :

    когда я вызываю функцию

    localPlayer->Recoil=100;

    Я вызываю класс , в нем функцию возврата адреса и далее параметр класса "Recoil" , но адрес в "Recoil" получается не определен, и поэтому я пытаюсь писать в несуществующую область памяти?

×
×
  • Создать...

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

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