purebasic.info

PureBasic forum
Текущее время: Пн июл 13, 2020 5:32 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Вт авг 20, 2013 3:11 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
У ManHunter'а прочитал интересную статью
Заточил код под PureBasic может кому-то пригодится
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
;   http://www.manhunter.ru/assembler/653_poluchenie_informacii_o_drugom_processe.html
 
Structure PROCESS_BASIC_INFORMATION
    ExitStatus.l
    PebBaseAddress.l
    AffinityMask.l
    BasePriority.l
    uUniqueProcessId.l
    uInheritedFromUniqueProcessId.l
EndStructure
 
Structure PEB
    InheritedAddressSpace.b
    ReadImageFileExecOptions.b
    BeingDebugged.b
    b003.b
    Mutant.l
    ImageBaseAddress.l
    Ldr.l          
    ProcessParameters.l
EndStructure
 
 Structure UNICODE_STRING
   Length.w                     ; Длина строки без терминального нуля
   MaximumLength.w              ; Полная длина буфера
   Buffer.l                     ; Указатель на буфер для UNICODE-строки
 EndStructure
 
 ; Структура RTL_USER_PROCESS_PARAMETERS под Win32
Structure RTL_USER_PROCESS_PARAMETERS
    MaximumLength.l
    Length.l
    Flags.l
    DebugFlags.l
    ConsoleHandle.l
    ConsoleFlags.l
    StdInputHandle.l
    StdOutputHandle.l
    StdErrorHandle.l
    CurrentDirectoryPath.UNICODE_STRING
    CurrentDirectoryHandle.l
    DllPath.UNICODE_STRING
    ImagePathName.UNICODE_STRING
    CommandLine.UNICODE_STRING
EndStructure
 
; Данные о 32-битных процессах
Info.PROCESS_BASIC_INFORMATION
peb.PEB
pparam.RTL_USER_PROCESS_PARAMETERS  
 
