Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Изменяем память сторонего приложения


Автор: lips 6.11.2012, 19:55
Прочитал пару статей... где с помощью ArtMoney и VisualC++ написали тренер для игры...
опираясь на эти записи написал код:
Код

    HWND pHandle;
    int a = 12345;//число которое будет записано
    DWORD address = 0x00AB0C62;     //адрес был найден в артмании
    pHandle=FindWindow(NULL,Edit1->Text.c_str());
    SetWindowText(pHandle,L"Окно Захвачено!!");   //проверка на всякий случай
    ReadProcessMemory(pHandle, (LPCVOID)address, &address, 8, 0);//правильно или нет? 
    WriteProcessMemory(pHandle, (LPVOID)address, (LPVOID)a, 8, NULL);//правильно или нет?

пытаюсь взломать пинбол(стандартн), но почему-то не работает...
пишу в рад студии
Уважаемые программисты гляньте на несколько строчек кода найдите ошибку!

Автор: Zhunko 6.11.2012, 20:16
По моему, чтение неправильно. Почему-то приём в ту же переменную, что содержит адрес.
Возможно это правильно в смысле, что работать будет, но это неправильно так писать.
Да, ещё там, в первом параметре должен быть дескриптор процесса, а не окна.

Автор: feodorv 6.11.2012, 20:22
Цитата(lips @  6.11.2012,  20:55 Найти цитируемый пост)
   ReadProcessMemory(pHandle, (LPCVOID)address, &address, 8, 0);//правильно или нет? 
    WriteProcessMemory(pHandle, (LPVOID)address, (LPVOID)a, 8, NULL);//правильно или нет?

8 байт - это нормально? У Вас sizeof(int) равна 8 байтам? Не четырём?

Добавлено через 1 минуту и 59 секунд
Цитата(Zhunko @  6.11.2012,  21:16 Найти цитируемый пост)
 Почему-то приём в ту же переменную, что содержит адрес.

Поддерживаю вопрос. 
Цитата(lips @  6.11.2012,  20:55 Найти цитируемый пост)
    int a = 12345;//число которое будет записано

Это значение будет затёрто при ReadProcessMemory. Зачем вообще читать, когда писать надо?

Автор: Zhunko 6.11.2012, 20:28
Цитата(feodorv @  6.11.2012,  21:22 Найти цитируемый пост)
8 байт - это нормально? У Вас sizeof(int) равна 8 байтам? Не четырём?

Это тоже неправильно. Но не имеет значения здесь. При записи INT не испортит чужую память. Адрес-то правильный, наверно.  smile 

Получается, что сначала читает адрес. Модифицирует уже существующий. Пишет по новому адресу, что прочитан ранее.

Автор: lips 6.11.2012, 20:59
насчёт той же переменной я описался, а вот что там с хэндлом процесса? как его узнать?
а CreateProcess необязательно использовать? 
спасибо за ответы

Добавлено через 56 секунд
у меня артмания выдала что там 8 байт..

Автор: Zhunko 6.11.2012, 21:13
Цитата(lips @  6.11.2012,  21:59 Найти цитируемый пост)
насчёт той же переменной я описался, а вот что там с хэндлом процесса? как его узнать?а CreateProcess необязательно использовать? спасибо за ответы

У меня так сделано:
Код

    // 2.2.1. Метод возвращает системный дескриптор процесса по его идентификатору.
    //        Дескриптор может быть использован в любой функции, которая требует дескриптора процесса, в такой,
    //        как  функции ожидания (wait functions), предоставляя соответствующие права доступа, которые были затребованы.
    //        Когда Вы завершаете работать с дескриптором, убедитесь, что закрыли его, используя функцию CloseHandle().
    static HANDLE GetHandle(const DWORD dwProcessID) // ID процесса, для которого возвращается системный дескриптор.
     {
      HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID);
      if (hProcess == NULL) throw(_T("Ошибка в методе \"Utils::Process::GetHandle()\".\nСистемный дескриптор процесса не получен.") + LAST_ERROR);
      return(hProcess);
     }

static можно убрать.

Автор: lips 6.11.2012, 21:19
Zhunko спасибо! сейчас буду пробовать

Автор: lips 6.11.2012, 22:08
Получилось как то так:
но естественно не работает 
Код

    DWORD PID = 0;
    HWND HandleWindow = 0;
    HandleWindow = FindWindowA("Window", "123"); // находим окно
    GetWindowThreadProcessId(HandleWindow, &PID); // ищем ИД процесса которому принадлежит окно
    HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, PID);
    //if (hProcess == NULL) throw(("Ошибка в методе \"Utils::Process::GetHandle()\".\nСистемный дескриптор процесса не получен."));
    WriteProcessMemory(hProcess, (LPVOID)0x00AB0C62, &i, 8, NULL);

