Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с памятью.  (Прочитано 9740 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tims
Гость
« : 08-04-2007 12:19 » 

Всем здрасте Ага.

В общем я не силен в программировании, но думаю что осилить можно всё. В общем я пишу на довольно-таки прикольной оболочке: AutoItX3. Это Basic+Visual Basic. Ну, бэйсик он и есть бейсик.

Ситуация: наткнулся я на своеобразный "плагин", который может работать с памятью. Там несколько функций. Выгрядят так:

Код:
Func _MemRead($i_hProcess, $i_lpBaseAddress, $i_nSize, $v_lpNumberOfBytesRead = '')
    Local $v_Struct = DllStructCreate ('byte[' & $i_nSize & ']')
    DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $i_hProcess, 'int', $i_lpBaseAddress, 'int', DllStructGetPtr ($v_Struct, 1), 'int', $i_nSize, 'int', $v_lpNumberOfBytesRead)
    Local $v_Return = DllStructGetData ($v_Struct, 1)
    $v_Struct=0
    Return $v_Return
EndFunc

Func _MemWrite($i_hProcess, $i_lpBaseAddress, $v_Inject, $i_nSize, $v_lpNumberOfBytesRead = '')
    Local $v_Struct = DllStructCreate ('byte[' & $i_nSize & ']')
    DllStructSetData ($v_Struct, 1, $v_Inject)
    $i_Call = DllCall('kernel32.dll', 'int', 'WriteProcessMemory', 'int', $i_hProcess, 'int', $i_lpBaseAddress, 'int', DllStructGetPtr ($v_Struct, 1), 'int', $i_nSize, 'int', $v_lpNumberOfBytesRead)
    $v_Struct=0
    Return $i_Call[0]
EndFunc

Func _MemOpen($i_dwDesiredAccess, $i_bInheritHandle, $i_dwProcessId)
    $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', $i_dwDesiredAccess, 'int', $i_bInheritHandle, 'int', $i_dwProcessId)
    If @error Then
        SetError(1)
        Return 0
    EndIf
    Return $ai_Handle[0]
EndFunc

Func _MemClose($i_hProcess)
    $av_CloseHandle = DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $i_hProcess)
    Return $av_CloseHandle[0]
EndFunc

А вот маленькая функция по его использованию:

Код:
$Process = 'winmine.exe' ;-> Target process
$PID = ProcessExists($Process) ;-> Get Process ID
$Address = 0x1005330 ;-> Read/write address
$Value = 12 ;-> Value to write


$OpenProcess = _MemOpen(0x38, False, $PID) ;-> Enable reading/writing to the process and get the handle

    $v_Read = _MemRead($OpenProcess, $Address, 1) ;-> Read a 1 byte value from the defined address
    MsgBox(0,"Info", "The value of address "&HEX($Address, 8)&" is now: "&$v_Read)

    $v_Read = _MemWrite($OpenProcess, $Address, $Value, 1);-> Write a new 1 byte value to the defined address
    MsgBox(0,"Info", "Writing the value "&$Value&" to address "&HEX($Address, 8))

    $v_Read = _MemRead($OpenProcess, $Address, 1) ;-> Read the new value from the defined address
    MsgBox(0,"Info", "The value of address "&HEX($Address, 8)&" is now: "&$v_Read)

_MemClose($OpenProcess) ;-> Disable reading/writing to the process

- Собсна, сначала мы должны открыть процесс функцией MemOpen, с какими-то параметрами(не понял первые два параметра: 0x38 и False).
- Потом используя хэндл, полученный после вызова функции MemOpen, мы можем читать память, с указанием адреса(я не понял как искать адрес, и как влияет цифра 1)
А дальше всё по аналогии. Прошу помощи в разъяснении мне что такое _memopen(0x38,False... и _memwrite($openprocess,$Address,$Value,1)

Спасибо за помощь!
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #1 : 08-04-2007 12:45 » 

Эта функция в конечном счете вызывает функцию OpenProcess http://msdn2.microsoft.com/en-us/library/ms684320.aspx

0x38 расшифровывается как
PROCESS_VM_READ - Required to read memory in a process using
PROCESS_VM_WRITE - Required to write to memory in a process using
PROCESS_VM_OPERATION - Required to perform an operation on the address space of a process

False -
Цитата
If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
« Последнее редактирование: 08-04-2007 12:57 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Tims
Гость
« Ответ #2 : 08-04-2007 12:46 » 

С чего это? И какая именно функция? Там их 4
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #3 : 08-04-2007 12:59 » 

Tims,
Код:
Func _MemOpen($i_dwDesiredAccess, $i_bInheritHandle, $i_dwProcessId)
    $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', $i_dwDesiredAccess, 'int', $i_bInheritHandle, 'int', $i_dwProcessId)
    If @error Then
        SetError(1)
        Return 0
    EndIf
    Return $ai_Handle[0]
EndFunc
Тут идет вызов одной WinAPI функции. Прыгни по ссылке для разьяснения параметров вызова данной функции.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Tims
Гость
« Ответ #4 : 08-04-2007 13:11 » 

Спасибо, почитаю.
Записан
Tims
Гость
« Ответ #5 : 08-04-2007 17:35 » 

А какие возможные причины, если мне вместо Process Handle возвращается 0?
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #6 : 09-04-2007 02:57 » 

А у тебя приложение winmine.exe открыто?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Tims
Гость
« Ответ #7 : 11-04-2007 01:13 » 

Такой ошибки еще не делал.
Записан
Tims
Гость
« Ответ #8 : 11-04-2007 01:14 » 

Мне подсказали, что скорее всего система безопасности недопускает к памяти. Посоветовали создавать дочений процесс.
Записан
Finch
Спокойный
Администратор

il
Online Online
Пол: Мужской
Пролетал мимо


« Ответ #9 : 11-04-2007 19:46 » 

Tims, По твоему примеру, ты пытаешься открыть Handle  уже работающего процесса. По идее говоря, на этом месте из за Security программа не должна валится. Тем более, скорее всего, минера будеш запускать от имени одного и того же пользователя.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines