kkDav1337

NomadMemory.au3

Nov 12th, 2018
5,833
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 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
Add Comment
Please, Sign In to add comment