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

Merlin

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

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

  • Посещение

Сообщения, опубликованные Merlin

  1. Если я правильно понял, список всех хэндлов в системе можно получить через функцию NtQuerySystemInformation, оттуда уже выбрать хэндлы нужного процесса.

    Пытался воспользоваться примером отсюда, но в студии возникли ошибки, которые я не смог побороть, что бы запустить:

    f8476305ae3f.png

    51e74da90694.png

     

  2. 10 часов назад, partoftheworlD сказал:

    Установи бряк на функции которые используют сокет, тогда найдёшь откуда качается файл, и найдёшь проверку "целостности"

    Хорошая идея, буду пробовать!

     

    10 часов назад, partoftheworlD сказал:

    Так же можешь просто подменять модуль на его копию, как это сделать есть на форуме.

    Буду признателен, если кинете мне ссылку, через поиск найти не удалось :rolleyes:

  3. Всем доброго времени!

    Пытаюсь обойти санкции на кол-во открытых окон в игре Path of Exile (PoE):

    Взять можно тут:

    Скрытый текст

     

    Посмотрев множество различных материалов команды GameHackLab, пытаюсь осваивать Assembler и С++.

    В качестве первого и основного инструмента реверсинга был(а) выбрана Odbg201.

     

    Информация об exe-файле:

    Скрытый текст

    9e97878aeb2d.png

     

    Текст ошибки(санкции) при запуске 3-его окна:

    Скрытый текст

    1b434eadcca2.png

     

    Сам обход ограничений, не оказался проблемой, благодаря видео широкого сообщества с просторов интернет'а, достаточно было:

     

    1. Найти текст из окна с ошибкой.

    Скрытый текст

    28c1c5015a26.png

     

    2. Заменить условие:

    Скрытый текст

    d09e9cc7379f.png

     

    Но, как показала практика, разработчики сделали в exe-шнике проверку на целостность файлов, в том числе библиотек, если изменённый файл сохранить, то в момент запуска он будет обратно заменен на оригинальный файл, соответственно, всё редактирование кода, -не зачёт!

    Подскажите, пожалуйста, какой адрес процедуры надо вызвать, что бы запустить exe минуя проверку целостности?

     

  4.  

    1 час назад, elvis66666 сказал:

    чуть короче

    Спасибо за совет, но такой способ не подходит, т.к. на выходе получается уже другой тип данных, char превращается в string, а нужно, что бы итог оставался в char, т.к. дальше планируется использовать функцию send, которая требует именно char:

    Скрытый текст
    
    int send(
      _In_       SOCKET s,
      _In_ const char   *buf,
      _In_       int    len,
      _In_       int    flags
    );

     

    Пример Xipho вполне подходит, только необходимо добавить -1 к переменным размера, что бы между соединяемыми данными не вклеивался нулевой байт (41:00:42)

    int partSize = sizeof(part) * sizeof(part[0])-1;
    int sessionKeySize = sizeof(session_key) * sizeof(session_key[0])-1;

     

    • Плюс 1
  5. Всем привет!

    Вторые сутки не удаётся на C++ соединить (склеить) два массива char значений (part+session_key) в один char массив (result).

    Где-то пробел в понимании  :(

    Код:

    Скрытый текст
    
    #include <iostream>
    #include <Windows.h>
    #include <conio.h>
    
    
    using namespace std;
    
    int main() {
    
    	char part[215] = "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41";
    	char session_key[17] = "\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42";
    	
    	char result[216] = { NULL };
    
    	strcat_s(result, 216, part);
    	strcat_s(result, 232, session_key);
    
    	for (int i = 0; i < (sizeof(result)-1); i++)
    	{
    		printf("%02x", result[i]);
    
    		if (i < (sizeof(result) - 2)) {
    
    		printf("%s",":");
    
    		}
    	}
    
    	while (1) {
    
    	}
    }

     

     

    Ожидаемый результат (part+session_key):

    Скрытый текст

    41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:42:42:42:42:42:42:42:42:42:42:42:42:42:42:42:42

     

    А выходит:

    Скрытый текст

    41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:41:42

     

    Подскажите, пожалуйста, как правильно объединить массивы без потери значений?

  6. Мой вопрос тоже решился. Нужно было установить Debug привилегии у текущего процесса:

    Скрытый текст
    
    void EnableDebugPrivilege(bool fEnable)
    {
    
    	if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    	{
    		TOKEN_PRIVILEGES tp;
    		tp.PrivilegeCount = 1;
    		LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
    		tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
    		AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL);
    		CloseHandle(hToken);
    	}
    }

     

     

  7. WoW.exe всегда запускается с правами администратора, иначе его запустить просто нельзя, скомпилированный Trainer.exe (даже при запуске с правами администратора) не может получить доступ к WoW.exe, доступ работает почему-то только при запуске из Visual Studio). Соответственно функция GetModuleBaseAddress тоже не возвращает результат без запущенной студии. :unsure:

    Скрытый текст
    
    DWORD ProcessManager::GetModuleBaseAddress(DWORD ProcID, TCHAR* ModuleName)
    {
    	DWORD_PTR ModuleBaseAddress = 0;
    	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, ProcID);
    	if (hSnapshot != INVALID_HANDLE_VALUE)
    	{
    		MODULEENTRY32 ModuleEntry32;
    		ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
    		if (Module32First(hSnapshot, &ModuleEntry32))
    		{
    			do
    			{
    				if (_tcsicmp(ModuleEntry32.szModule, ModuleName) == 0)
    				{
    					ModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
    					break;
    				}
    			} while (Module32Next(hSnapshot, &ModuleEntry32));
    		}
    		CloseHandle(hSnapshot);
    	}
    	return ModuleBaseAddress;
    }

     

     

  8. Решил в эту тему запостить: подскажите, пожалуйста, почему при запуске проекта через Visual студию память целевого процесса читается и поля формы трейнера заполняются значениями из целевого процесса (работает ReadMemory), а при запуске файла, скомпилированного из проекта exe'шника, с правами администратора не читается (т.е. нет никаких ошибок, просто все поля формы трейнера пустые)?

  9. Действительно, замучился писать на питоне, перешёл на C++, написал подмену координат и столкнулся с этим:

    В 28.07.2016в11:50, partoftheworlD сказал:

    Без функции подтверждения, тебя будет откидывать назад когда изменяешь значения координат к примеру

    Подскажите, пожалуйста, способ, как можно отловить функцию подтверждения?

  10. Нашёл ещё способ, как получить адрес из адреса указателя, под катом, вдруг кому пригодится:

    Скрытый текст
    
    		int value = 0;
    		HANDLE phandle;
    		DWORD address = 0x0040E300; //BaseAddress + Offset = PointAddress
    		
    		phandle = OpenProcess(PROCESS_VM_READ, 0, m_PID);
    
    		if (phandle)
    		{
    			ReadProcessMemory(phandle, (void*)address, &value, sizeof(value), 0);
    			wsprintf(text, L"%X", value);
    			MessageBox(hWnd, text, L"INFO", MB_OK | MB_ICONINFORMATION);
    		}

     

     

  11. partoftheworlD, спасибо! Удалось получить BaseAddres, дальше пытаюсь получить нужный адрес из адреса указателя:

    75ecc8afaddbt.jpg

    Для этого использую функцию из уроков Xipho:

    Скрытый текст
    
    BOOL ProcessManager::ReadMemory(DWORD64 addr, LPVOID buffer, int sz)
    {
    	BOOL res = false;
    	SIZE_T bytesRead = 0;
    	HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION, FALSE, m_PID);
    	if (hProc)
    	{
    		res = ReadProcessMemory(hProc, (LPVOID)addr, buffer, sz, &bytesRead);
    		if (!res)
    		{
    			int err = GetLastError();
    		}
    		CloseHandle(hProc);
    		res = true;
    	}
    
    	return res;
    }
    ...
      	case WM_RBUTTONUP:
    	{
          pm.ReadMemory(0x00419BA5, &outta, 4);
          wsprintf(text, L"0x%X", outta);
          MessageBox(hWnd, text, L"INFO", MB_OK | MB_ICONINFORMATION);
        }
    	break;

     

    Функция замечательно работает при чтении значений из конечных адресов, но при попытке прочитать нужный адрес из адреса указателя возвращает пустое значение. Подскажите, пожалуйста, как доработать функцию ReadMemory или что я делаю не так?

  12. В уроках у Xipho есть функция FindProcessByName:

    Скрытый текст
    
    BOOL ProcessManager::FindProcessByName(LPCTSTR ProcessName)
    {
    	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    	if (hSnapshot == INVALID_HANDLE_VALUE) return FALSE;
    
    	PROCESSENTRY32 pe = { 0 };
    	pe.dwSize = sizeof(PROCESSENTRY32);
    
    	if (Process32First(hSnapshot, &pe))
    	{	
    		while (Process32Next(hSnapshot, &pe))
    		{
    			if (!lstrcmp(pe.szExeFile, ProcessName))
    			{
    				m_PID = pe.th32ProcessID;
    				break;
    			}
    		}
    	}
    
    	CloseHandle(hSnapshot);
    	return TRUE;
    }

     

    Подскажите, пожалуйста, как из данной функции можно получить\вытащить значение DWORD m_PID для функции:

    wsprintf(text, L"%u", m_PID);

     

  13. В 19.06.2016в11:26, Xipho сказал:

    Запилил в редактор кнопку ютуба. Думаю, разберетесь ))

     

    Здравствуйте!

    Если возможно, добавьте, пожалуйста, ещё кнопку спойлер'а.

    Я как новичок, хоть и читал правила, но ещё не был близко знаком с данным тегом, поэтому принял тег код за тег спойлер и нарвался на предупреждение от модератора.:blink:

  14. Правила я внимательно читал, ещё перечитывал несколько раз после предупреждения.

    Что такое тег спойлера и что его надо было использовать вместе с тегом код дошло только сейчас :(

    До этого в понимании было, что тег код = тег спойлер. Простите, это один из моих первых форумов, где я что-то написал.:rolleyes:

  15. В каком пункте правил форума можно ознакомиться с явным описанием использования тега SPOILER?

     

    25 минуты назад, NullAlex сказал:

    Вот тут непонятно. С какого момента отсутствует возможность отправлять сообщения? Никто этой возможности не отключал, как можно заметить

     

    Надпись под кнопкой "Я согласен с этим предупреждением" гласит:

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

  16. Как новичок форума столкнулся с "вселенской несправедливостью"!

    Разместил публикацию "Трейнер на Python", которая была проверена модератором.

    Через полсуток прилетело предупреждение от модератора:

    88f199babe26t.jpg

    Объясните, пожалуйста, логику единственной кнопки "Я согласен с этим предупреждением"?

    А если не согласен и есть вопросы к модератору (где именно проигнорированы теги BB?), куда их задавать, если с этого момента отсутствует возможность отправлять сообщения?

     

  17. Доброго времени суток!

    На днях внимательно прочитал ЛУРК и решил не теряя времени заполнить не прожитые минуты своей жизни чем-то интересным на базе чего-то знакомого, собственно, поэтому и выбрал питон (знаю, что правильно будет "пайтон", но больше мне почему-то нравится, -питон). Скажу честно, по-мимо природной лени, на данный форум меня привлекли труды замечательного автора GameHackLab[RU] (здоровья ему!) . Свои силы в программировании решил опробовать на пиратских серверах WoW 1.12.1 (http://www.kronos-wow.com/), т.к. грабить награбленное -двойное удовольствие :)) Вообщем, решил написать свой трейнер на Python, ибо античит система "Warden" безжалостно уничтожает все известные читы (блокирует аккаунт), в том числе, БАН настигает сразу при попытке использовать SpeedHack в Cheat Engine 6.5.1. Бабло и шмот в первую очередь не интересуют, т.к. именно ради их достижения и есть охота побегать, поиграть. Задача для профи -минималистичная, задача для новичка -амбициозная! :))

    Подскажите, пожалуйста, как перехватить адреса, оффсеты, опкоды для использования:

     

    1. SpeeHack

    2. Teleport

    3. Invisible mode (без лимита по времени)

     

    Для хуков и инжектов использую модуль PyDBG, пока что удалось получить только имя героя:

    Скрытый текст
    
    from pydbg import *
    from pydbg.defines import *
    import utils
    import sys
    import struct
    import win32api
    import re
    import ctypes
    
    dbg = pydbg()
    found_program = False
    
    #valid_str = "Something to write"
    
    def handler_breakpoint(dbg):
    	data = dbg.read_process_memory(relative_address,14)
    	print "%s" % data
    #	print "%s" % data.encode("hex")
    #	wdata = ctypes.create_string_buffer(valid_str)
    #	dbg.write(address, wdata, len(valid_str))
    	return DBG_CONTINUE
    
    
    for (pid, name) in dbg.enumerate_processes():
    	if name.lower() == "wow.exe":
    		found_program = True
    		hooks = utils.hook_container()
    		dbg.attach(pid)
    		print "Attaching with PID: %d" % pid
    
    for modules in dbg.enumerate_modules():
    	if str(modules)[2:6] == "WoW.":
    		base_address = int((re.split(r', ', str(modules))[1])[0:-2])
    		print "Base address: 0x%08x" % base_address
    		relative_address = base_address + 8551816
    
    		print "Relative address: 0x%08x" % relative_address
    		dbg.set_callback(EXCEPTION_BREAKPOINT,handler_breakpoint)
    
    if found_program:
    	print "-------------------------------"
    	dbg.run()
    else:	
    	print "Error: Couldn't find process."
    	sys.exit(-1)

     

     

×
×
  • Создать...

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

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