Тема: aimbot
Показать сообщение отдельно
Старый 25.12.2009, 10:19   #14
Alex.D.
Оператор ЭВМ
 
Регистрация: 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
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Alex.D. за это полезное сообщение:
Nex (25.12.2009), NitE (25.12.2009), Жека (25.12.2009)