Class: Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Thread

Inherits:
Object
  • Object
show all
Defined in:
lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb

Overview

Interfaces with a process’ executing threads by enumerating, opening, and creating threads.

Instance Method Summary collapse

Constructor Details

#initialize(process) ⇒ Thread

Initializes a thread instance that operates in the context of the supplied process instance.



33
34
35
# File 'lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb', line 33

def initialize(process)
	self.process = process
end

Instance Method Details

#create(entry, parameter = nil, suspended = false) ⇒ Object

Creates a new thread in the context of the process and returns a Sys::Thread instance.



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
# File 'lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb', line 80

def create(entry, parameter = nil, suspended = false)
	request = Packet.create_request('stdapi_sys_process_thread_create')
	creation_flags = 0

	request.add_tlv(TLV_TYPE_PROCESS_HANDLE, process.handle)
	request.add_tlv(TLV_TYPE_ENTRY_POINT, entry)

	# Are we passing a parameter to the entry point of the thread?
	if (parameter != nil)
		request.add_tlv(TLV_TYPE_ENTRY_PARAMETER, parameter)
	end

	# Should we create the thread suspended?
	if (suspended)
		creation_flags |= CREATE_SUSPENDED
	end

	request.add_tlv(TLV_TYPE_CREATION_FLAGS, creation_flags)

	# Transmit the request
	response = process.client.send_request(request)	


	thread_id     = response.get_tlv_value(TLV_TYPE_THREAD_ID)
	thread_handle = response.get_tlv_value(TLV_TYPE_THREAD_HANDLE)

	# Create a thread class instance
	return Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Thread.new(
			process, thread_handle, thread_id)
end

#each_thread(&block) ⇒ Object

Enumerate through each thread identifier.



114
115
116
# File 'lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb', line 114

def each_thread(&block)
	get_threads.each(&block)
end

#get_threadsObject

Returns an array of thread identifiers.



121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb', line 121

def get_threads
	request = Packet.create_request('stdapi_sys_process_thread_get_threads')
	threads = []

	request.add_tlv(TLV_TYPE_PID, process.pid)

	response = process.client.send_request(request)

	response.each(TLV_TYPE_THREAD_ID) { |thr|
		threads << thr.value
	}

	return threads
end

#open(tid, access = THREAD_ALL) ⇒ Object

Opens an existing thread that is running within the context of the process and returns a Sys::Thread instance.



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
# File 'lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb', line 47

def open(tid, access = THREAD_ALL)
	request = Packet.create_request('stdapi_sys_process_thread_open')
	real    = 0

	# Translate access
	if (access & THREAD_READ)
		real |= THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | SYNCHRONIZE
	end

	if (access & THREAD_WRITE)
		real |= THREAD_SET_CONTEXT | THREAD_SET_INFORMATION | THREAD_SET_THREAD_TOKEN | THREAD_IMPERSONATE | THREAD_DIRECT_IMPERSONATION
	end

	if (access & THREAD_EXECUTE)
		real |= THREAD_TERMINATE | THREAD_SUSPEND_RESUME | SYNCHRONIZE
	end

	# Add the thread identifier and permissions
	request.add_tlv(TLV_TYPE_THREAD_ID, tid)
	request.add_tlv(TLV_TYPE_THREAD_PERMS, real)

	# Transmit the request
	response = process.client.send_request(request)

	# Create a thread class instance
	return Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Thread.new(
			process, response.get_tlv_value(TLV_TYPE_THREAD_HANDLE), tid)
end