-
Постов
93 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные VDV
-
-
К сожалению мне этот вариант не понятен, мне бы видео с уроком посмотреть
я тебя умоляю : на этом форуме их предостаточно , они у тебя под носом , сделай 3 клика мыши и смотри на здоровье , а так посоветую начать просмотр с Кенга - он для новичков самый раз и объясняет очень понятно
-
попоробуй без джампа , вот такой простенький луа скрипт:
ammo=
[[
label(metkaAmmo)
registersymbol(metkaAmmo)
aobscan(timer_adress,69 6E 65 72 00 63 6F...........твои байты оружия или здоровья , те байты которые не имеют числовой константы ты пишешь как "XX")
ammo_adress:
metkaAmmo:
тут занопивай инструкцию которая рассчитывает урон , или подсчитывает жизни
]]
autoAssemble(ammo) -
мне использование AOBscan-a тоже больше по душе, но уж очень долго бывает он ищет адрес по сигнатуре. Ладно буду думать и курить форумы о том как можно быстрее сканировать память.
мгновенное сканирование = AOB scan на с++ в dll формате естественно
-
тему можно закрыть разобрался уже давно в этом .
-
ты затратил кучу времени на ручной поиск , сделай как я тебе говорю :
1.найди адрес с деньгами (динамику как ты хочешь)
2. нажми "Найти указатель на этот адрес" , должно найти много значений.
3. выйди из игры , не закрывая список найденных указателей
4. зайди в игру , заатчся к процессу снова
5. еще раз найди адрес с деньгами (динамику как ты хочешь)
6. перейди в список указателей и нажми "отсев" в верхнем меню , в меню отсева напиши адрес денег , который ты нашел 2 раз.
7. дождись окончания процедуры отсева - все поинтеры которые остались и будут динамическими адресами с "цепочкой офсетов"
Если при дальнейшем перезаходе в игру поинтер будет не верный , повтори пункт 3,4,5,6
таким образом в процессе отсеивания остаются 3 оффсета, которые успешно не работают на другом pc...
на другом компьютере есть огромная вероятность , что работать не будет , спросишь почему? Я отвечу - потому что распределение памяти у каждого компьютера происходит по разному , это зависит на прямую от операционной системы , размера оперативной памяти и еще многих факторов. Какой выход из ситуации?Выход очень прост - сделай простенький трейнер на том же СЕ с помощью АА или ЛуаСкрипта , с использованием AOB scan и я тебя уверяю - работать будет эта штука всегда и на всех компьютерах
-
ну во - первых отсев адресов ты не правильно делаешь , во-вторых в СЕ 6.2 есть такая штука - называется "Найти указатель на этот адрес"(в русской версии) - это автоматический поиск указателей , используй её , а в-третьих чем тебе статически адрес не нравится , найди статику , зачем тебе динамический адрес и еще и с кучей офсетов , что ты хочешь сделать?
-
Понимаешь, это тоже самое, что ко мне подойдёт человек на улице и попросит оставить ему свой номер телефона.
Но в твоём случае вопрос касается WinAPI, а не самого C++.
На MSDN дано описание функции, там всё написано чётко, коротко и ясно.
И задам тебе встречный вопрос, если не знаешь что это такое, то зачем используешь? Для каких целей?
моя цель - поиск байт и возврат динамического адреса, FindPattern не справляется с этой задачей(только для отдельных случаев) , если есть другой способ я только за , я о нем не знаю...На счет скайпа - это ты преувеличил......если ты чего-то боишься я могу для тебя создать скайп со своего ip и дать логин и пароль тебе.
-
Ты уж извини но давать свой скайп, я думаю никто не будет.
Тебе Xipho уже всё объяснил. И на MSDN описание функций очень понятное, так что нет такого варианта что ты мог не понять для чего она.
я просто не понимаю , что такого в скайпе объяснить.....Я не такой как вы , с++ мне трудно даётся - я не понимаю многого в с++ , поэтому и прошу помощи у Вас, объяснить какую-то функцию не можете......- она запретная какая-то ....?
-
Дело не в моих принципах. Просто, если я приведу тебе готовый код, ты его скопипастишь, и будешь использовать до тех пор, пока не возникнет какая-либо нестандартная ситуация, в которой у тебя снова возникнут проблемы. В этом случае ты снова будешь обращаться за помощью. А если же ты разберешься, какой функционал выполняет эта функция (тавтология, знаю), то уже в любой ситуации ты сможешь изменить свой код так, чтобы все работало. Даю наводку - VirtualQuery опрашивает регионы памяти, начиная с указанного ей адреса. В приведенном тобой коде, который ты где-то нашел, как раз в цикле перебираются все регионы памяти, пока не будет найден нужный. Тебе же этот код нужно изменить так, чтобы в каждой итерации цикла вызывалась функция FindPattern, в которую будут передаваться данные, полученные вызовом VirtualQuery. Если присмотришься к структуре MEMORY_BASIC_INFORMATION (а, точнее, почитаешь о ней на MSDN), увидишь, что в нее сохраняются некоторые данные. Что это за данные - легко понять по названиям членов структуры. Так вот, для FindPattern в каждой итерации вышеприведенного цикла тебе всего лишь нужно передавать определенные данные из указанной структуры. Ну и, разумеется, предусмотреть выход из цикла, если сигнатура найдена.
я ж и говорю давай в л\с объяснишь или в скайп на готовом коде , копипаст мне не нужен , мне нужно понять как работает , с удовольствием выслушаю тебя , мне это будет интересно и ты как раз будешь знать , что я не просто скопипастил код а еще и понял как он работает
-
я не знаю как её применить с 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){
}
}
}
} -
В твоем посте я не вижу примера твоего совместного применения VirtualQuery с функцией FindPattern. Вот когда приведешь своего применения - тогда я постараюсь помочь, и указать на возможные ошибки. А пока я лишь вижу, что ты процитировал вызов функции VirtualQuery из мсдн, и функцию FindPattern из урока Кодера.
я не знаю как её применить с FindPattern совместно - если ты на счет исходного кода , да я прошу помочь с исходным кодом , я не пойму как его сделать , на практике лучше всего обучаться.
На счет
VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );
я тут понимаю только переменную pvAddress, для чего mbi я не помойму.
Если объяснить на примере кода - это выше твоих принципов - я не знаю тогда, объясни в л\с или скайп.
-
как правильно использовать эту функцию и для чего она вообще(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" , как правильно её применить?
-
тему можно закрыть - выход из ситуации нашел
-
Правильнее будет, так как я тебе прислал)
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);
- тут косяк или поинтер иногда не читается или доступа не хватает или я не знаю что ему надо вообще...
-
Скорее всего CoordPlayerX принимает значение 0.
Проверку делай - if (CoordPlayerX != NULL)
спасибо тебе , а как можно сделать проверку на то - прочитался ли вообще адрес
CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);
так правильно???
if ( !ReadPointer) вернуть фолс или как правильнее будет?
-
Делаю следующее:
работаю с координатами:
1. создал класс (для тренировки)
class Coord;
class Coord
{
public:
float CoordX; //0x0000
char _0x0004[60];
static Coord* Singleton (int*address)
{
return (Coord*)address;
}
};//Size=0x00402.Создал поток в котором производил махинации с координатами:
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;
}
}
}все отлично работает , но есть одна ошибка,помогите разобраться в чем пожалуйста.
-
Поспешу разочаровать тебя, ты вызываешь не функцию, а ктулху походу (шучу ).
Ты обращаешься к полю класса.
В твоём же случае говорю тебе ещё раз, тебе нужно передавать ссылку на класс, а не переменную, которая хранит адрес класса.
тему можно закрыть.
вот так нужно было возвращать адресс ,если кому интересно, как и сказал кодер , "ссылку на класс", все работает , благодарность кодеру.
return (RecoilPlayer*)address;
-
тему можно закрыть - написал свою собственную функцию подсчета ФПС,кому интересно код ниже:
создаем переменные для подсчета
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);
} -
К сожалению может ты и знаешь, что она делает, но точно не знаешь как ей что-то делать.
Советую потренироваться на чём-нибудь попроще.
ты прав , но куда уж проще записи в адрес , дай скайп в п\м
-
Об этой функции ты можешь почитать здесь - http://www.cplusplus...cstring/memcpy/
толку-то , я знаю что она делает , не получается и все тут... с байтами проходит , а с остальным нет - крашит.
и так делал:
DWORD a = 0x1;
memcpy (&locPlayer ,&a, sizeof(DWORD));все равно нет толку.
-
пробуй через memcpy, если не получится перед записью выполняй VirtualProtect, а после восстанови исходную защиту памяти.
я не знаю вот так через мемспу?
VirtualProtect (locPlayer, 10 , PAGE_EXECUTE_READWRITE , &old_protect);
memcpy (locPlayer ,(DWORD*)0x1, 10 );
VirtualProtect (locPlayer, 10 , old_protect , &old_protect); -
Такая же ошибка как и в первой твоей теме.
DWORD* value = *(DWORD**)0x15F328C;
*value++;Как-то так, если мне память не изменяет, давно не занимался взломом игр.
Спасибо огромное , но не работает жалко очень , не могу элементарно в адрес записать.....
-
Столкнулся с проблемой записи в адрес:
необходимо в адрес записать какое-нибудь значение , ну к примеру когда я нажимаю ПКМ , к адресу прибавляется значение 1.
пробовал вот так сделать,не получилось:
DWORD a = *(DWORD*)(0x1);
DWORD b = *(DWORD*)(0x15F328C);
a+b;
b=b+a;//в потоке и в цикле ноль действий
и т..д.
------------------------------------------------------------
Как правильно делать запись вообще?
-
Смотри ты делаешь переменную, просто со значением адреса класса, но адрес у неё другой.
Тебе же надо сделать так, чтобы адрес этой переменной соответствовал адресу класса.
Вот к примеру:
// adress of class Player = 0x4000 (Player*);
int** address = &Player;Я туплю короче....
Я понимаю так :
когда я вызываю функцию
localPlayer->Recoil=100;
Я вызываю класс , в нем функцию возврата адреса и далее параметр класса "Recoil" , но адрес в "Recoil" получается не определен, и поэтому я пытаюсь писать в несуществующую область памяти?
directx c++ Visual Studio 2012
in Низкоуровневое программирование
Опубликовано
а скайп?
А по делу вот что: