@@ -1334,10 +1334,12 @@ def stdapi_net_socket_tcp_shutdown(request, response):
1334
1334
channel .shutdown (how )
1335
1335
return ERROR_SUCCESS , response
1336
1336
1337
+ def _wreg_close_key (hkey ):
1338
+ ctypes .windll .advapi32 .RegCloseKey (hkey )
1339
+
1337
1340
@meterpreter .register_function_windll
1338
1341
def stdapi_registry_close_key (request , response ):
1339
- hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1340
- result = ctypes .windll .advapi32 .RegCloseKey (hkey )
1342
+ _wreg_close_key (packet_get_tlv (request , TLV_TYPE_HKEY )['value' ])
1341
1343
return ERROR_SUCCESS , response
1342
1344
1343
1345
@meterpreter .register_function_windll
@@ -1372,11 +1374,9 @@ def stdapi_registry_delete_value(request, response):
1372
1374
result = ctypes .windll .advapi32 .RegDeleteValueA (root_key , ctypes .byref (value_name ))
1373
1375
return result , response
1374
1376
1375
- @meterpreter .register_function_windll
1376
- def stdapi_registry_enum_key (request , response ):
1377
+ def _wreg_enum_key (request , response , hkey ):
1377
1378
ERROR_MORE_DATA = 0xea
1378
1379
ERROR_NO_MORE_ITEMS = 0x0103
1379
- hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1380
1380
name = (ctypes .c_char * 4096 )()
1381
1381
index = 0
1382
1382
tries = 0
@@ -1399,10 +1399,22 @@ def stdapi_registry_enum_key(request, response):
1399
1399
return result , response
1400
1400
1401
1401
@meterpreter .register_function_windll
1402
- def stdapi_registry_enum_value (request , response ):
1402
+ def stdapi_registry_enum_key (request , response ):
1403
+ hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1404
+ return _wreg_enum_key (request , response , hkey )
1405
+
1406
+ @meterpreter .register_function_windll
1407
+ def stdapi_registry_enum_key_direct (request , response ):
1408
+ err , hkey = _wreg_open_key (request )
1409
+ if err != ERROR_SUCCESS :
1410
+ return err , response
1411
+ ret = _wreg_enum_key (request , response , hkey )
1412
+ _wreg_close_key (hkey )
1413
+ return ret
1414
+
1415
+ def _wreg_enum_value (request , response , hkey ):
1403
1416
ERROR_MORE_DATA = 0xea
1404
1417
ERROR_NO_MORE_ITEMS = 0x0103
1405
- hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1406
1418
name = (ctypes .c_char * 4096 )()
1407
1419
name_sz = ctypes .c_uint32 ()
1408
1420
index = 0
@@ -1426,6 +1438,20 @@ def stdapi_registry_enum_value(request, response):
1426
1438
index += 1
1427
1439
return result , response
1428
1440
1441
+ @meterpreter .register_function_windll
1442
+ def stdapi_registry_enum_value (request , response ):
1443
+ hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1444
+ return _wreg_enum_value (request , response , hkey )
1445
+
1446
+ @meterpreter .register_function_windll
1447
+ def stdapi_registry_enum_value_direct (request , response ):
1448
+ err , hkey = _wreg_open_key (request )
1449
+ if err != ERROR_SUCCESS :
1450
+ return err , response
1451
+ ret = _wreg_enum_value (request , response , hkey )
1452
+ _wreg_close_key (hkey )
1453
+ return ret
1454
+
1429
1455
@meterpreter .register_function_windll
1430
1456
def stdapi_registry_load_key (request , response ):
1431
1457
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )
@@ -1434,16 +1460,22 @@ def stdapi_registry_load_key(request, response):
1434
1460
result = ctypes .windll .advapi32 .RegLoadKeyA (root_key , sub_key , file_name )
1435
1461
return result , response
1436
1462
1437
- @meterpreter .register_function_windll
1438
- def stdapi_registry_open_key (request , response ):
1463
+ def _wreg_open_key (request ):
1439
1464
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
1440
1465
base_key = packet_get_tlv (request , TLV_TYPE_BASE_KEY )['value' ]
1441
1466
base_key = ctypes .create_string_buffer (bytes (base_key , 'UTF-8' ))
1442
1467
permission = packet_get_tlv (request , TLV_TYPE_PERMISSION ).get ('value' , winreg .KEY_ALL_ACCESS )
1443
1468
handle_id = ctypes .c_void_p ()
1444
1469
if ctypes .windll .advapi32 .RegOpenKeyExA (root_key , ctypes .byref (base_key ), 0 , permission , ctypes .byref (handle_id )) != ERROR_SUCCESS :
1445
- return error_result_windows (), response
1446
- response += tlv_pack (TLV_TYPE_HKEY , handle_id .value )
1470
+ return error_result_windows (), 0
1471
+ return ERROR_SUCCESS , handle_id .value
1472
+
1473
+ @meterpreter .register_function_windll
1474
+ def stdapi_registry_open_key (request , response ):
1475
+ err , hkey = _wreg_open_key (request )
1476
+ if err != ERROR_SUCCESS :
1477
+ return err , response
1478
+ response += tlv_pack (TLV_TYPE_HKEY , hkey )
1447
1479
return ERROR_SUCCESS , response
1448
1480
1449
1481
@meterpreter .register_function_windll
@@ -1467,9 +1499,7 @@ def stdapi_registry_query_class(request, response):
1467
1499
response += tlv_pack (TLV_TYPE_VALUE_DATA , ctypes .string_at (value_data ))
1468
1500
return ERROR_SUCCESS , response
1469
1501
1470
- @meterpreter .register_function_windll
1471
- def stdapi_registry_query_value (request , response ):
1472
- hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1502
+ def _query_value (request , response , hkey ):
1473
1503
value_name = packet_get_tlv (request , TLV_TYPE_VALUE_NAME )['value' ]
1474
1504
value_name = ctypes .create_string_buffer (bytes (value_name , 'UTF-8' ))
1475
1505
value_type = ctypes .c_uint32 ()
@@ -1496,15 +1526,41 @@ def stdapi_registry_query_value(request, response):
1496
1526
return error_result_windows (), response
1497
1527
1498
1528
@meterpreter .register_function_windll
1499
- def stdapi_registry_set_value (request , response ):
1529
+ def stdapi_registry_query_value (request , response ):
1500
1530
hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1531
+ return _query_value (request , response , hkey )
1532
+
1533
+ @meterpreter .register_function_windll
1534
+ def stdapi_registry_query_value_direct (request , response ):
1535
+ err , hkey = _wreg_open_key (request )
1536
+ if err != ERROR_SUCCESS :
1537
+ return err , response
1538
+ ret = _query_value (request , response , hkey )
1539
+ _wreg_close_key (hkey )
1540
+ return ret
1541
+
1542
+ def _set_value (request , response , hkey ):
1501
1543
value_name = packet_get_tlv (request , TLV_TYPE_VALUE_NAME )['value' ]
1502
1544
value_name = ctypes .create_string_buffer (bytes (value_name , 'UTF-8' ))
1503
1545
value_type = packet_get_tlv (request , TLV_TYPE_VALUE_TYPE )['value' ]
1504
1546
value_data = packet_get_tlv (request , TLV_TYPE_VALUE_DATA )['value' ]
1505
1547
result = ctypes .windll .advapi32 .RegSetValueExA (hkey , ctypes .byref (value_name ), 0 , value_type , value_data , len (value_data ))
1506
1548
return result , response
1507
1549
1550
+ @meterpreter .register_function_windll
1551
+ def stdapi_registry_set_value (request , response ):
1552
+ hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1553
+ return _set_value (request , response , hkey )
1554
+
1555
+ @meterpreter .register_function_windll
1556
+ def stdapi_registry_set_value_direct (request , response ):
1557
+ err , hkey = _wreg_open_key (request )
1558
+ if err != ERROR_SUCCESS :
1559
+ return err , response
1560
+ ret = _set_value (request , response , hkey )
1561
+ _wreg_close_key (hkey )
1562
+ return ret
1563
+
1508
1564
@meterpreter .register_function_windll
1509
1565
def stdapi_registry_unload_key (request , response ):
1510
1566
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
0 commit comments