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

User123

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

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

  • Посещение

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

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

    Создал новый проект;

    #include <windows.h>


    #include <gdiplus.h>
    #pragma comment(lib,"gdiplus.lib")


    LONG CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE prevhInstance,LPSTR lpCmdLine,int CmdShow){
    HWND hWnd;
    MSG msg;
    WNDCLASS w;
    memset(&w,0,sizeof(w));
    w.style = 0;
    w.lpfnWndProc = WndProc;
    w.lpszClassName = "Windows form";
    w.hInstance = hInstance;
    RegisterClass(&w);
    hWnd = CreateWindow(w.lpszClassName,"PlantsVsZombies Trainer",
    WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
    CW_USEDEFAULT,CW_USEDEFAULT,420,320,NULL,NULL,hInstance,NULL);
    ShowWindow(hWnd,CmdShow);
    while(GetMessage(&msg,NULL,NULL,NULL)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }
    LONG CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
    switch(msg){
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    return 0;
    }

    Я так понимаю,это связано со средой разработки

    IDE eclipse

    Создаю empty project

    Компилятор MinGW

  2. Он записывает побайтово адрес куда прыгать в перевернутом виде (так нужно делать, так как инструкция jmp принимает относительные адреса и в перевернутом виде).

    Это можно записать более красиво кстати (тогда циклы типа for(int i = 0;i<4;i++) ), будут вообще не нужны, т.к. в результате выполнения этих операций мы уже получим результат в "перевёрнутом" виде.

    DWORD jmp_newmem = 0 - (newmem - address) - 5;DWORD jmp_address = 0 - (address - newmem) - sizeof(injection);

    О том, как рассчитываются прыжки в x86 асме ты можешь почитать тут:

    http://stackoverflow.com/questions/7609549/calculating-jmp-instructions-address

    http://stackoverflow.com/questions/8196835/calculate-the-jmp-opcodes

    Ну и еще можешь погуглить.

    Спасибо!

  3. Спасибо кодеру за это видео,вроде все работает

    Только я не понимаю как  :-D

    #include "Memory.h"


    #include <cstdio>

    using namespace std;

    int main(){
    BYTE jump[] {
    "\xE8\x00\x00\x00\x00\x90" //jmp newmem
    };
    BYTE original[] = {
    "\x03\x82\x60\x55\x00\x00" //add eax,[edx+00005560]
    };
    BYTE injection[] = {
    "\x81\xBA\x60\x55\x00\x00\xF4\x01\x00\x00" //cmp [edx+00005560],000001F4
    "\x7C\x07" //jl hack
    "\x03\x82\x60\x55\x00\x00" //add eax,[edx+00005560]
    "\xC3" //ret
    "\xC7\x82\x60\x55\x00\x00\xF4\x01\x00\x00" //mov [edx+00005560],000001F4
    "\xC3" //ret
    };
    Memory* mem = new Memory("PlantsVsZombies.exe");
    mem->openProcess();
    DWORD address = 0x0041BAE5;
    DWORD newmem = mem->alloc(sizeof(injection));
    DWORD jmp_address = address-newmem-sizeof(injection);
    DWORD jmp_newmem = newmem-address-5;
    for(int i = 0;i<4;i++){
    jump[i+1] = jmp_newmem >> 8*i;
    }
    mem->writeMemory(injection,newmem,sizeof(injection));
    mem->writeMemory(jump,address,sizeof(jump));
    printf("Call ");
    for(int i = 0;i<4;i++){
    printf("%X",jump[i+1]);
    }
    printf("\n");
    printf("Allocated memory at %X\n",newmem);
    printf("Jump to address is %X\n",jmp_address);
    printf("Jump to newmem is %X\n",jmp_newmem);
    system("PAUSE");
    return 0;
    }

    Прошу объяснить мне,как работает вот этот цикл

    for(int i = 0;i<4;i++){
    jump[i+1] = jmp_newmem >> 8*i;
    }
  4. Собственно,теперь попробую понятно объяснить,чего я хочу  :-D

    #include "Memory.h"

    #include <cstdio>
     

    using namespace std;

    int main(){
    BYTE injection[] = {
    "\x81\xBA\x60\x55\x00\x00\xF4\x01\x00\x00" //cmp [edx+00005560],000001F4
    "\x0F\x8C\x0B\x00\x00\x00" //jl (newmem+27)-(newmem+10)-6
    "\x03\x82\x60\x55\x00\x00" //add eax,[edx+00005560]
    "\xE9\x00\x00\x00\x00" //jmp address-newmem-size
    "\xC7\x82\x60\x55\x00\x00\xF4\x01\x00\x00" //mov [edx+00005560],000001F4
    "\xE9\x00\x00\x00\x00" //jmp address-newmem-size
    };
    Memory* mem = new Memory("PlantsVsZombies.exe");
    mem->openProcess();
    DWORD address = 0x0041BAE5;
    DWORD newmem = mem->alloc(PAGE_EXECUTE_READWRITE);
    DWORD jmp_address = address-newmem-sizeof(injection);
    DWORD jmp_newmem = newmem-address-5;
    printf("Allocated memory at %X",newmem);
    printf("Jump to address is %X",jmp_address);
    printf("Jump to newmem is %X",jmp_newmem);
    system("PAUSE");
    return 0;
    }

    Мне нужно как-то jmp_address и jmp_newmem перевести в байты,понятные ассемблеру(Перевести в 16-ричную систему счисления и переставить в обратном порядке),прошу объяснить как это сделать,желательно с примерами  :closeyes:

  5. Смотрел вот эту http://forum.gamehacklab.ru/topic/3386-codeinjection-c/ тему и вот что у меня получилось:

    #include "Memory.h"


    #include <cstdio>

    using namespace std;

    int main(){
    Memory* mem = new Memory("PlantsVsZombies.exe");
    mem->openProcess();
    DWORD address = 0x41BAE5;
    DWORD newmem = mem->alloc();
    //Пишем address E9 Развенуть newmem-address в 16-ричной системе счисления?
    //Пишем в newmem инъекция E9 Развенуть (adress+6)-(mewmem+sizeof(инъекция)) в 16-ричной системе счисления?
    mem->closeProcess();
    }

    Вопрос:как перевести DWORD в byte,и правильно ли я все делаю?

    [ENABLE]

    alloc(newmem,2048)
    label(returnhere)

    newmem:
    cmp [edx+5560],#500
    jl @f
    add eax,[edx+00005560]
    jmp returnhere

    @@:
    mov [edx+5560],#500
    jmp returnhere

    "PlantsVsZombies.exe"+1BAE5:
    jmp newmem
    nop
    returnhere:

    [DISABLE]
    dealloc(newmem)
    "PlantsVsZombies.exe"+1BAE5:
    add eax,[edx+00005560]

  6. Можно. Предвидя вопрос "как" - смотри советы в теме. Но с онлайн играми может и не прокатить, так что тут смотря какую ты игру пытаешься взломать.

    Как уже писали,получается замкнутый круг и сделать игрока ПОЛНОСТЬЮ бессмертным не получается,а название игры я уже писал independent
  7. Да,но проблема в том,что эта инструкция как минимум 1 раз выполнится перед тем,как ее получится занопить и,если урон будет >=100(макс хп),то игрока убьет

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

    Так а тема то о чем?Надо найти адрес инструкции,наносящей урон

  9. Так тебе уже помогли. Либо ищи инструкцию, которая постоянно читает из адреса, либо, в некоторых случаях, ее действительно не будет до первого использования функции.

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

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

     

    P.S. Бесконечный цикл не предлагать

    Ладно,я понял,никто с этим еще не заморачивался :-D

  10. Как найти сигнатуру, которой не существует до первого определенного действия в игре? 

     

    Ответ. Никак. Это же очевидно  ;)

    Вот я и спрашиваю,вдруг есть какой-то способ

     

    Вопрос:как можно это обойти,то-есть сканировать сигнатуру сразу,как только эта функция появляется

  11. Например,я хочу занопить инструкцию,наносящую урон

    Сделал сигнатуру,но CE ее не находит пока игроку не нанесется урон

    Из чего я предположил,что инструкция появляется в памяти игры только тогда,когда она вызывается в первый раз


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

  12. Собственно,во многих играх,функции(возьмем,например,изменяющую здоровье) появляются только после того,как она потребуется,то-есть когда наносится урон.Вопрос:как можно это обойти,то-есть сканировать сигнатуру сразу,как только эта функция появляется

    Надеюсь,меня поняли :-D

    P.S. Бесконечный цикл не предлагать

  13. Самый точный (но очень долгий) поиск: "неизвестное значение", тип "все", метод - изменилось/не изменилось. Смотри уроки Xipho

    Тип "4 байта" (самый универсальный из всех типов), включает в себя при это методе - значения 4 байта, закодированное значение и float. 

     

    В нашем случае (Fallout3 поиск нанесённого урона):

     "неизвестное значение", тип "float", метод - уменьшилось (при лечении)/увеличилось (при нанесении урона)/не изменилось (если ничего не поменялось).

    Спасибо,забыл попробовать перед тем,как создавать тему

     

    А как найдёшь адрес жизней, поставь на него бряк на чтение, так ты обнаружишь инструкции которые понадобится для написния твоего АА скрипта. :-D

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

  14. Всем привет!

    Не могу взломать fallout 3 на здоровье

    Поиск значения,которое в игре ничего не дает,пытался искать путем уменьшилось/увеличилось,находит много адресов,пытался замораживать по-очереди - не получается

    Далее попробовал залезть в структуру игрока,тоже ничего не получилось

    Кто-нибудь может подсказать хотя бы в каком виде хранится здоровье?

  15. Так я же писал,что если я комментирую хедеры,ошибка остается


    А вообще я сейчас всеми силами пытаюсь установить студию,ничего хорошего с этом билдером не выйдет


    Кстати,при заходе на форум у меня аваст ругается Win32:Evo-gen [susp]

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

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

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