Любопытна она тем, что вместе с I_RpcInitImports, I_RpcInitFwImports & I_RpcInitHttpImports возвращает некие таблицы с указателями на функции, причем в отличие от перечисленных возвращаемая таблица NdrPrivateCallbackTable расположена в секции .data, что делает ее хорошим кандидатом для установки разнообразных беспалевных хуков
Вызывается I_RpcInitNdrImports из ровно одного модуля - ole32.dll - в ф-ции NdrOleInitializeImports, которая в свою очередь вызывается из DllMain & NdrOleInitializeExtension
Возвращаемая структура выглядит примерно так (мне лениво прототипы функций выяснять, потому они описаны как PBYTE):
32 бита:
struct NDR_CALLBACK_ROUTINES_TABLE
{
PBYTE NdrpServerMarshal; /* func */
PBYTE NdrpServerOutInit; /* func */
PBYTE NdrpSizing; /* func */
PBYTE NdrClientZeroOut; /* func */
PBYTE I_RpcSetNDRSlot; /* func */
PBYTE I_RpcGetAndSetNDRSlot; /* func */
PBYTE I_RpcGetNDRSlot; /* func */
PBYTE NdrpClientMarshal; /* func */
PBYTE NdrpClientUnMarshal; /* func */
PBYTE NdrpFreeMemoryList; /* func */
PBYTE NdrpFreeParams; /* func */
PBYTE NdrpServerUnMarshal; /* func */
PBYTE NdrpPerformRpcInitialization; /* func */
PBYTE GlobalMutexClear; /* func */
PBYTE GlobalMutexRequest; /* func */
PBYTE PrintCurrentStackTrace; /* func */
PBYTE NdrpCheckMIDLRobust; /* func */
PBYTE DbgPrintUUID; /* func */
PBYTE NdrpAddCorrelationData; /* func */
PBYTE NdrpRecordCustomUnmarshal; /* func */
PBYTE NdrpComputeConformance; /* func */
PBYTE NdrpLogIIDMisMatchEvent; /* func */
PBYTE MemSizeRoutinesTable; // ptr to
table MIDL_STUB_MESSAGE MemSizeRoutinesTable
PBYTE NdrUDTSimpeTypeConvert; // ptr to unnamed table MIDL_STUB_MESSAGE
PBYTE FreeRoutines; // ptr to exported pfnFreeRoutines
PBYTE MarshallRoutines; // ptr to exported pfnMarshallRoutines
PBYTE SizeRoutines; // ptr to exported pfnSizeRoutines
PBYTE UnmarshallRoutines; // ptr to exported pfnUnmarshallRoutines
PBYTE GetRpcVerifierSettings; /* func */
DWORD gfRPCVerifierEnabled;
PBYTE AllocWrapper; /* func */
PBYTE FreeWrapper; /* func */
};
64 бита:
struct NDR_CALLBACK_ROUTINES_TABLE64
{
NDR_CALLBACK_ROUTINES_TABLE stub32;
PBYTE NdrpClientCall2; /* func */
PBYTE NdrpClientCall3; /* func */
PBYTE Ndr64ClientInitializeContext; /* func */
PBYTE NdrServerSetupNDR64TransferSyntax; /* func */
PBYTE Ndr64pCheckCorrelation; /* func */
PBYTE Ndr64EvaluateExpr; /* func */
PBYTE Ndr64SimpleTypeBufferSize; // not function
PBYTE Ndr64SimpleTypeMemorySize; // not function
PBYTE Ndr64TypeFlags; // not function
PBYTE Ndr64MemSizeRoutinesTable; // not function
PBYTE Ndr64pServerUnMarshal; /* func */
PBYTE Ndr64pServerOutInit; /* func */
PBYTE Ndr64pSizing; /* func */
PBYTE Ndr64pServerMarshal; /* func */
PBYTE Ndr64ServerInitialize; /* func */
PBYTE Ndr64ClearOutParameters; /* func */
PBYTE Ndr64ClientInitialize; /* func */
PBYTE Ndr64pFreeParams; /* func */
PBYTE MulNdrpInitializeContextFromProc; /* func */
PBYTE Ndr64ClientZeroOut; /* func */
PBYTE Ndr64pClientUnMarshal; /* func */
PBYTE Ndr64pClientSetupTransferSyntax; /* func */
};
Комментариев нет:
Отправить комментарий