Подскажите?

Автор: Zhunko 6.11.2012, 22:14
Прочитайте оттуда, что записали, и сравните. Возможно, что работает, но Ваши ожидания иные от той программы.

Автор: lips 6.11.2012, 22:23
Цитата(Zhunko @ 6.11.2012,  22:14)
Прочитайте оттуда, что записали и сравните. Возможно, что работает, но Ваши ожидания иные от той программы.

Код

    WriteProcessMemory(hProcess, (LPVOID)0x00AB0C62, &i, 4, NULL);
    ReadProcessMemory(hProcess, (LPCVOID)0x00AB0C62, &a, 4, 0);//
    Label1->Caption = a;

значение "a" не изменяются

Автор: Zhunko 6.11.2012, 22:34
Надо бы весь код посмотреть.

Автор: lips 6.11.2012, 22:39
GetLastError(); возвращает 87 неверный параметр
хелп!

Добавлено через 1 минуту и 59 секунд
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
 #include <windows.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int a = 12345;
    int i = 800000;
    DWORD PID = 0;
    HWND HandleWindow = 0;
    HandleWindow = FindWindowA("Window", "Пинбол для Windows - \"Звездный юнга\""); // находим окно
    GetWindowThreadProcessId(HandleWindow, &PID); // ищем ИД процесса которому принадлежит окно
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
    Label1->Caption = GetLastError();
    WriteProcessMemory(hProcess, (LPVOID)0x00AB0C62, &i, 4, NULL);
    ReadProcessMemory(hProcess, (LPCVOID)0x00AB0C62, &a, 4, 0);//
}
//---------------------------------------------------------------------------



ну это и так весь код ))

Добавлено через 7 минут и 55 секунд
вот что удалось выяснить:
после 
HandleWindow = FindWindowA("Window", "Пинбол для Windows - \"Звездный юнга\""); 
2: Общая ошибка
после 
GetWindowThreadProcessId(HandleWindow, &PID);
1400: Недопустимый дескриптор окна.
ну а дальше пошло поехало...
как исправить?

Автор: Zhunko 6.11.2012, 22:49
Вы, что-то про 8 байт говорили?
Может так попробывать:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    INT64 a = 12345;
    INT64 i = 800000;
    DWORD PID = 0;
    HWND HandleWindow = 0;
    ::SetLastError(0);
    HandleWindow = ::FindWindow(_T("Window"), _T("Пинбол для Windows - \"Звездный юнга\"")); // находим окно
    ::GetWindowThreadProcessId(HandleWindow, &PID); // ищем ИД процесса которому принадлежит окно
    HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, false, PID);
    Label1->Caption = GetLastError();
    ::WriteProcessMemory(hProcess, (LPVOID)0x00AB0C62, &i, 8, NULL);
    ::ReadProcessMemory(hProcess, (LPCVOID)0x00AB0C62, &a, 8, 0);
}

Ещё поставте анализ ошибок после каждой функции. Надо привыкать сразу так писать с исключениями. Пример в моём методе. Так сразу ошибки проявляются.

Автор: lips 6.11.2012, 22:53
аа всё всё всё разобрался всем спасибо!! я тупанул вот так надо было писать 
Код

FindWindowA(NULL, "Пинбол для Windows - \"Звездный юнга\"");

вот код всё работает!! всем ещё раз спасибо!!
Код

    int i = 800000;
    DWORD PID = 0;
    HWND HandleWindow = 0;
    HandleWindow = FindWindowA(NULL, "Пинбол для Windows - \"Звездный юнга\""); // находим окно
    GetWindowThreadProcessId(HandleWindow, &PID); // ищем ИД процесса которому принадлежит окно
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
    WriteProcessMemory(hProcess, (LPVOID)0x00AB0C62, &i, 4, NULL);


Добавлено через 1 минуту и 19 секунд
а и ему всёравно что 8 что 4... работает в любом случае =)

Автор: Zhunko 6.11.2012, 22:56
Цитата(lips @  6.11.2012,  23:39 Найти цитируемый пост)
вот что удалось выяснить:после HandleWindow = FindWindowA("Window", "Пинбол для Windows - \"Звездный юнга\""); 2: Общая ошибка

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633499(v=vs.85).aspx
Что Вы за параметры туда вставляете?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)