Procedure EnableDebugPrivNT(aPrivilegeName.s)
    DebugValue.LUID
    tkp.TOKEN_PRIVILEGES
    ; Retrieve a handle of the access token
    If Not OpenProcessToken_(GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@hToken)
       ProcedureReturn #False;
    EndIf
    ; Enable the SE_DEBUG_NAME privilege  
    If Not LookupPrivilegeValue_("", aPrivilegeName, @DebugValue)
       CloseHandle_(hToken)
       ProcedureReturn #False;
    EndIf
    NewState.TOKEN_PRIVILEGES
    With NewState
      \PrivilegeCount=1
      \Privileges[0]\Luid\HighPart=DebugValue\HighPart
      \Privileges[0]\Luid\LowPart=DebugValue\LowPart
      \Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
    EndWith
    AdjustTokenPrivileges_(hToken,#False,@NewState,SizeOf(TOKEN_PRIVILEGES),@PreviousState.TOKEN_PRIVILEGES,@ReturnLength)
    If hToken : CloseHandle_(hToken) : EndIf
EndProcedure
 
EnableDebugPrivNT("SeDebugPrivilege")  
 
pID = 4992            ; тут нужно поставить реальное значение из диспетчера задач    
buff1.s{1024}
 buff2.s{1024}
 buff3.s{1024}
; Открыть процесс для получения информации
hprocess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, pID)
If hprocess
 
   ; Прочитать PROCESS_BASIC_INFORMATION
   NtQueryInformationProcess_(hprocess, 0, Info, SizeOf(PROCESS_BASIC_INFORMATION), @tmp)
   ; Прочитать PEB
   ReadProcessMemory_(hprocess, Info\PebBaseAddress, peb, SizeOf(PEB), @tmp)  
 
   ; Прочитать RTL_USER_PROCESS_PARAMETERS
   ReadProcessMemory_(hprocess, peb\ProcessParameters, pparam, SizeOf(RTL_USER_PROCESS_PARAMETERS), @tmp)
   ; Получить путь запуска с параметрами (CommandLine)
   ReadProcessMemory_(hprocess, pparam\CommandLine\Buffer, @buff1, pparam\CommandLine\Length, @tmp)
 
   Debug PeekS(@buff1, tmp/2, #PB_Unicode)
   ; Получить рабочую директорию (CurrentDirectoryPath)
   ReadProcessMemory_(hprocess, pparam\CurrentDirectoryPath\Buffer, @buff2, pparam\CurrentDirectoryPath\Length, @tmp)  
   Debug PeekS(@buff2, tmp/2, #PB_Unicode)
   
   ; Получить путь запуска (ImagePathName)
   ReadProcessMemory_(hprocess, pparam\ImagePathName\Buffer, @buff3, pparam\ImagePathName\Length, @tmp)  
   Debug PeekS(@buff3, tmp/2, #PB_Unicode)
   CloseHandle_(hprocess)
EndIf  



Цитата:
x64

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
 ; http://www.everfall.com/paste/id.php?bh8ptyyc3sow
 
  ; typedef struct _PEB64 {                                   // 81 elements, 0x368 bytes (sizeof)
 
; Структура для получения данных о процессе под Win64
Structure PROCESS_BASIC_INFORMATION_WOW64
    ExitStatus.l
    Reserved0.l
    PebBaseAddress.q
    AffinityMask.q
    BasePriority.l
    Reserved.l
    uUniqueProcessId.q
    uInheritedFromUniqueProcessId.q
EndStructure
 
; Структура PEB процесса под Win64 (похоже не полная)    ; http://www.everfall.com/paste/id.php?bh8ptyyc3sow
Structure PEB64      
    InheritedAddressSpace.b
    ReadImageFileExecOptions.b
    BeingDebugged.b
    b003.b
    Reserved0.l
    Mutant.q
    ImageBaseAddress.q
    Ldr.q
    ProcessParameters.q
;     SubSystemData.q
;     ProcessHeap.q
;     FastPebLock.q
;     AtlThunkSListPtr.q
;     IFEOKey.q
EndStructure  
 
; Юникодная строка в Win64
Structure UNICODE_STRING64  
   Length.w                     ; Длина строки без терминального нуля
   MaximumLength.w              ; Полная длина буфера
   Fill.l
   Buffer.q                     ; Указатель на буфер для UNICODE-строки
EndStructure
 
; Структура RTL_USER_PROCESS_PARAMETERS64 под Win64
Structure RTL_USER_PROCESS_PARAMETERS64
    MaximumLength.l
    Length.l
    Flags.l
    DebugFlags.l
    ConsoleHandle.q
    ConsoleFlags.l
    Reserved.l
    StdInputHandle.q
    StdOutputHandle.q
    StdErrorHandle.q
    CurrentDirectoryPath.UNICODE_STRING64
    CurrentDirectoryHandle.q
    DllPath.UNICODE_STRING64
    ImagePathName.UNICODE_STRING64
    CommandLine.UNICODE_STRING64
EndStructure
 
; Данные о 64-битных процессах
Info64.PROCESS_BASIC_INFORMATION_WOW64
peb64.PEB64
pparam64.RTL_USER_PROCESS_PARAMETERS64
 
Procedure EnableDebugPrivNT(aPrivilegeName.s)
    DebugValue.LUID
    tkp.TOKEN_PRIVILEGES
    ; Retrieve a handle of the access token
    If Not OpenProcessToken_(GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@hToken)
       ProcedureReturn #False;
    EndIf
    ; Enable the SE_DEBUG_NAME privilege  
    If Not LookupPrivilegeValue_("", aPrivilegeName, @DebugValue)
       CloseHandle_(hToken)
       ProcedureReturn #False;
    EndIf
    NewState.TOKEN_PRIVILEGES
    With NewState
      \PrivilegeCount=1
      \Privileges[0]\Luid\HighPart=DebugValue\HighPart
      \Privileges[0]\Luid\LowPart=DebugValue\LowPart
      \Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
    EndWith
    AdjustTokenPrivileges_(hToken,#False,@NewState,SizeOf(TOKEN_PRIVILEGES),@PreviousState.TOKEN_PRIVILEGES,@ReturnLength)
    If hToken : CloseHandle_(hToken) : EndIf
EndProcedure
 
Procedure IsProcess64(pID)
 
  result.l = 0
  temp.l
  IsWow64.i
  ; Определить запуск под Win64
     IsWow64 = GetProcAddress_(GetModuleHandle_("kernel32.dll"), "IsWow64Process")
     If IsWow64 = 0
        ProcedureReturn result  ; Мы под Win32, тут все процессы 32-битные
     Else
        ; Наш процесс запущен под Win64?   (а процесс у нас 32-битный)    
        CallFunctionFast(IsWow64, GetCurrentProcess_(), @temp)
        If temp = #False : ProcedureReturn result : EndIf
        ; Получить информацию о процессе
        hprocess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, pID)
        If hprocess = 0 : ProcedureReturn -1 : EndIf       ; не удалось открыть процесс
        CallFunctionFast(IsWow64, hprocess, @temp)
        CloseHandle_(hprocess)
        If temp           ; 32-битный процесс под Win64?
          result = #True
        Else
          result = #False
        EndIf  
     EndIf  
     ProcedureReturn result  
EndProcedure
 
 
EnableDebugPrivNT("SeDebugPrivilege")      
buff1.s{1024}
 buff2.s{1024}
 buff3.s{1024}
pID = 2632            ; тут нужно поставить реальное значение из диспетчера задач            
; Открыть процесс для получения информации
hprocess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, pID)
If hprocess
  ntdll.s   = "ntdll.dll"
  nwiname.s = "NtWow64QueryInformationProcess64"
  nwmname.s = "NtWow64ReadVirtualMemory64"
  ; Прототипы функций
; NtWow64QueryInformationProcess64 (
;     IN  HANDLE            DWORD ProcessHandle,
;     IN  PROCESSINFOCLASS  DWORD ProcessInformationClass,
;     OUT PVOID             DWORD ProcessInformation,
;     IN  ULONG             DWORD ProcessInformationLength,
;     OUT PULONG            DWORD ReturnLength OPTIONAL
; )
;
; NtWow64ReadVirtualMemory64(
;     IN  HANDLE            DWORD ProcessHandle,
;     IN  ULONG64           QWORD BaseAddress,
;     OUT PVOID             DWORD Buffer,
;     IN  ULONG64           QWORD BufferLength,
;     OUT PULONG64          DWORD ReturnLength OPTIONAL
 
Prototype ProtoNtWow64ReadVirtualMemory64(ProcessHandle, BaseAddress.q, Buffer, BufferLength.q, ReturnLength.q)  
         ; Получить адрес функции NtWow64QueryInformationProcess64
     nwi = GetProcAddress_(GetModuleHandle_(ntdll), nwiname)
     ; NtWow64QueryInformationProcess64
     CallFunctionFast(nwi, hprocess, 0, @Info64, SizeOf(PROCESS_BASIC_INFORMATION_WOW64), @temp)
 
          If OpenLibrary(0, "ntdll.dll")
            NtWow64ReadVirtualMemory64.ProtoNtWow64ReadVirtualMemory64 = GetFunction(0, "NtWow64ReadVirtualMemory64")
          EndIf  
          ; Прочитать из памяти PEB64 процесса
          NtWow64ReadVirtualMemory64(hprocess, Info64\PebBaseAddress, @peb64, SizeOf(PEB64), 0)
          ; Прочитать из памяти ProcessParameters процесса        
          NtWow64ReadVirtualMemory64(hprocess, peb64\ProcessParameters, @pparam64, SizeOf(RTL_USER_PROCESS_PARAMETERS64), 0)
          ; Прочитать из памяти командную строку процесса (CommandLine)
          NtWow64ReadVirtualMemory64(hprocess, pparam64\CommandLine\Buffer, @buff1, pparam64\CommandLine\Length, @tmp.q)
          Debug PeekS(@buff1, tmp/2, #PB_Unicode)
         
          ; Прочитать из памяти рабочий каталог процесса (CurrentDirectoryPath)
          NtWow64ReadVirtualMemory64(hprocess, pparam64\CurrentDirectoryPath\Buffer, @buff2, pparam64\CurrentDirectoryPath\Length, @tmp.q)
          Debug PeekS(@buff2, tmp/2, #PB_Unicode)
          ; Прочитать из памяти путь процесса (ImagePathName)
          NtWow64ReadVirtualMemory64(hprocess, pparam64\ImagePathName\Buffer, @buff3, pparam64\ImagePathName\Length, @tmp.q)
          Debug PeekS(@buff3, tmp/2, #PB_Unicode)
          CloseHandle_(hprocess)
EndIf  


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Последний раз редактировалось pablov Вт авг 20, 2013 4:44 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 3:20 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11708
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
Не работает.
В первой строке только пара символов. а остальные пустые.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 3:35 pm 
Не в сети
доцент

Зарегистрирован: Сб янв 19, 2013 9:48 am
Сообщений: 37
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Код:
1
2
3
buff1.s{1024}
buff2.s{1024}
buff3.s{1024}



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 3:37 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Изображение

Изображение

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 4:28 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 178
Благодарил (а): 134 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
отлично всё работает, по крайней мере под х86!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 4:30 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6651
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
pablov + дополнение от rnd
Нормально:
Цитата:
C:\WINDOWS\explorer.exe
C:\Documents and Settings\user\
C:\WINDOWS\explorer.exe

Спасибо!

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 4:49 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
kvitaliy писал(а):
+ дополнение от rnd

Добавил, но у меня и без этого работало (win 7 x64)
Отпишитесь, у кого еще не работает (укажите систему плиз)

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 5:47 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср май 08, 2013 10:51 am
Сообщений: 621
Откуда: Новотроицк
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
pablov
такое же ,но через 0 кольцо,на 3ем хуков много в инете валятся,поэтому серьезно это не поможет

_________________
Порядок необходим глупцам, гений же властвует над хаосом(А.Эйнштейн ©)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 20, 2013 7:14 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Спасибо, всё работает. Windows 8 x32

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB