Оператор ЭВМ
Регистрация: 02.11.2008
Сообщений: 27
Написано 12 полезных сообщений (для 25 пользователей)
|
Ответ: aimbot
эмм, можно наглядный пример ?
через такие проги можно узнать например патроны - это просто переменная значение которой мне известно.
|
Можно не юзать ArtMoney, а написать свой велосипед  )
Код на ПуреБейсике, но прокомментировал я достаточно подробно, так что должно быть понятно. Основная идея - сканировать память процесса, для этого в WINAPI есть [Read\Write]ProcessMemory
Правда это может не понравиться антивирусам

; структура настроек запускаемого процесса
Define.STARTUPINFO StartupInfo
; структура информации о запущенном процессе
Define.PROCESS_INFORMATION ProcessInfo
; структура системой информации
Define.SYSTEM_INFO SystemInfo
; структура информации о блоке памяти
Define.MEMORY_BASIC_INFORMATION MemoryInfo
; обнуляем структуру запуска
RtlZeroMemory_(StartupInfo, SizeOf(StartupInfo))
; указываем ее размер
StartupInfo\cb = SizeOf(StartupInfo)
; указываем режим отображения окна запускаемого процесса
StartupInfo\wShowWindow = #SW_SHOW
; запускаем процесс в режиме сна
If CreateProcess_(0, "C:\test.exe", 0, 0, 0, #CREATE_SUSPENDED, 0, 0, StartupInfo, ProcessInfo)
; процесс удалось запустить, продолжаем
; создаем интерфейс
OpenWindow(0, 0, 0, 110, 310, "", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MinimizeGadget)
StringGadget(0, 5, 5, 100, 20, "")
ButtonGadget(1, 5, 30, 100, 20, "Найти")
ButtonGadget(2, 5, 55, 100, 20, "Отсеть")
ButtonGadget(3, 5, 80, 100, 20, "Записать")
ListViewGadget(4, 5, 105, 100, 200)
; получаем системную информацию
; там нас интересует диапазон адресов, куда может быть отображен процесс приложения
GetSystemInfo_(SystemInfo)
; пробуждаем главный поток процесса
ResumeThread_(ProcessInfo\hThread)
Repeat
; сообщения от интерфейса
temp = WaitWindowEvent()
Select temp
; сообщения от гаджетов
Case #PB_Event_Gadget
temp = EventGadget()
Select temp
; нажата кнопка "найти"
Case 1
; берем введенное в поле поиска значение
temp = Val(GetGadgetText(0))
; очищаем список
ClearGadgetItems(4)
index = 0
; сканируем процесс
; начальный адрес сканирования
address = SystemInfo\lpMinimumApplicationAddress
; сканируем пока не достигнем конца диапазона
While address < SystemInfo\lpMaximumApplicationAddress
; запрашиваем информацию о блоке памяти
If VirtualQueryEx_(ProcessInfo\hProcess, address, MemoryInfo, SizeOf(MemoryInfo)) = SizeOf(MemoryInfo)
; блок памяти должен быть разрешен для чтения и записи
; а также выделен для использования (некоторые блоки виртуальной памяти могут быть просто зарезервированы)
If MemoryInfo\State = #MEM_COMMIT And MemoryInfo\Protect = #PAGE_READWRITE
; на всякий случай проверяем что блок имеет какой-то размер (не обязательно)
If MemoryInfo\RegionSize > 0
; начальный адрес сканирования блока
scan = MemoryInfo\BaseAddress
; конечный адрес сканирования блока
stop = scan + MemoryInfo\RegionSize
; сканируем блок
While scan < stop
; читаем память процесса по сканируемому адресу (читаем 4 байта)
ReadProcessMemory_(ProcessInfo\hProcess, scan, @value, 4, @length)
; сравниваем с введенным в поле поиска
If value = temp
; если есть совпадение, добавляем в список адрес
AddGadgetItem(4, index, Hex(scan, #PB_Long))
; запоминаем адрес в данных элемента (чтобы не переводить обратно из строки в число)
SetGadgetItemData(4, index, scan)
index + 1
EndIf
; следующий адрес сканирования
scan + 4
Wend
EndIf
EndIf
; следующий адрес блока памяти
address = MemoryInfo\BaseAddress + MemoryInfo\RegionSize
Else
; запрос не возможен, что-то не так, выходим :)
Break
EndIf
Wend
; нажата кнопка "отсеять"
Case 2
; берем кол-во элементов в списке
index = CountGadgetItems(4)
If index > 0
; берем значение введенное в поле поиска
temp = Val(GetGadgetText(0))
; проверяем значения по адресам, записанным в элементах
While index > 0
index - 1
; записанный адрес
address = GetGadgetItemData(4, index)
; читаем процесс
ReadProcessMemory_(ProcessInfo\hProcess, address, @value, 4, @length)
; сравниваем с введенным в поле поиска
If value <> temp
; значения не совпадают, удаляем элемент
RemoveGadgetItem(4, index)
EndIf
Wend
EndIf
; нажата кнопка "запись"
Case 3
; берем индекс выбранного элемента в списке
index = GetGadgetState(4)
If index >= 0
; записаный адрес
address = GetGadgetItemData(4, index)
; берем значение введенное в поле поиска
temp = Val(GetGadgetText(0))
; пишем в память процесса новое значение
WriteProcessMemory_(ProcessInfo\hProcess, address, @temp, 4, @length)
EndIf
EndSelect
; закрытие окна интерфейса
Case #PB_Event_CloseWindow
Break
EndSelect
Forever
CloseWindow(0)
EndIf
; закрываем хендл процесса
CloseHandle_(ProcessInfo\hProcess)
End
|