 |
ReadProcessMemory и Visual Basic - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
16.06.2014, 23:46
|
#1
|
|
|
|
Пехотинец
|
 Регистрация: 03.02.2013
 Сообщений: 60
 Популярность: 10
 Сказал(а) спасибо: 12
Поблагодарили 26 раз(а) в 12 сообщениях
|
ReadProcessMemory и Visual Basic
Доброго времени суток!
Решил я вспомнить ВБ, и понял, что на делфи мне уже легче)
Пытался написать элементарную программку, которая бы считывала какое-либо значение по заданному адресу.
Прокопался несколько часов, так и ничего не добился, выдает все время ноль((
 |
Цитата: |
 |
|
|
|
|
|
|
|
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, _
lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Const PROCESS_ALL_ACCESS = 2035711
__________________________________________________ _________
Private Sub Command1_Click()
Dim hwnd, NoB As Long
Dim out As Long
Dim procId As Long
Dim procHandle As Long
hwnd = FindWindow(vbNullString, "Perfect World")
GetWindowThreadProcessId hwnd, procId
procHandle = OpenProcess(PROCESS_ALL_ACCESS, False, procId)
Call ReadProcessMemory(procHandle, &HC38B6C, ByVal VarPtr(out), 4, NoB)
Print out
CloseHandle procHandle
End Sub |
|
 |
|
 |
|
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). | Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
16.06.2014, 23:55
|
#2
|
|
|
|
Пехотинец
|
 Регистрация: 02.08.2009
 Сообщений: 57
 Популярность: 417
 Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
|
Re: ReadProcessMemory и Visual Basic
Эмм, а чем делфи не устроил?)
|
|
|
17.06.2014, 01:59
|
#3
|
|
|
|
Пехотинец
|
 Регистрация: 03.02.2013
 Сообщений: 60
 Популярность: 10
 Сказал(а) спасибо: 12
Поблагодарили 26 раз(а) в 12 сообщениях
|
Re: ReadProcessMemory и Visual Basic
Да делфи устроил, бота уже доделываю, а вот стало интересно на счет бэйсика и тут такое))
не читает значение и всё...
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). | Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
17.06.2014, 02:11
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: ReadProcessMemory и Visual Basic
|
|
|
18.06.2014, 11:02
|
#5
|
|
|
|
Пехотинец
|
 Регистрация: 03.02.2013
 Сообщений: 60
 Популярность: 10
 Сказал(а) спасибо: 12
Поблагодарили 26 раз(а) в 12 сообщениях
|
Re: ReadProcessMemory и Visual Basic
Свершилось! ) Всё-таки смог прочитать текущее значение здоровья:
 |
Цитата: |
 |
|
|
|
|
|
|
|
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_VM_WRITE = &H20
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM = PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Long, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
__________________________________________________ _______
Private Sub command1_Click()
Dim hWnd As Long, PId As Long, hProcess As Long, buf As Long
hWnd = FindWindow(vbNullString, "Perfect World")
Call GetWindowThreadProcessId(hWnd, PId)
hProcess = OpenProcess(PROCESS_VM, 0&, PId)
Call ReadProcessMemory(hProcess, &HC38B6C, VarPtr(buf), 4, 0&)
buf = buf + &H1C
Call ReadProcessMemory(hProcess, buf, VarPtr(buf), 4, 0&)
buf = buf + &H34
Call ReadProcessMemory(hProcess, buf, VarPtr(buf), 4, 0&)
buf = buf + &H4A8
Call ReadProcessMemory(hProcess, buf, VarPtr(buf), 4, 0&)
MsgBox buf
Call CloseHandle(hProcess)
End Sub |
|
 |
|
 |
|
Давняя идея просто была, поиздеваться над другом и показать ему "Бота в Excell", написанного на VBA.
перевести код бота просто, единственная заморочка была с чтением из памяти.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). | Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось sedrik1992; 18.06.2014 в 11:10.
|
|
|
18.06.2014, 19:33
|
#6
|
|
|
|
Пехотинец
|
 Регистрация: 02.08.2009
 Сообщений: 57
 Популярность: 417
 Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
