Thanzex

NomadMemory

Dec 13th, 2011
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.25 KB | None | 0 0
  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.  
Advertisement
Add Comment
Please, Sign In to add comment