class Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Thread
This class implements the Rex::Post::Thread
interface which wrappers a logical thread for a given process.
Public Class Methods
close(client, handle)
click to toggle source
Closes the thread handle.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 162 def self.close(client, handle) request = Packet.create_request('stdapi_sys_process_thread_close') request.add_tlv(TLV_TYPE_THREAD_HANDLE, handle) client.send_request(request, nil) handle = nil return true end
finalize(client,handle)
click to toggle source
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 41 def self.finalize(client,handle) proc { self.close(client,handle) } end
new(process, handle, tid)
click to toggle source
Initialize the thread instance.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 32 def initialize(process, handle, tid) self.process = process self.handle = handle self.tid = tid # Ensure the remote object is closed when all references are removed ObjectSpace.define_finalizer(self, self.class.finalize(process.client, handle)) end
Public Instance Methods
close()
click to toggle source
Instance method
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 171 def close unless self.handle.nil? ObjectSpace.undefine_finalizer(self) self.class.close(self.process.client, self.handle) self.handle = nil end end
pretty_regs()
click to toggle source
Formats the registers in a pretty way.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 140 def pretty_regs regs = query_regs buf = sprintf("eax=%.8x ebx=%.8x ecx=%.8x edx=%.8x esi=%.8x edi=%.8x\n", regs['eax'], regs['ebx'], regs['ecx'], regs['edx'], regs['esi'], regs['edi']) buf += sprintf("eip=%.8x esp=%.8x ebp=%.8x\n", regs['eip'], regs['esp'], regs['ebp']) buf += sprintf("cs=%.4x ss=%.4x ds=%.4x es=%.4x fs=%.4x gs=%.4x\n", regs['cs'], regs['ss'], regs['ds'], regs['es'], regs['fs'], regs['gs']) return buf end
query_regs()
click to toggle source
Queries the register state of the thread.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 100 def query_regs request = Packet.create_request('stdapi_sys_process_thread_query_regs') regs = {} request.add_tlv(TLV_TYPE_THREAD_HANDLE, handle) response = process.client.send_request(request) response.each(TLV_TYPE_REGISTER) { |reg| regs[reg.get_tlv_value(TLV_TYPE_REGISTER_NAME)] = reg.get_tlv_value(TLV_TYPE_REGISTER_VALUE_32) } return regs end
resume()
click to toggle source
Resumes the thread's execution.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 67 def resume request = Packet.create_request('stdapi_sys_process_thread_resume') request.add_tlv(TLV_TYPE_THREAD_HANDLE, handle) process.client.send_request(request) return true end
set_regs(regs_hash)
click to toggle source
Sets the register state of the thread. The registers are supplied in the form of a hash.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 119 def set_regs(regs_hash) request = Packet.create_request('stdapi_sys_process_thread_set_regs') request.add_tlv(TLV_TYPE_THREAD_HANDLE, handle) # Add all of the register that we're setting regs_hash.each_key { |name| t = request.add_tlv(TLV_TYPE_REGISTER) t.add_tlv(TLV_TYPE_REGISTER_NAME, name) t.add_tlv(TLV_TYPE_REGISTER_VALUE_32, regs_hash[name]) } process.client.send_request(request) return true end
suspend()
click to toggle source
Suspends the thread's execution.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 54 def suspend request = Packet.create_request('stdapi_sys_process_thread_suspend') request.add_tlv(TLV_TYPE_THREAD_HANDLE, handle) process.client.send_request(request) return true end
terminate(code)
click to toggle source
Terminates the thread's execution.
# File lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb, line 80 def terminate(code) request = Packet.create_request('stdapi_sys_process_thread_terminate') request.add_tlv(TLV_TYPE_THREAD_HANDLE, handle) request.add_tlv(TLV_TYPE_EXIT_CODE, code) process.client.send_request(request) return true end