|
Re: ReadProcessMemory и Visual Basic
//Офтоп) Чу мелочится? напишите бота на JS и запускайте в браузере
|
|
|
26.07.2014, 18:02
|
#7
|
|
|
|
Разведчик
|
 Регистрация: 11.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: ReadProcessMemory и Visual Basic
Доброго времени суток! Именно с этого поста начал экспериментировать с разработкой ПО для ПВ. До этого API-функциями не пользовался. В обще данная прога что будучи сделана в Экселе, что в Визуал Студио 2008 в "Семёрке" не желает работать. Функция OpenProcess выдаёт 5 - ACCESS DENIED. Пробовал отключать UAC - функция ReadProcessMemory выдаёт ошибки, то 5 (доступ запрещён), то 6 (попытка чтения-записи в защищённую область). Пробовал запускать в ХР - всё прекрасно работает, правда комп с ХР тормозной очень. Как заставить работать прогу на "Семёрке"?
|
|
|
26.07.2014, 18:32
|
#8
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: ReadProcessMemory и Visual Basic
Panki-online о великий запуск от имени администратора, попробуйте использовать его ))
|
|
|
26.07.2014, 18:50
|
#9
|
|
|
|
Разведчик
|
 Регистрация: 11.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: ReadProcessMemory и Visual Basic
от ошибки чтения-записи в защищённую область меня это не спасает
|
|
|
27.07.2014, 09:14
|
#10
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: ReadProcessMemory и Visual Basic
У меня не было проблем с чтением/записью памяти в VS 2013 Express . В компиляторе попробуй поставить AnyCPU и галочку "предпочтительно для 32-разрядн" , если такого нету - нужно качать новую студию.
|
|
|
27.07.2014, 20:19
|
#11
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: ReadProcessMemory и Visual Basic
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
|
|
|
02.08.2014, 22:07
|
#12
|
|
|
|
Разведчик
|
 Регистрация: 11.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: ReadProcessMemory и Visual Basic
А что, функции типа OpenProcessToken и прочую лабуду с правами доступа никто не использовал, и у всех всё получилось? Чёрт побери, Холмс, но как? Ещё неделя пролетела безрезультатно. Сейчас вот пробую получить привилегию SE_DEBUG_NAME, но функция OpenProcessToken, даже будучи применена к собственному процессу программы возвращает 0 в качестве результата и 0 же в качестве токена. И опять непонятно почему это. GetLastError заявляет об ошибке 998 (Invalid access to memory location.). Может кто знает, в чём дело?
|
|
|
03.08.2014, 03:51
|
#13
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: ReadProcessMemory и Visual Basic
|
|
|
03.08.2014, 07:36
|
#14
|
|
|
|
Разведчик
|
 Регистрация: 11.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: ReadProcessMemory и Visual Basic
Если есть у кого Студия 13, проверьте пожалуйста этот код на нёй:
 |
Цитата: |
 |
