48
48
except ImportError :
49
49
has_winreg = False
50
50
51
+ try :
52
+ import winreg
53
+ has_winreg = True
54
+ except ImportError :
55
+ has_winreg = (has_winreg or False )
56
+
51
57
if sys .version_info [0 ] < 3 :
52
58
is_str = lambda obj : issubclass (obj .__class__ , str )
53
59
is_bytes = lambda obj : issubclass (obj .__class__ , str )
@@ -1271,9 +1277,10 @@ def stdapi_registry_close_key(request, response):
1271
1277
def stdapi_registry_create_key (request , response ):
1272
1278
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
1273
1279
base_key = packet_get_tlv (request , TLV_TYPE_BASE_KEY )['value' ]
1280
+ base_key = ctypes .create_string_buffer (bytes (base_key , 'UTF-8' ))
1274
1281
permission = packet_get_tlv (request , TLV_TYPE_PERMISSION ).get ('value' , winreg .KEY_ALL_ACCESS )
1275
1282
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 :
1277
1284
response += tlv_pack (TLV_TYPE_HKEY , res_key .value )
1278
1285
return ERROR_SUCCESS , response
1279
1286
return ERROR_FAILURE , response
@@ -1282,18 +1289,20 @@ def stdapi_registry_create_key(request, response):
1282
1289
def stdapi_registry_delete_key (request , response ):
1283
1290
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
1284
1291
base_key = packet_get_tlv (request , TLV_TYPE_BASE_KEY )['value' ]
1292
+ base_key = ctypes .create_string_buffer (bytes (base_key , 'UTF-8' ))
1285
1293
flags = packet_get_tlv (request , TLV_TYPE_FLAGS )['value' ]
1286
1294
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 ) )
1288
1296
else :
1289
- result = ctypes .windll .advapi32 .RegDeleteKeyA (root_key , base_key )
1297
+ result = ctypes .windll .advapi32 .RegDeleteKeyA (root_key , ctypes . byref ( base_key ) )
1290
1298
return result , response
1291
1299
1292
1300
@meterpreter .register_function_windll
1293
1301
def stdapi_registry_delete_value (request , response ):
1294
1302
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
1295
1303
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 ))
1297
1306
return result , response
1298
1307
1299
1308
@meterpreter .register_function_windll
@@ -1362,9 +1371,10 @@ def stdapi_registry_load_key(request, response):
1362
1371
def stdapi_registry_open_key (request , response ):
1363
1372
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
1364
1373
base_key = packet_get_tlv (request , TLV_TYPE_BASE_KEY )['value' ]
1374
+ base_key = ctypes .create_string_buffer (bytes (base_key , 'UTF-8' ))
1365
1375
permission = packet_get_tlv (request , TLV_TYPE_PERMISSION ).get ('value' , winreg .KEY_ALL_ACCESS )
1366
1376
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 :
1368
1378
response += tlv_pack (TLV_TYPE_HKEY , handle_id .value )
1369
1379
return ERROR_SUCCESS , response
1370
1380
return ERROR_FAILURE , response
@@ -1394,24 +1404,26 @@ def stdapi_registry_query_class(request, response):
1394
1404
1395
1405
@meterpreter .register_function_windll
1396
1406
def stdapi_registry_query_value (request , response ):
1397
- REG_SZ = 1
1398
- REG_DWORD = 4
1399
1407
hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1400
1408
value_name = packet_get_tlv (request , TLV_TYPE_VALUE_NAME )['value' ]
1409
+ value_name = ctypes .create_string_buffer (bytes (value_name , 'UTF-8' ))
1401
1410
value_type = ctypes .c_uint32 ()
1402
1411
value_type .value = 0
1403
1412
value_data = (ctypes .c_ubyte * 4096 )()
1404
1413
value_data_sz = ctypes .c_uint32 ()
1405
1414
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 ))
1407
1416
if result == ERROR_SUCCESS :
1408
1417
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 :
1410
1419
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 :
1412
1421
value = value_data [:4 ]
1413
1422
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 )
1415
1427
response += tlv_pack (TLV_TYPE_VALUE_DATA , value )
1416
1428
else :
1417
1429
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):
1422
1434
def stdapi_registry_set_value (request , response ):
1423
1435
hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1424
1436
value_name = packet_get_tlv (request , TLV_TYPE_VALUE_NAME )['value' ]
1437
+ value_name = ctypes .create_string_buffer (bytes (value_name , 'UTF-8' ))
1425
1438
value_type = packet_get_tlv (request , TLV_TYPE_VALUE_TYPE )['value' ]
1426
1439
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 ))
1428
1441
return result , response
1429
1442
1430
1443
@meterpreter .register_function_windll
0 commit comments