SHOW:
|
|
- or go back to the newest paste.
1 | #include-once | |
2 | #region _Memory | |
3 | ;================================================================================== | |
4 | ; AutoIt Version: 3.1.127 (beta) | |
5 | ; Language: English | |
6 | ; Platform: All Windows | |
7 | ; Author: Nomad | |
8 | ; Requirements: These functions will only work with beta. | |
9 | ;================================================================================== | |
10 | ; Credits: wOuter - These functions are based on his original _Mem() functions. | |
11 | ; But they are easier to comprehend and more reliable. These | |
12 | ; functions are in no way a direct copy of his functions. His | |
13 | ; functions only provided a foundation from which these evolved. | |
14 | ;================================================================================== | |
15 | ; | |
16 | ; Functions: | |
17 | ; | |
18 | ;================================================================================== | |
19 | ; Function: _MemoryOpen($iv_Pid[, $iv_DesiredAccess[, $iv_InheritHandle]]) | |
20 | ; Description: Opens a process and enables all possible access rights to the | |
21 | ; process. The Process ID of the process is used to specify which | |
22 | ; process to open. You must call this function before calling | |
23 | ; _MemoryClose(), _MemoryRead(), or _MemoryWrite(). | |
24 | ; Parameter(s): $iv_Pid - The Process ID of the program you want to open. | |
25 | ; $iv_DesiredAccess - (optional) Set to 0x1F0FFF by default, which | |
26 | ; enables all possible access rights to the | |
27 | ; process specified by the Process ID. | |
28 | ; $iv_InheritHandle - (optional) If this value is TRUE, all processes | |
29 | ; created by this process will inherit the access | |
30 | ; handle. Set to 1 (TRUE) by default. Set to 0 | |
31 | ; if you want it FALSE. | |
32 | ; Requirement(s): None. | |
33 | ; Return Value(s): On Success - Returns an array containing the Dll handle and an | |
34 | ; open handle to the specified process. | |
35 | ; On Failure - Returns 0 | |
36 | ; @Error - 0 = No error. | |
37 | ; 1 = Invalid $iv_Pid. | |
38 | ; 2 = Failed to open Kernel32.dll. | |
39 | ; 3 = Failed to open the specified process. | |
40 | ; Author(s): Nomad | |
41 | ; Note(s): | |
42 | ;================================================================================== | |
43 | Func _MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $iv_InheritHandle = 1) | |
44 | ||
45 | If Not ProcessExists($iv_Pid) Then | |
46 | SetError(1) | |
47 | Return 0 | |
48 | EndIf | |
49 | ||
50 | Local $ah_Handle[2] = [DllOpen('kernel32.dll')] | |
51 | ||
52 | If @Error Then | |
53 | SetError(2) | |
54 | Return 0 | |
55 | EndIf | |
56 | ||
57 | Local $av_OpenProcess = DllCall($ah_Handle[0], 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $iv_InheritHandle, 'int', $iv_Pid) | |
58 | ||
59 | If @Error Then | |
60 | DllClose($ah_Handle[0]) | |
61 | SetError(3) | |
62 | Return 0 | |
63 | EndIf | |
64 | ||
65 | $ah_Handle[1] = $av_OpenProcess[0] | |
66 | ||
67 | Return $ah_Handle | |
68 | ||
69 | EndFunc | |
70 | ||
71 | ;================================================================================== | |
72 | ; Function: _MemoryRead($iv_Address, $ah_Handle[, $sv_Type]) | |
73 | ; Description: Reads the value located in the memory address specified. | |
74 | ; Parameter(s): $iv_Address - The memory address you want to read from. It must | |
75 | ; be in hex format (0x00000000). | |
76 | ; $ah_Handle - An array containing the Dll handle and the handle | |
77 | ; of the open process as returned by _MemoryOpen(). | |
78 | ; $sv_Type - (optional) The "Type" of value you intend to read. | |
79 | ; This is set to 'dword'(32bit(4byte) signed integer) | |
80 | ; by default. See the help file for DllStructCreate | |
81 | ; for all types. An example: If you want to read a | |
82 | ; word that is 15 characters in length, you would use | |
83 | ; 'char[16]' since a 'char' is 8 bits (1 byte) in size. | |
84 | ; Return Value(s): On Success - Returns the value located at the specified address. | |
85 | ; On Failure - Returns 0 | |
86 | ; @Error - 0 = No error. | |
87 | ; 1 = Invalid $ah_Handle. | |
88 | ; 2 = $sv_Type was not a string. | |
89 | ; 3 = $sv_Type is an unknown data type. | |
90 | ; 4 = Failed to allocate the memory needed for the DllStructure. | |
91 | ; 5 = Error allocating memory for $sv_Type. | |
92 | ; 6 = Failed to read from the specified process. | |
93 | ; Author(s): Nomad | |
94 | ; Note(s): Values returned are in Decimal format, unless specified as a | |
95 | ; 'char' type, then they are returned in ASCII format. Also note | |
96 | ; that size ('char[size]') for all 'char' types should be 1 | |
97 | ; greater than the actual size. | |
98 | ;================================================================================== | |
99 | Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword') | |
100 | ||
101 | If Not IsArray($ah_Handle) Then | |
102 | SetError(1) | |
103 | Return 0 | |
104 | EndIf | |
105 | ||
106 | Local $v_Buffer = DllStructCreate($sv_Type) | |
107 | ||
108 | If @Error Then | |
109 | SetError(@Error + 1) | |
110 | Return 0 | |
111 | EndIf | |
112 | ||
113 | DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '') | |
114 | ||
115 | If Not @Error Then | |
116 | Local $v_Value = DllStructGetData($v_Buffer, 1) | |
117 | Return $v_Value | |
118 | Else | |
119 | SetError(6) | |
120 | Return 0 | |
121 | EndIf | |
122 | ||
123 | EndFunc | |
124 | ||
125 | ;================================================================================== | |
126 | ; Function: _MemoryWrite($iv_Address, $ah_Handle, $v_Data[, $sv_Type]) | |
127 | ; Description: Writes data to the specified memory address. | |
128 | ; Parameter(s): $iv_Address - The memory address which you want to write to. | |
129 | ; It must be in hex format (0x00000000). | |
130 | ; $ah_Handle - An array containing the Dll handle and the handle | |
131 | ; of the open process as returned by _MemoryOpen(). | |
132 | ; $v_Data - The data to be written. | |
133 | ; $sv_Type - (optional) The "Type" of value you intend to write. | |
134 | ; This is set to 'dword'(32bit(4byte) signed integer) | |
135 | ; by default. See the help file for DllStructCreate | |
136 | ; for all types. An example: If you want to write a | |
137 | ; word that is 15 characters in length, you would use | |
138 | ; 'char[16]' since a 'char' is 8 bits (1 byte) in size. | |
139 | ; Return Value(s): On Success - Returns 1 | |
140 | ; On Failure - Returns 0 | |
141 | ; @Error - 0 = No error. | |
142 | ; 1 = Invalid $ah_Handle. | |
143 | ; 2 = $sv_Type was not a string. | |
144 | ; 3 = $sv_Type is an unknown data type. | |
145 | ; 4 = Failed to allocate the memory needed for the DllStructure. | |
146 | ; 5 = Error allocating memory for $sv_Type. | |
147 | ; 6 = $v_Data is not in the proper format to be used with the | |
148 | ; "Type" selected for $sv_Type, or it is out of range. | |
149 | ; 7 = Failed to write to the specified process. | |
150 | ; Author(s): Nomad | |
151 | ; Note(s): Values sent must be in Decimal format, unless specified as a | |
152 | ; 'char' type, then they must be in ASCII format. Also note | |
153 | ; that size ('char[size]') for all 'char' types should be 1 | |
154 | ; greater than the actual size. | |
155 | ;================================================================================== | |
156 | Func _MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword') | |
157 | ||
158 | If Not IsArray($ah_Handle) Then | |
159 | SetError(1) | |
160 | Return 0 | |
161 | EndIf | |
162 | ||
163 | Local $v_Buffer = DllStructCreate($sv_Type) | |
164 | ||
165 | If @Error Then | |
166 | SetError(@Error + 1) | |
167 | Return 0 | |
168 | Else | |
169 | DllStructSetData($v_Buffer, 1, $v_Data) | |
170 | If @Error Then | |
171 | SetError(6) | |
172 | Return 0 | |
173 | EndIf | |
174 | EndIf | |
175 | ||
176 | DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '') | |
177 | ||
178 | If Not @Error Then | |
179 | Return 1 | |
180 | Else | |
181 | SetError(7) | |
182 | Return 0 | |
183 | EndIf | |
184 | ||
185 | EndFunc | |
186 | ||
187 | ;================================================================================== | |
188 | ; Function: _MemoryClose($ah_Handle) | |
189 | ; Description: Closes the process handle opened by using _MemoryOpen(). | |
190 | ; Parameter(s): $ah_Handle - An array containing the Dll handle and the handle | |
191 | ; of the open process as returned by _MemoryOpen(). | |
192 | ; Return Value(s): On Success - Returns 1 | |
193 | ; On Failure - Returns 0 | |
194 | ; @Error - 0 = No error. | |
195 | ; 1 = Invalid $ah_Handle. | |
196 | ; 2 = Unable to close the process handle. | |
197 | ; Author(s): Nomad | |
198 | ; Note(s): | |
199 | ;================================================================================== | |
200 | Func _MemoryClose($ah_Handle) | |
201 | ||
202 | If Not IsArray($ah_Handle) Then | |
203 | SetError(1) | |
204 | Return 0 | |
205 | EndIf | |
206 | ||
207 | DllCall($ah_Handle[0], 'int', 'CloseHandle', 'int', $ah_Handle[1]) | |
208 | If Not @Error Then | |
209 | DllClose($ah_Handle[0]) | |
210 | Return 1 | |
211 | Else | |
212 | DllClose($ah_Handle[0]) | |
213 | SetError(2) | |
214 | Return 0 | |
215 | EndIf | |
216 | ||
217 | EndFunc | |
218 | ||
219 | ;================================================================================== | |
220 | ; Function: SetPrivilege( $privilege, $bEnable ) | |
221 | ; Description: Enables (or disables) the $privilege on the current process | |
222 | ; (Probably) requires administrator privileges to run | |
223 | ; | |
224 | ; Author(s): Larry (from autoitscript.com's Forum) | |
225 | ; Notes(s): | |
226 | ; http://www.autoitscript.com/forum/index.php?s=&showtopic=31248&view=findpost&p=223999 | |
227 | ;================================================================================== | |
228 | ||
229 | Func SetPrivilege( $privilege, $bEnable ) | |
230 | ||
231 | Const $TOKEN_ADJUST_PRIVILEGES = 0x0020 | |
232 | Const $TOKEN_QUERY = 0x0008 | |
233 | Const $SE_PRIVILEGE_ENABLED = 0x0002 | |
234 | Local $hToken, $SP_auxret, $SP_ret, $hCurrProcess, $nTokens, $nTokenIndex, $priv | |
235 | $nTokens = 1 | |
236 | $LUID = DLLStructCreate("dword;int") | |
237 | If IsArray($privilege) Then $nTokens = UBound($privilege) | |
238 | $TOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]") | |
239 | $NEWTOKEN_PRIVILEGES = DLLStructCreate("dword;dword[" & (3 * $nTokens) & "]") | |
240 | $hCurrProcess = DLLCall("kernel32.dll","hwnd","GetCurrentProcess") | |
241 | $SP_auxret = DLLCall("advapi32.dll","int","OpenProcessToken","hwnd",$hCurrProcess[0], _ | |
242 | "int",BitOR($TOKEN_ADJUST_PRIVILEGES,$TOKEN_QUERY),"int_ptr",0) | |
243 | If $SP_auxret[0] Then | |
244 | $hToken = $SP_auxret[3] | |
245 | DLLStructSetData($TOKEN_PRIVILEGES,1,1) | |
246 | $nTokenIndex = 1 | |
247 | While $nTokenIndex <= $nTokens | |
248 | If IsArray($privilege) Then | |
249 | $priv = $privilege[$nTokenIndex-1] | |
250 | Else | |
251 | $priv = $privilege | |
252 | EndIf | |
253 | $ret = DLLCall("advapi32.dll","int","LookupPrivilegeValue","str","","str",$priv, _ | |
254 | "ptr",DLLStructGetPtr($LUID)) | |
255 | If $ret[0] Then | |
256 | If $bEnable Then | |
257 | DLLStructSetData($TOKEN_PRIVILEGES,2,$SE_PRIVILEGE_ENABLED,(3 * $nTokenIndex)) | |
258 | Else | |
259 | DLLStructSetData($TOKEN_PRIVILEGES,2,0,(3 * $nTokenIndex)) | |
260 | EndIf | |
261 | DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,1),(3 * ($nTokenIndex-1)) + 1) | |
262 | DLLStructSetData($TOKEN_PRIVILEGES,2,DllStructGetData($LUID,2),(3 * ($nTokenIndex-1)) + 2) | |
263 | DLLStructSetData($LUID,1,0) | |
264 | DLLStructSetData($LUID,2,0) | |
265 | EndIf | |
266 | $nTokenIndex += 1 | |
267 | WEnd | |
268 | $ret = DLLCall("advapi32.dll","int","AdjustTokenPrivileges","hwnd",$hToken,"int",0, _ | |
269 | "ptr",DllStructGetPtr($TOKEN_PRIVILEGES),"int",DllStructGetSize($NEWTOKEN_PRIVILEGES), _ | |
270 | "ptr",DllStructGetPtr($NEWTOKEN_PRIVILEGES),"int_ptr",0) | |
271 | $f = DLLCall("kernel32.dll","int","GetLastError") | |
272 | EndIf | |
273 | $NEWTOKEN_PRIVILEGES=0 | |
274 | $TOKEN_PRIVILEGES=0 | |
275 | $LUID=0 | |
276 | If $SP_auxret[0] = 0 Then Return 0 | |
277 | $SP_auxret = DLLCall("kernel32.dll","int","CloseHandle","hwnd",$hToken) | |
278 | If Not $ret[0] And Not $SP_auxret[0] Then Return 0 | |
279 | return $ret[0] | |
280 | EndFunc ;==>SetPrivilege | |
281 | ||
282 | #endregion | |
283 | ||
284 | ||
285 |