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

VDV

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

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

  • Посещение

Весь контент VDV

  1. Я не понимаю что ты имеешь ввиду... в плане кода
  2. каким образом , объясни пожалуйста на "пальцах" , создать указатель на указатель?
  3. вывел - то есть не выводит , крашит. ---------------------------------------------------- Вопрос такой , а как сделать чтобы не было видно что мы что-то меняли , ну к примеру чтобы изменить отдачу , мы нопим нужную нам функцию , при этом изменяем байты , а как сделать чтобы , отдачу мы изменили , а байты на месте остались и типа мы нечего не изменяли , у тебя есть уроки об этом? и как это сделать ,в чем смысл?
  4. практиковался по видео уроку Кодера , а именно "реверсинг". ------------------------------------------ сам код: начал с простенького,отреверсил , скопировал класс c генератора РЕКЛАССА , класс простенький , состоящий только из одного параметра(для тренировки) class RecoilPlayer; class RecoilPlayer { public: __int32 Recoil; //0x0000 char _0x0004[60]; static RecoilPlayer* Singleton (int*address) { return *(RecoilPlayer**)address; } };//Size=0x0040 далее: CreateConsole(); DWORD Recoil_Eng = (DWORD)GetModuleHandle("Game.exe") + 0x13F135C; DWORD offsets[] = {0x50 , 0x138 , 0xC , 0x4 , 0x3C}; int* locPlayer = ReadPointer(Recoil_Eng, offsets ,5); RecoilPlayer* localPlayer = RecoilPlayer::Singleton(locPlayer); printf (" address = %X\n%X\n%d\n" , Recoil_Eng , locPlayer , localPlayer); localPlayer->Recoil = 100; в отладочной консоле все верно - Recoil_Eng - поинтер верный , locPlayer - адресс верный , localPlayer - значение адреса соответственно верное. При попытке localPlayer->Recoil = 100; - краш,не могу понять , в чем дело. ========================================================================== Я правильно понимаю , что мы создаём копию игрового класса и изменяем эту копию , а не сам адрес и поэтому при просмотре в СЕ сам адрес не будет изменен никак , а будет изменена только наша копия класса?
  5. ешь , ешь она для мозгов полезна , если что , а рисую я в энд саин и все равно мерцает
  6. нужно сделать саму функцию сначала , а затем с помощью неё искать , я правильно рассуждаю , она будет аналогична FindPattern , да что там идентична?
  7. Получается что для игры каждый раз выделяется некоторая область памяти (по разному при каждом перезаходе), значит мне нужно сканировать область выделенной памяти - я правильно мыслю? мне нужна вот эта штука(для dll)? HRESULT VirtualQuery ( [in] void* lpAddress, [out] void* lpBuffer, [in] SIZE_T dwLength, [out] SIZE_T* pResult );
  8. это я знаю что длина - это просто пример я показал. Все правильно ухожу за пределы , но если я в функции указываю DWORD pattern_address2 = FindPattern (модуль,его длину , (PBYTE)"\x72\x65\x63\x6F\x69\x5F" , "xxxxxx"); то адрес не находится , потому что я сканирую длину модуля (к примеру от 0х1000 до 0х2000) , а адрес находится, к примеру,от 0х3000 до 0х3100 и не принадлежит не к какому модулю, как быть? Если я укажу в FindPattern (0х3000,0х100 ,)(к примеру) то FindPattern начнет сканировать этот участок памяти и где-нибудь в диапазоне от 0х3050 до0х3080 будет "память за пределами" , а адрес который мне нужен будет 0х3090 и когда сканер дойдет до 0х3050 будет краш , как правильно сделать?
  9. вот тебе вопрос: Например ,если я сканирую массив байт в пределе игрового модуля , допустим модуль "crysis.exe" начало 0х100000 конец 0х200000 (размер 100000 получается), то я нахожу нужный мне адрес по массиву байт ,все отлично работает. НО !!! если мне нужно просканировать к примеру район от 0х3000000 до 0х4000000(так как в этом районе памяти находится динамический адрес , который мне нужен,при каждом перезаходе в игру адрес меняется ,но остаётся в этом участке памяти) и этот район памяти не является не одим модулем игры (выделенный участок динамической памяти). Проблема вот в чем - в данном участке памяти от 0х3000000 до 0х4000000 нужный мне адрес может находиться как по адресу ,к примеру, 0х3155FF00 ,а после перезахода в игру, по адресу 0х4000000 - думаю это понятно что ДМА. Но каждый раз в этом диапазоне памяти при перезаходе в игру есть места памяти которые недоступны для чтения\записи , мало того этот участок памяти может быть к примеру от 0х3000000 до 0х3200000 , а адрес который мне нужен 0х3500000 , при перезаходе в игру участок не читаемой\записываемой памяти будет от 0х3400000 до 0х3600000 а адрес нужный мне 0х3100000. Поэтому когда FindPattern сканирует заданный диапазон памяти (от 0х3000000 до 0х4000000 к примеру) и натыкается на участок не читаемой\записываемой памяти - происходит краш игры,как это избежать. Объяснить очень тяжело было , но я попытался. Смысл в том , что когда Find Pattern натыкается на недоступную для чтения\записи память - краш. (все в dll, не винапи) DWORD pattern_address2 = FindPattern (0x16000000,0x18000000 , (PBYTE)"\x72\x65\x63\x6F\x69\x5F" , "xxxxxx");
  10. Друг давай без нравоучений - просто скажи что в коде не верно , а я сам разбирусь что к чему. p.s. если ты хорошо знаешь программирование - это не значит что нужно всем незнающим говорить что они глупые и вообще не в ту степь лезут. Да , я не мастер в программировании , но код я брал ТВОЙ из ТВОЕГО урока и с ТВОИМИ объяснениями, также этот код я попросил проверить у "King Orgy" через "teem viewer" он не поленился и уделил немного времени , подправил кое-что и сказал что "вот в таком виде как сверху" верно - и проблема в хуке - я не смог переписать хук , так , чтобы не крашило и обратился на русскоязычный сайт,думал что тут помогут ...делаем вывод .... Хочешь для сравнения я тебе опишу похожую ситуацию? Это как если бы ты вышел со мной на спарринг(бокс) и простоял со мной 1 раунд и спросил бы "у меня нечего не получается , может у меня стойка не правильная или я не так бью?" и я тебе после этого сказал бы "иди ка ты домой и читай книжки о боксе и пока отжиматься не научишься 150 раз , а потом бегать 10 км без передышки , а после этого отстоять спарринг с перворазрядником , у тебя нечего получится в боксе , как все это научишся делать так и молодец будешь"
  11. не нашел ответа на свой вопрос - так как у меня запись не в конкретный адрес , а в массив байт
  12. не могу записать в массив байт , просьба найти ошибки или подсказать что не правильно в коде(исходный код из урока кодера) DWORD WINAPI Game_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule ,DWORD ul_reason_for_call , LPVOID lpReservid ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL,NULL,Game_thread,NULL,NULL,NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } BOOL bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) { for(;*szMask;++szMask,++pData,++bMask) { if(*szMask == 'x' && *pData != *bMask) return 0; } return (*szMask)==NULL; } 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; } DWORD WINAPI Game_thread (LPVOID) { DWORD old_protect = 0; for(;;/*Sleep(75)*/) { DWORD Recoil = FindPattern (0xFFFFFF , NULL , (PBYTE)"\x72\x65\x63\x6F\x69\x6C\x20\x61" ,"xxxxxxxx"); VirtualProtect ((PBYTE)Recoil, 8 , PAGE_EXECUTE_READWRITE , &old_protect); memcpy ((void*)Recoil ,PBYTE("\x71\x65\x63\x6F\x69\x6C\x20\x61"), 8 ); VirtualProtect ((PBYTE) Recoil, 8 , old_protect , &old_protect); } } Смысл в том чтобы заменить массив байт \x72\x65\x63\x6F\x69\x6C\x20\x61 на \x71\x65\x63\x6F\x69\x6C\x20\x61. Все нормально компилируется , но при инжекте краш игры.
  13. всю память мне нужно сканировать - а лиш часть памяти от 06000000 до 07000000 там находятся нужные мне адреса
  14. не надо извинятся - ты все правильно говоришь , код в попыхах кривой кинул - это моя ошибка , как работает код я понимаю(спс Кодеру за уроки огромное!) , запись в память тоже работает , у меня не работает одно - я не могу сделать сканер который бы искал все адреса принадлежащие массиву байт "72 65 63 6F 69 6C 5F 61 74 74 00 00 01 31 F8 16" , а затем к найденным адресам прибавлял смещение + 20 , а затем значение найденных адресов с уже прибавленным смещением +20 приравнивал к адресу 0х123FFB8 вот такую сложную штуку я не могу решить. Если кто-то на что-то обиделся так и скажите...хотя я не кого не оскорбил и не унизил вроде бы......
  15. ну во первых за код спасибо , но он не работает во - вторых я некого не оскорбил!либо ты не знаешь что такое слово "оскорблять" , либо тебе нужно вести себя как мужчина. в - третьих длл я понимаю что такое (как раз таки азы)и код типа: DWORD WINAPI thread (LPVOID); DWORD APIENTRY D3Dmain (HMODULE hModule ,DWORD ul_reason_for_call , LPVOID lpReservid ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL,NULL,thread,NULL,NULL,NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } int* ReadPointer (DWORD base , int offsets[] , int level) { int* pointer = (int*) base; for (int i=0; i<level; i++) { pointer = (int*)(*pointer + offsets[i]); } return pointer; } DWORD WINAPI thread (LPVOID) { DWORD old_protect = 0; for(;;Sleep(75)) { if(GetAsyncKeyState(VK_DOWN)&1) { //if(GetAsyncKeyState(VK_DOWN) &1) //{ //int offsets[5] = {0x3B4,0xF4,0xC,0x4,0x3C}; //DWORD base = 0x0200118C; //int* pointer; //pointer = ReadPointer(base , offsets , 5); VirtualProtect ((PBYTE)"\0x6C \0x5F \0x61 \0x74 \0x74 \0x00 \0x00 \0x01" , 4 , PAGE_EXECUTE_READWRITE , &old_protect); memcpy ((PBYTE) "\0x6C \0x5F \0x61 \0x74 \0x74 \0x00 \0x00 \0x01" ,PBYTE("\0x6C \0x5F \0x60 \0x74 \0x74 \0x00 \0x00 \0x01"), 4 );//72 65 63 6F 69 6C 5F 61 74 74 00 00 01 31 F8 16 VirtualProtect ((PBYTE)"\0x6C \0x5F \0x61 \0x74 \0x74 \0x00 \0x00 \0x01", 4 , old_protect , &old_protect); } } не работает(уроки я смотрел) p.s. вместо того чтобы намекнуть хотя бы ,я не говорю уже про "объяснить" .......
  16. я для этого и обратился на этот форум , чтобы "повысить уровень моих знаний" - от воздуха они не повышаются к сожалению...кроме слов MSDN и ты слаб еще я нечего путного не услышал - очень жалко...
  17. что-то типа этого??? я запутался.... bool VerifyAddress(HANDLE hProcess, DWORD dwAddress, PBYTE bMask, char *szMask) { PBYTE *pTemp = { 0 }; for ( int i = 0; *szMask; ++szMask, ++bMask, ++i ) { if ( !ReadProcessMemory( hProcess, reinterpret_cast<LPCVOID>(dwAddress + i), &pTemp, 2048, 0 ) ) return false; if ( *szMask == 'x' && reinterpret_cast<char*>(pTemp) != reinterpret_cast<char*>(*bMask)) return false; } return true; } DWORD ForzaExternalFindPattern( HANDLE hProcess, PBYTE bMask, char *szMask ) { for ( DWORD dwCurrentAddress = 0x401000; dwCurrentAddress < 0x7FFFFFF; dwCurrentAddress++ ) if ( VerifyAddress( hProcess, dwCurrentAddress, bMask, szMask ) ) return dwCurrentAddress; return -1; } DWORD address = 0; address = ForzaExternalFindPattern(yourprocesshandle, (BYTE*)"байты", "маска") кстати этот код тоже не работает....почему-то,другого я не придумал...
  18. дак кодер сказал , что этот сканер не для dll а для винапи
  19. а как правильно сделать и чтобы работало быстро. Смысл в том, чтобы создать цикл который будет сканировать участок памяти игры (от 0х06000000 до 0х07000000 ) и выдавать все адреса которые будут найдены по этому массиву байт ("\0x03\0x00\0x00\0x11\0xFF\0xFF\0xFF\0xFF").
  20. Я хочу сделать цикл - то есть , чтобы постоянно сканировалась память и постоянно находились адреса - не будет ли это работать очень медленно? если да , то как можно ускорить? получился вот такой код: Хендл на процесс DWORD GetProcessByName (char*pName) { DWORD pID = 0; HANDLE snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0); PROCESSENTRY32 pInfo; pInfo.dwSize = sizeof (PROCESSENTRY32); if (Process32First(snapshot,&pInfo)) { while (Process32Next(snapshot,&pInfo)) if (_stricmp(pName,pInfo.szExeFile)==0) { pID = pInfo.th32ProcessID; CloseHandle(snapshot); break; } } CloseHandle(snapshot); return pID; } DWORD pID = GetProcessByName("Game.exe"); void GetModuleInfo(MODULEENTRY32& module, char* module_name, bool main_process) //(из класса MemoryEditor), если хочешь юзать вне класса, //не забудь pID дополнительно передавать { HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID); module.dwSize = sizeof(MODULEENTRY32); if (Module32First(snapshot, &module)) { if (main_process) { CloseHandle(snapshot); } while (Module32Next(snapshot, &module)) { if (_stricmp(module.szModule, module_name) == 0) { CloseHandle(snapshot); } } } } #define MAX_ADDRLISTSIZE 255 void FindPattern (DWORD* addrList, // массив адресов BYTE& matches, // кол-во совпадений DWORD start_address, // начало сканирования DWORD length, // сколько памяти просканируем BYTE* pattern, // вставка char *mask) // маска { matches = 0; // счётчик совпадений for (DWORD i = 0; i < length; i++) { if (DataCompare (ReadMemory<BYTE*>(start_address + i), pattern , mask)) // если мы нашли совпадение { addrList[matches] = (DWORD)(start_address + i); /* Записываем в наш список адресов найденный адрес (стартовый адрес + i (кол-во уже просканированных байт))*/ matches++; // увеличиваем счётчик совпадений } } } void findPatterns() { DWORD addressList[MAX_ADDRLISTSIZE] = {0}; // список адресов BYTE matches = 0; // кол-во совпадений MODULEENTRY32 peInfo = {0}; GetModuleInfo(peInfo, "Game.exe", true); // берём инфу о самом процессе FindPattern(addressList, // передаём наш массив функции (в него она запишет адреса) matches, // передаём ей наш счётчик, куда функция запишет кол-во совпадений (DWORD)0x06000000, // откуда сканируем? базовый адрес приложения (DWORD)0x07000000, // сколько сканируем? размер приложения (PBYTE)"\0x03\0x00\0x00\0x11\0xFF\0xFF\0xFF\0xFF", // наша вставка "xxxxxxxx"); // наша маска for (BYTE i = 0; i < matches; i++); //printf("Result #%d = 0x%X\n", addressList[i]); //PrintText2(50, 50, WHITE, dMenu.pFont, "Result #%d = 0x%X\n" , addressList); } Краш при инжекте или просто игра зависает . Все дело в функции "FindPattern" наверно она не правильно передаёт значение аргументов??? Помогите разобраться в чем ошибка
  21. спасибо большое , у тебя очень понятно и граматно все в видео уроках, поэтому учился по твоим исходам и использую в основном их
×
×
  • Создать...

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

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