helldrg
-
Постов
142 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные helldrg
-
-
Ого я разработчик!!! Уряяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя :DDDDDD
Спасибо большое!!! В честь этого допилю генералов! =)
-
partoftheworlD
По идеи не должно, наверно из за того что, флаги у меня все глобальные, надо будет поправить =) Спасибо о том, что предупредил, я сделаю, чтобы только одна копия могла быть активно в одно и тоже время
-
Цитата
сначала в настройках компиля надо вкл
Ну это понятно :DD
я так к char привык, этого хоть стоит?) Или может все таки A версии оставить?)
-
Цитата
+A версии постоянно хип юзают/конвертируют..
Я так понял это плохо
Вот, к примеру раньше я делал так (переменные типа char*)
FindWindow(className, windowName);
Нужно теперь так делать:
FindWindowA(className, windowName);Но так постоянно хип юзают/конвертируют.
Значит нужно оставить FindWindow(className, windowName); так, но поменять тип переменных?
Цитатанаверно имели ввиду GetThreadIOPendingFlag, зачем такое нужно в обычном трейнере
Да это не для трейнера =) Просто класс процесса делал, заодно с модулями и потоками решил поразбираться) GetThreadIOPendingFlag это наверное не то, он просто истину или ложь выводит, для поиска адреса или имени ничем не поможет
-
Цитата
ASCII табличка маленькая и в нее не все влезает. Например, какой-нибудь хинди или китайский традиционный - неа. Только латиница, только хардкор! Вопрос в том, так ли это надо.
То есть Use Multi-Byte Character Set это обозначает, что будет использоваться ASCII код? ASCII символ помещается в байт а UNICODE символ в 2 байта, на вики пишут что вроде уже 2 не достаточно
-
А так же я не вывел имена потоков, оставил до лучших времен, так как THREADENTRY32, я так понял не содержит имени
-
gmz
Я смотрю вы шарите в этой теме, вот есть вопросик =)
Я сделал класс для работы с процессами. Там я вывожу имена адрес потока:
Скрытый текстtypedef LONG NTSTATUS; typedef NTSTATUS(WINAPI *pNtQIT)(HANDLE, LONG, PVOID, ULONG, PULONG); #define STATUS_SUCCESS ((NTSTATUS)0x000 00000L) #define ThreadQuerySetWin32StartAddress 9 DWORD WINAPI GetThreadStartAddress(HANDLE hThread) { NTSTATUS ntStatus; HANDLE hDupHandle; DWORD dwStartAddress; pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryInformationThread"); if (NtQueryInformationThread == NULL) return 0; HANDLE hCurrentProcess = GetCurrentProcess(); if (!DuplicateHandle(hCurrentProcess, hThread, hCurrentProcess, &hDupHandle, THREAD_QUERY_INFORMATION, FALSE, 0)) { SetLastError(ERROR_ACCESS_DENIED); return 0; } ntStatus = NtQueryInformationThread(hDupHandle, ThreadQuerySetWin32StartAddress, &dwStartAddress, sizeof(DWORD), NULL); CloseHandle(hDupHandle); //if (ntStatus != STATUS_SUCCESS) return 0; return dwStartAddress; } THREADENTRY32 ProcessClass::GetThreadListByPID(DWORD pid) { THREADENTRY32 result = {}; HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, pid); if (snapshot != INVALID_HANDLE_VALUE) //Create snapshot of processes { THREADENTRY32 thread;// write here about find processes thread.dwSize = sizeof(THREADENTRY32); if (Thread32First(snapshot, &thread)) { do { if (thread.th32OwnerProcessID != pid) continue; HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION, FALSE, thread.th32ThreadID); DWORD dwThreadStartAddress = GetThreadStartAddress(hThread); CloseHandle(hThread); //printf("Thread list by Pid: %d\n", thread.th32OwnerProcessID); //printf("TID: %d, Base Address: %x, Size: %x, Name: %x\n", thread.th32ThreadID, dwThreadStartAddress, thread.dwSize, thread.dwSize); } while (Thread32Next(snapshot, &thread));// find it } else { } } else { } CloseHandle(snapshot); return result; }
На msdn NtQueryInformationThread пишут, что это функция может быть не доступна в будущих версиях, используйте альтернативу, а какую альтернативу там не написали)
-
Цитата
там есть szModule
Спасибо большое!!! Этот момент я упустил!!!!!!
Цитатаunicode билд обязательно (все равно на вин98 не запустится)
Да я понял что L подставляешь и пишешь строку, а почему юникодом надо пользоваться?)
-
Цитата
Я знаю что структура содержит, я не знаю что такое K32GetModuleBaseName. Я так понял это другое определение GetModuleBaseName в какой то версии psapi, но почему вы так назвали эту функцию? Запутать хотели ?))
-
Ты наверно про это GetModuleBaseName
Скрытый текстbool ProcessClass::GetModuleByName(char *name, DWORD pid) { bool result = false; HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); if (snapshot != INVALID_HANDLE_VALUE) { MODULEENTRY32 module; module.dwSize = sizeof(MODULEENTRY32); if (Module32First(snapshot, &module)) { do { if (module.th32ProcessID != pid) continue; TCHAR szName[MAX_PATH]; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid); GetModuleBaseName(hProcess, module.hModule, szName, MAX_PATH); if (_stricmp(szName, name) != 0) { strcpy_s(szName, ""); continue; } m_module = module; CloseHandle(hProcess); result = true; break; } while (Module32Next(snapshot, &module)); } else { result = false; } } else { result = false; } CloseHandle(snapshot); return result; }
А почему ты называешь K32GetModuleBaseName ?
Я так делал потому что имя модуля в MODULEENTRY32 хранится вместе с путем, можно было сроку обработать и получить только имя, но я просто воспользовался этой функцией GetModuleBaseName
-
Цитата
в DLL было бы круче
В dll я сделаю попозже, меню будет прямо в игре, я к директ икс устройству игры подключусь и там все выведу)
Цитата2 можешь удалить CRT мусор изменив ентри на.. например _Main (вроде в вс2015.3 исправили) - будет еще меньше по размеру
Я давно что то читал про это, я помню как в консольном приложении это делали, а вот в винапишном не препоминаю
Цитата3 unicode билд обязательно
А можно по подробней?
Цитатафорс админ права не нужно (манифест тот)
Просто чтобы чит работал надо от имени администратора запускать, мне надоело постоянно так запускать я взял и в настройках поставил =)
Цитатадля OpenProcess желательно подбирать права типа PROCESS_VM_OPERATION+PROCESS_VM_READ+PROCESS_VM_WRITE тд тп
Я делал как keng советовал в своих уроках, так что если что не так его ругать надо :DDD
ЦитатаK32GetModuleBaseName что там делает? в структуре от Module32Next уже есть имя ProcessEntry.szExeFile
Вот это я немного не понял
Цитата7 можно заюзать K32EnumProcesses\K32EnumProcessModules\K32GetModuleBaseNameW - они быстрее (вин7+)
Про них почитаю сегодня
Цитата8 шрифт добавь! Lol
я цвет текста замучался менять, а тут шрифт)
-
Цитата
PS: Никогда бы не подумал, что в моем нике можно ошибиться.
аахахах извиняюсь, уже поздно было, спать хотелось
Спасибо всем, приятное сообщество здесь =)
-
Всем привет! До пилил наконец то кое как свой трейнер для игры C&C:Generals v1.8 с процессом generals.exe, урезав множество опций и упростивши интерфейс до нельзя. Урезал и упростил из - за подобного кода:
Скрытый текстbytes[0] = '\xe9'; (DWORD&)(*(bytes + 1)) = GetInAllocMemPos(1) - (baseAddress + offsetAddress[1]) - 5; bytes[5] = '\x90'; if (Process.WriteMemory(baseAddress + offsetAddress[1], (LPVOID)bytes, jmpSrcAddressSize[1]) == FALSE) wsprintf(buffer, "Ошибка!"); bytes[0] = '\x50'; bytes[1] = '\x8b'; bytes[2] = '\x81'; bytes[3] = '\x44'; bytes[4] = '\x01'; bytes[5] = '\x00'; bytes[6] = '\x00'; bytes[7] = '\x81'; bytes[8] = '\x78'; bytes[9] = '\x08'; bytes[10] = '\x70'; bytes[11] = '\x6c'; bytes[12] = '\x61'; bytes[13] = '\x79'; bytes[14] = '\x0f'; bytes[15] = '\x85'; (DWORD&)(*(bytes + 16)) = (GetInAllocMemPos(1) + 53) - (GetInAllocMemPos(1) + 15) - 5; bytes[20] = '\x8b'; bytes[21] = '\x81'; bytes[22] = '\x10'; bytes[23] = '\x01'; bytes[24] = '\x00'; bytes[25] = '\x00'; bytes[26] = '\x3d'; bytes[27] = '\x00'; bytes[28] = '\x01'; bytes[29] = '\x00'; bytes[30] = '\x00'; bytes[31] = '\x0f'; bytes[32] = '\x8e'; (DWORD&)(*(bytes + 33)) = (GetInAllocMemPos(1) + 53) - (GetInAllocMemPos(1) + 32) - 5; bytes[37] = '\xd9'; bytes[38] = '\x40'; bytes[39] = '\x14'; bytes[40] = '\xd9'; bytes[41] = '\x58'; bytes[42] = '\x08'; bytes[43] = '\xc7'; bytes[44] = '\x81'; bytes[45] = '\x34'; bytes[46] = '\x01'; bytes[47] = '\x00'; bytes[48] = '\x00'; bytes[49] = '\x00'; bytes[50] = '\x00'; bytes[51] = '\xc8'; bytes[52] = '\x42'; bytes[53] = '\x58'; bytes[54] = '\xd9'; bytes[55] = '\x81'; bytes[56] = '\x34'; bytes[57] = '\x01'; bytes[58] = '\x00'; bytes[59] = '\x00'; bytes[60] = '\xe9'; (DWORD&)(*(bytes + 61)) = (baseAddress + offsetAddress[1]) - GetInAllocMemPos(1) - jmpDestAddressSize[1] + jmpSrcAddressSize[1]; if (Process.WriteMemory(GetInAllocMemPos(1), (LPVOID)bytes, jmpDestAddressSize[1]) == FALSE) wsprintf(buffer, "Ошибка!");
Так как я понимаю, что все таки не правильно что то делаю. Хороший, качественный и чистый код не должен так выглядеть, поэтому я немного расстроился =) и решил подождать новых уроков от вашего сообщества, так как я люблю программирование, но вот такое программирование меня утомляет. Может кто то играет в эту игру ему пригодится этот трейнер. Его возможности можно увидеть на скрине:
Далее я попробую этот чит сделать в стиле metro, так как стандартными средствами winapi очень трудно добиться такого результата.
Ну и если трейнер соберет больше 10 лайков, то я добавлю, то, что в последний момент урезал (по разным причинам: не доделал, доделал, но выглядит код ужасно как выше приведенный код и просто поленился) следующие функции:
- активацию опции по нажатию клавиш;- описание трейнера в пункте об трейнере, который должен быть на серой полоске;
- опцию map hack
- опцию режим Бога- ползунок для изменения положения камеры по оси Z (в настоящее время она отдаляется на 600 условных едениц, по стандарту стоит приблизительно 300)
- и на последок завезу оптимизацию, то есть проц будет нагружиться приблизительно в 15 раз меньше, во всяком случае на моем компьютере, то есть сделаю чтобы основной цикл программы проходил 30 раз за секунду, а не как сейчас несколько тысяч раз
PS:Последний абзац написан в лучших традициях байта на лайки :DDDDDD
Ох да, чуть не забыл скинуть программу =) Трейнер будет доступен 90 дней с момента публикации
http://rgho.st/89Jw7rhCm
Особые благодарности: kenq - за отличные видеоуроки и Dino - за невероятно доступное, понятное объяснение непонятных мне аспектов- 5
-
keng
Я попытался осмыслить, но, надо в отладчик лезть) Сегодня уж попытаюсь доделать трейнер на с++ и winapi, выложу, и почитаю про с++ и xaml, что бы сделать трейнер в стиле metro и баи) А завтра уже попробую в DetourFunc вникнуть
А пока у меня такое представление: для всего этого нужно:
1) адрес, где будет производится переход на нужный нам код (baseAddress + offsetAddress) адрес модуля и смещения в нем
2) размер кода перехода jmpSrcAddressSize - в него входит 5 байт для перехода и нопы, в случае необходимости
3) размер кода для которого мы выделили память jmpDestAddressSize туда входит код и 5 байт для перехода4) массив байт с кодом который мы записываем new byte[jmpDestAddressSize] там находится код вместе с переходом
5) массив байт для восстановления, в случае если решили отключить опцию, также этот параметр нужен для определения куда нужно возвращаться после выполнения нашего кода
Зная это нужно рассчитать адреса для перехода в выделенную памятьСкрытый текстbytes[0] = '\xe9'; (DWORD&)((*(bytes + 1))) = allocAddress - (baseAddress + offsetAddress[0]) - 5; bytes[5] = '\x90'; bytes[6] = '\x90'; bytes[7] = '\x90'; bytes[8] = '\x90'; bytes[9] = '\x90'; bytes[10] = '\x90'; if (Process.WriteMemory(baseAddress + offsetAddress[0], (LPVOID)bytes, jmpSrcAddressSize[0]) == FALSE) wsprintf(buffer, "Ошибка!");
и надо рассчитать адрес возвращения
Скрытый текстjmpAddress = (baseAddress + offsetAddress[0]) - allocAddress - 10 + jmpSrcAddressSize[0]; memcpy((void*)bAddres, &jmpAddress, 4); bytes[0] = '\x83'; bytes[1] = '\x7f'; bytes[2] = '\x08'; bytes[3] = '\x02'; bytes[4] = '\x0f'; bytes[5] = '\x84'; bytes[6] = bAddres[0]; bytes[7] = bAddres[1]; bytes[8] = bAddres[2]; bytes[9] = bAddres[3]; jmpAddress = (baseAddress + offsetAddress[0]) - allocAddress - jmpDestkAddressSize[0] + jmpSrcAddressSize[0]; memcpy((void*)bAddres, &jmpAddress, 4); bytes[10] = '\x89'; bytes[11] = '\x47'; bytes[12] = '\x04'; bytes[13] = '\xc7'; bytes[14] = '\x44'; bytes[15] = '\x24'; bytes[16] = '\x74'; bytes[17] = '\xff'; bytes[18] = '\xff'; bytes[19] = '\xff'; bytes[20] = '\xff'; bytes[21] = '\xe9'; bytes[22] = bAddres[0]; bytes[23] = bAddres[1]; bytes[24] = bAddres[2]; bytes[25] = bAddres[3]; if (Process.WriteMemory(allocAddress, (LPVOID)bytes, jmpDestkAddressSize[0]) == FALSE) wsprintf(buffer, "Ошибка!");
в первой строчке минус 10, потому что в коде находится 2 джампа,1 проверочный, если требования не выполняются то раньше возвращаемся в программу
И вот это все применить к DetourFunc, меня просто в ужас бросает, надеюсь отладчик поможет =)
-
keng
Сложнооо) Я пользуюсь функциями записи, чтения, выделения и освобождения памяти, из ваших уроков по созданию трейнеров. Вы не успели записать новые по тому как рассчитываются адреса для прыжков, и как эти адреса соединять с кодом, вот и додумываю =) Я даже с комментариями понять не могу эту функцию =(((((
-
Цитата
Не очень понимаю, зачем массив байт делать указателем
Я делаю сразу несколько опций чита и все сдвиги и размеры находятся в массивах, и у меня выглядит не так
byte *bytes = new byte[20];
а вот так
byte *bytes = new byte[jmpBackAddressSize[0]];
если делать не указателем, то так нельзя сделать:
byte bytes[jmpBackAddressSize[0]];
-
Здравствуйте! Потихоньку пишу и оптимизирую трейнер и возник вопрос:
1) Корректно ли писать так:
DWORD jmpAddress = 0; byte *bytes = new byte[20]; jmpAddress = allocAddress - (baseAddress + offsetAddress[0]) - 5; ... memcpy((void*)&(*(bytes+1)), &jmpAddress, 4);
2) Я сократил количество кода заменив memcpy на такое выражение
Цитата(DWORD&)((*(bytes + 1))) = allocAddress - (baseAddress + offsetAddress[0]) - 5;
Как с точки зрения "Чистого кода" можно так делать?
-
Цитата
Зато зимой за место мини камина была эта карта.
:DDD
У меня интегрированная карта, наверно поэтому холодный воздух дуетPS: Зима близко =)
-
Цитата
Деловой что ли самый думаешь а у меня напольный вентилятор и корпус открыт - как врубил, там что хочешь выдует.
Вот шутки шутками, у меня корпус стоит рядом с креслом где я сижу, а из корпуса воздух выдувается прям в ноги, я поначалу думал застужу и носки одевал, а щас освоился, закалился :DD
-
14 минуты назад, partoftheworlD сказал:
Таких бы штук 8 поставить.
Ими наверно комнату летом можно будет охладить
-
У меня бсоды за всю жизнь тока из за аппаратной части случались из за плохого контакта жесткого диска с материнской платой например. Постоянно приходилось в системник лазать, шевелить провода =)
А когда новый компьютер собрал, у меня кулер не подошел хотя материнка поддерживала такие крепления. Так я системник перевернул и на процессор просто положил кулер. Компьютер работал несколько минут и выключался, охлаждения не хватало. Так у меня дома камни были(даже не спрашивайте откуда =) ) я на кулер положил, так несколько месяцев все отлично работало, пока не соизволил другой кулер приобрести- 1
-
Цитата
а вот спектрум я, к сожалению, не застал.
Я о таком даже не слышал, теперь буду знать, что был такой =)
Мы как то проходили программирование на 80-ом процессоре(советском) не много напоминает. Ну как программировали, в отладчике сидели и все((
-
Цитата
А я застал и Дос и win 3.1 и 95 и 98 и Хрюшу
А Вы динозавров видели? :DDDDD
Или можно так, а Вы с Бэббиджом знакомы? -
Цитата
Самая первая система были линукс
Я теперь понимаю как стать прошаренным. Надо изобрести машину времени, вернуться в 2009 за день до появления компьютера и уговорить родителей чтобы они мне взяли компьютер не с вистой, а с линуксом или windows 2000. Про 95 98 даже в то время я ничего не слышал, вышли из моды так сказать =)
Мой первый трейнер
in Общение
Опубликовано
Так делай читы и выкладывай и ты по определению станешь разработчиком =)