|
|
|
|
|
|
|
Public Class Form1
Dim hWnd As Integer ' параметры Perfect World
Dim idProc As Integer
Dim hProc As Integer
Dim MyhWnd As Integer ' параметры текущей проги
Dim MyidProc As Integer
Dim MyhProc As Integer
Const PROCESS_ALL_ACCESS = &H1F0FFF '2035711
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_VM_WRITE = &H20
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM = &H1F0FFF 'PROCESS_VM_OPERATION or PROCESS_VM_READ Or PROCESS_VM_WRITE
Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
Dim hToken As Integer ' Handle to your process token.
Dim lPrivilege As Integer ' Privilege to enable/disable
Dim iPrivilegeflag As Boolean ' Flag whether to enable/disable
' the privilege of concern.
Dim lResult As Integer ' Result call of various APIs.
Dim hProcess As Integer
'MyhWnd = FindWindow(vbNullString, "Form1")
'GetWindowThreadProcessId(MyhWnd, MyidProc)
'MyhProc = OpenProcess(PROCESS_ALL_ACCESS, False, MyidProc)
'hProcess = MyhProc 'GetCurrentProcess
hProcess = GetCurrentProcess
hWnd = FindWindow(vbNullString, "Perfect World")
txtHandle.Text = hWnd.ToString
GetWindowThreadProcessId(hWnd, idProc)
txtIdProc.Text = idProc.ToString
lResult = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY, hToken)
If (lResult = 0) Then
MsgBox("Не могу получить токен процесса. Ошибка №" & _
GetLastError) '& Err.LastDllError)
'CloseHandle(hToken)
Exit Sub
End If
lResult = SetPrivilege(hToken, SE_DEBUG_NAME, True)
If (lResult = False) Then
MsgBox("Ошибка: не могу получить привилегию SE_DEBUG_NAME")
CloseHandle(hToken)
Exit Sub
End If
hProc = OpenProcess(PROCESS_ALL_ACCESS, False, idProc)
If hProc = 0 Then
MsgBox(GetLastError())
CloseHandle(hToken)
Exit Sub
End If
MsgBox("hProc=" & hProc)
CloseHandle(hToken)
CloseHandle(hProcess)
'MsgBox(hProc)
'CloseHandle(hProc)
'Timer1.Enabled = True
End Sub
Private Function SetPrivilege(ByVal hToken As Integer, ByVal Privilege As String, _
ByVal bSetFlag As Boolean) As Boolean
Dim TP As TOKEN_PRIVILEGES ' Used in getting the current
' token privileges
Dim TPPrevious As TOKEN_PRIVILEGES ' Used in setting the new
' token privileges
Dim Luid As Luid ' Stores the Local Unique
' Identifier - refer to MSDN
Dim cbPrevious As Integer ' Previous size of the
' TOKEN_PRIVILEGES structure
Dim lResult As Integer ' Result of various API calls
' Grab the size of the TOKEN_PRIVILEGES structure,
' used in making the API calls.
cbPrevious = Len(TP)
' Grab the LUID for the request privilege.
lResult = LookupPrivilegeValue("", Privilege, Luid)
' If LoopupPrivilegeValue fails, the return result will be zero.
' Test to make sure that the call succeeded.
If (lResult = 0) Then
SetPrivilege = False
End If
' Set up basic information for a call.
' You want to retrieve the current privileges
' of the token under concern before you can modify them.
TP.PrivilegeCount = 1
TP.Privileges(0).pLuid = Luid
TP.Privileges(0).Attributes = 0
SetPrivilege = lResult
' You need to acquire the current privileges first
lResult = AdjustTokenPrivileges(hToken, -1, TP, Len(TP), _
TPPrevious, cbPrevious)
' If AdjustTokenPrivileges fails, the return result is zero,
' test for success.
If (lResult = 0) Then
SetPrivilege = False
End If
' Now you can set the token privilege information
' to what the user is requesting.
TPPrevious.PrivilegeCount = 1
TPPrevious.Privileges(0).pLuid = Luid
' either enable or disable the privilege,
' depending on what the user wants.
Select Case bSetFlag
Case True : TPPrevious.Privileges(0).Attributes = _
TPPrevious.Privileges(0).Attributes Or _
(SE_PRIVILEGE_ENABLED)
Case False : TPPrevious.Privileges(0).Attributes = _
TPPrevious.Privileges(0).Attributes Xor _
(SE_PRIVILEGE_ENABLED And _
TPPrevious.Privileges(0).Attributes)
End Select
' Call adjust the token privilege information.
lResult = AdjustTokenPrivileges(hToken, -1, TPPrevious, _
cbPrevious, TP, cbPrevious)
' Determine your final result of this function.
If (lResult = 0) Then
' You were not able to set the privilege on this token.
SetPrivilege = False
Else
' You managed to modify the token privilege
SetPrivilege = True
End If
End Function
End Class |
|
 |
|
 |
|
Содержание модуля:
 |
Цитата: |
 |
