суббота, 16 апреля 2011 г.

I_RpcInitNdrImports

а вот например в windows7 появилась в rpcrt4 такая любопытная ф-ция
Любопытна она тем, что вместе с 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 */
};

Комментариев нет:

Отправить комментарий