Land #7978, Add a test module for railgun API calls
commit
4f839299f1
|
@ -1419,7 +1419,7 @@ class Def_kernel32
|
||||||
["DWORD","nSize","in"],
|
["DWORD","nSize","in"],
|
||||||
])
|
])
|
||||||
|
|
||||||
dll.add_function( 'GetModuleHandleA', 'DWORD',[
|
dll.add_function( 'GetModuleHandleA', 'HANDLE',[
|
||||||
["PCHAR","lpModuleName","in"],
|
["PCHAR","lpModuleName","in"],
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
|
||||||
|
require 'msf/core'
|
||||||
|
|
||||||
|
lib = File.join(Msf::Config.install_root, "test", "lib")
|
||||||
|
require 'module_test'
|
||||||
|
|
||||||
|
class MetasploitModule < Msf::Post
|
||||||
|
|
||||||
|
include Msf::ModuleTest::PostTest
|
||||||
|
include Msf::Post::Windows::Railgun
|
||||||
|
|
||||||
|
def initialize(info={})
|
||||||
|
super( update_info( info,
|
||||||
|
'Name' => 'Railgun API Tests',
|
||||||
|
'Description' => %q{ This module will test railgun api functions},
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'Author' => [ 'Spencer McIntyre'],
|
||||||
|
'Platform' => [ 'windows' ]
|
||||||
|
))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_api_function_calls
|
||||||
|
|
||||||
|
it "Results should include error information" do
|
||||||
|
ret = true
|
||||||
|
result = session.railgun.kernel32.GetCurrentProcess()
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
ret &&= result['ErrorMessage'].is_a? String
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Should support functions with no parameters" do
|
||||||
|
ret = true
|
||||||
|
result = session.railgun.kernel32.GetCurrentThread()
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
ret &&= result['return'] != 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Should support functions with literal parameters" do
|
||||||
|
ret = true
|
||||||
|
result = session.railgun.kernel32.Sleep(50)
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Should support functions with in/out/inout parameter types" do
|
||||||
|
ret = true
|
||||||
|
# DnsHostnameToComputerNameA is ideal because it uses all 3 types see:
|
||||||
|
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms724244(v=vs.85).aspx
|
||||||
|
result = session.railgun.kernel32.DnsHostnameToComputerNameA('localhost', 64, 64)
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
ret &&= result['ComputerName'].is_a? String
|
||||||
|
ret &&= result['nSize'].to_i == result['ComputerName'].length
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Should support reading memory" do
|
||||||
|
ret = true
|
||||||
|
result = client.railgun.kernel32.GetModuleHandleA('kernel32')
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
ret &&= result['return'] != 0
|
||||||
|
return false unless ret
|
||||||
|
|
||||||
|
handle = result['return']
|
||||||
|
mz_header = client.railgun.memread(handle, 4)
|
||||||
|
ret &&= mz_header == "MZ\x90\x00"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Should support writing memory" do
|
||||||
|
ret = true
|
||||||
|
result = client.railgun.kernel32.GetProcessHeap()
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
ret &&= result['return'] != 0
|
||||||
|
return false unless ret
|
||||||
|
|
||||||
|
buffer_size = 32
|
||||||
|
handle = result['return']
|
||||||
|
result = client.railgun.kernel32.HeapAlloc(handle, 0, buffer_size)
|
||||||
|
ret &&= result['GetLastError'] == 0
|
||||||
|
ret &&= result['return'] != 0
|
||||||
|
return false unless ret
|
||||||
|
|
||||||
|
buffer_value = Rex::Text.rand_text_alphanumeric(buffer_size)
|
||||||
|
buffer = result['return']
|
||||||
|
ret &&= client.railgun.memwrite(buffer, buffer_value, buffer_size)
|
||||||
|
ret &&= client.railgun.memread(buffer, buffer_size) == buffer_value
|
||||||
|
|
||||||
|
client.railgun.kernel32.HeapFree(handle, 0, buffer)
|
||||||
|
ret
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue