Skip to content

Commit e2cc2fe

Browse files
committed
Pymeterpreter update win reg functions for python v3
1 parent 04e94b0 commit e2cc2fe

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

data/meterpreter/ext_server_stdapi.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@
4848
except ImportError:
4949
has_winreg = False
5050

51+
try:
52+
import winreg
53+
has_winreg = True
54+
except ImportError:
55+
has_winreg = (has_winreg or False)
56+
5157
if sys.version_info[0] < 3:
5258
is_str = lambda obj: issubclass(obj.__class__, str)
5359
is_bytes = lambda obj: issubclass(obj.__class__, str)
@@ -1271,9 +1277,10 @@ def stdapi_registry_close_key(request, response):
12711277
def stdapi_registry_create_key(request, response):
12721278
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)['value']
12731279
base_key = packet_get_tlv(request, TLV_TYPE_BASE_KEY)['value']
1280+
base_key = ctypes.create_string_buffer(bytes(base_key, 'UTF-8'))
12741281
permission = packet_get_tlv(request, TLV_TYPE_PERMISSION).get('value', winreg.KEY_ALL_ACCESS)
12751282
res_key = ctypes.c_void_p()
1276-
if ctypes.windll.advapi32.RegCreateKeyExA(root_key, base_key, 0, None, 0, permission, None, ctypes.byref(res_key), None) == ERROR_SUCCESS:
1283+
if ctypes.windll.advapi32.RegCreateKeyExA(root_key, ctypes.byref(base_key), 0, None, 0, permission, None, ctypes.byref(res_key), None) == ERROR_SUCCESS:
12771284
response += tlv_pack(TLV_TYPE_HKEY, res_key.value)
12781285
return ERROR_SUCCESS, response
12791286
return ERROR_FAILURE, response
@@ -1282,18 +1289,20 @@ def stdapi_registry_create_key(request, response):
12821289
def stdapi_registry_delete_key(request, response):
12831290
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)['value']
12841291
base_key = packet_get_tlv(request, TLV_TYPE_BASE_KEY)['value']
1292+
base_key = ctypes.create_string_buffer(bytes(base_key, 'UTF-8'))
12851293
flags = packet_get_tlv(request, TLV_TYPE_FLAGS)['value']
12861294
if (flags & DELETE_KEY_FLAG_RECURSIVE):
1287-
result = ctypes.windll.shlwapi.SHDeleteKeyA(root_key, base_key)
1295+
result = ctypes.windll.shlwapi.SHDeleteKeyA(root_key, ctypes.byref(base_key))
12881296
else:
1289-
result = ctypes.windll.advapi32.RegDeleteKeyA(root_key, base_key)
1297+
result = ctypes.windll.advapi32.RegDeleteKeyA(root_key, ctypes.byref(base_key))
12901298
return result, response
12911299

12921300
@meterpreter.register_function_windll
12931301
def stdapi_registry_delete_value(request, response):
12941302
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)['value']
12951303
value_name = packet_get_tlv(request, TLV_TYPE_VALUE_NAME)['value']
1296-
result = ctypes.windll.advapi32.RegDeleteValueA(root_key, value_name)
1304+
value_name = ctypes.create_string_buffer(bytes(value_name, 'UTF-8'))
1305+
result = ctypes.windll.advapi32.RegDeleteValueA(root_key, ctypes.byref(value_name))
12971306
return result, response
12981307

12991308
@meterpreter.register_function_windll
@@ -1362,9 +1371,10 @@ def stdapi_registry_load_key(request, response):
13621371
def stdapi_registry_open_key(request, response):
13631372
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)['value']
13641373
base_key = packet_get_tlv(request, TLV_TYPE_BASE_KEY)['value']
1374+
base_key = ctypes.create_string_buffer(bytes(base_key, 'UTF-8'))
13651375
permission = packet_get_tlv(request, TLV_TYPE_PERMISSION).get('value', winreg.KEY_ALL_ACCESS)
13661376
handle_id = ctypes.c_void_p()
1367-
if ctypes.windll.advapi32.RegOpenKeyExA(root_key, base_key, 0, permission, ctypes.byref(handle_id)) == ERROR_SUCCESS:
1377+
if ctypes.windll.advapi32.RegOpenKeyExA(root_key, ctypes.byref(base_key), 0, permission, ctypes.byref(handle_id)) == ERROR_SUCCESS:
13681378
response += tlv_pack(TLV_TYPE_HKEY, handle_id.value)
13691379
return ERROR_SUCCESS, response
13701380
return ERROR_FAILURE, response
@@ -1394,24 +1404,26 @@ def stdapi_registry_query_class(request, response):
13941404

13951405
@meterpreter.register_function_windll
13961406
def stdapi_registry_query_value(request, response):
1397-
REG_SZ = 1
1398-
REG_DWORD = 4
13991407
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
14001408
value_name = packet_get_tlv(request, TLV_TYPE_VALUE_NAME)['value']
1409+
value_name = ctypes.create_string_buffer(bytes(value_name, 'UTF-8'))
14011410
value_type = ctypes.c_uint32()
14021411
value_type.value = 0
14031412
value_data = (ctypes.c_ubyte * 4096)()
14041413
value_data_sz = ctypes.c_uint32()
14051414
value_data_sz.value = ctypes.sizeof(value_data)
1406-
result = ctypes.windll.advapi32.RegQueryValueExA(hkey, value_name, 0, ctypes.byref(value_type), value_data, ctypes.byref(value_data_sz))
1415+
result = ctypes.windll.advapi32.RegQueryValueExA(hkey, ctypes.byref(value_name), 0, ctypes.byref(value_type), value_data, ctypes.byref(value_data_sz))
14071416
if result == ERROR_SUCCESS:
14081417
response += tlv_pack(TLV_TYPE_VALUE_TYPE, value_type.value)
1409-
if value_type.value == REG_SZ:
1418+
if value_type.value == winreg.REG_SZ:
14101419
response += tlv_pack(TLV_TYPE_VALUE_DATA, ctypes.string_at(value_data) + NULL_BYTE)
1411-
elif value_type.value == REG_DWORD:
1420+
elif value_type.value == winreg.REG_DWORD:
14121421
value = value_data[:4]
14131422
value.reverse()
1414-
value = ''.join(map(chr, value))
1423+
if sys.version_info[0] < 3:
1424+
value = ''.join(map(chr, value))
1425+
else:
1426+
value = bytes(value)
14151427
response += tlv_pack(TLV_TYPE_VALUE_DATA, value)
14161428
else:
14171429
response += tlv_pack(TLV_TYPE_VALUE_DATA, ctypes.string_at(value_data, value_data_sz.value))
@@ -1422,9 +1434,10 @@ def stdapi_registry_query_value(request, response):
14221434
def stdapi_registry_set_value(request, response):
14231435
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
14241436
value_name = packet_get_tlv(request, TLV_TYPE_VALUE_NAME)['value']
1437+
value_name = ctypes.create_string_buffer(bytes(value_name, 'UTF-8'))
14251438
value_type = packet_get_tlv(request, TLV_TYPE_VALUE_TYPE)['value']
14261439
value_data = packet_get_tlv(request, TLV_TYPE_VALUE_DATA)['value']
1427-
result = ctypes.windll.advapi32.RegSetValueExA(hkey, value_name, 0, value_type, value_data, len(value_data))
1440+
result = ctypes.windll.advapi32.RegSetValueExA(hkey, ctypes.byref(value_name), 0, value_type, value_data, len(value_data))
14281441
return result, response
14291442

14301443
@meterpreter.register_function_windll

0 commit comments

Comments
 (0)