|
|
|
|
|
|
|
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Public Declare Function CloseWindow Lib "user32" (ByVal hwnd As Integer) As Integer
Public Declare Function OpenIcon Lib "user32" (ByVal hwnd As Integer) As Integer
Public Declare Auto Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As IntPtr, ByRef lpdwProcessId As IntPtr) As Integer 'IntPtr
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd, ByVal Msg, ByVal wParam, ByVal lParam)
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As Integer
Public Declare Function CloseHandle Lib "kernel32" (ByVal Hproc As Integer)
Public Declare Sub ReadProcessMemory Lib "kernel32" (ByVal THandle As Integer, ByVal lpBaseAddress As Integer, ByVal lpBuffer As Integer, ByVal nSize As Integer, ByVal lpNumberOfBytesReadas As Integer)
Public Declare Function GetLastError Lib "kernel32" () As Integer
' Constants used for various API calls. Refer to MSDN for detailed
' information about what these constants mean.
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
Public Const TOKEN_QUERY = &H8
Public Const ANYSIZE_ARRAY = 1
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
Public Const SE_DEBUG_NAME = "SeDebugPrivilege"
Public Const SE_PRIVILEGE_ENABLED = &H2
' Structures used with various API calls.
' Refer to MSDN for detailed information
' about what these structures are, and how they are used.
Structure LARGE_INTEGER
Public lowpart As Integer
Public highpart As Integer
End Structure
Structure Luid
Public lowpart As Integer
Public highpart As Integer
End Structure
Structure LUID_AND_ATTRIBUTES
Public pLuid As Luid
Public Attributes As Integer
End Structure
Structure TOKEN_PRIVILEGES
Public PrivilegeCount As Integer
Public Privileges() As LUID_AND_ATTRIBUTES
End Structure
Declare Function GetCurrentProcess Lib "kernel32" () As Integer
Declare Function OpenProcessToken Lib "advapi32.dll" _
(ByVal ProcessHandle As Integer, ByVal DesiredAccess As Integer, _
ByVal TokenHandle As Integer) As Integer
Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias _
"LookupPrivilegeValueA" (ByVal lpSystemName As String, _
ByVal lpName As String, ByVal lpLuid As Luid) As Integer
Declare Function AdjustTokenPrivileges Lib "advapi32.dll" _
(ByVal TokenHandle As Integer, ByVal DisableAllPrivileges As Long, _
ByVal NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
ByVal PreviousState As TOKEN_PRIVILEGES, ByVal ReturnLength As Long) As Long |
|
 |
|
 |
|
Ато пока я со своим инетом скачаю 13ю студию, наступят следующие выходные.
|
|
|
04.08.2014, 11:02
|
#15
|
|
|
|
Разведчик
|
 Регистрация: 06.10.2013
 Сообщений: 27
 Популярность: 10
 Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
|
Re: ReadProcessMemory и Visual Basic
А вы уверены что код рабочий?
Я вот получаю список процессов без всяких токенов.
Простой пример:
Код:
Public Class Form1
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As UInteger, ByVal bInheritHandle As UInteger, ByVal dwProcessId As UInteger) As Integer
Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInteger, ByVal lpBaseAddress As UInteger, ByRef lpBuffer As UInteger, ByVal nSize As UInteger, ByRef lpNumberOfBytesWritten As UInteger) As UInteger
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i As Integer
Dim procs As Process() = Process.GetProcesses() 'массив процессов
For i = 0 To procs.Count - 1
Dim MainWindowTitle As String = procs(i).MainWindowTitle 'MainWindowTitle
If MainWindowTitle = "Perfect World" Then
Dim Process_Id As UInteger = procs(i).MainWindowHandle
Dim hProcess As UInteger = OpenProcess(&H1F0FF, 0, procs(i).Id) 'all access
'ну а дальше читаем нужные значения
Dim BA As UInteger
ReadProcessMemory(hProcess, &HC9DFAC, BA, 4, 0) 'читаем базовый адрес
Me.Text = BA
Beep()
End If
Next
End Sub
End Class
Для еще большего удобства можно сеять окна пв по имени персонажа, написать класс для читания памяти во всех ее вариациях(uInteger, String, Byte...)
Если этот код не будет у тебя работать то выход для тебя только 1н. Идти к другу/знакомому и качать образ у него  .
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] Visual basic 6
|
sanekdnb |
Общение разработчиков |
6 |
22.05.2012 09:02 |
[Помогите!] visual basic
|
[Мозгоффский] |
Общение и обсуждение Perfect World |
12 |
19.02.2012 18:31 |
[Руководство] На Visual Basic
|
daff26 |
С/С++ |
1 |
29.12.2011 13:27 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 03:56.
|
 |