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

помогите разобраться пожалуйста \с++\dll\VS2012


Рекомендуемые сообщения

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

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

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;
}
}
}

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);

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

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

Ссылка на комментарий
Поделиться на другие сайты

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


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);

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

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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