Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Перехватываю функцию ЕncryрtMеssage из secur32.dll


Автор: lollollollol 12.9.2013, 18:11
Перехватываю функцию ЕncryрtMеssage из secur32.dll

Много раз перечитывал MSDM
В итоге написал следующий код:
Код

type
  PSecBuffer=^TSecBuffer;
  TSecBuffer = record
    cBuffers :ULONG;
    BufferType:ULONG;
    pvBuffer:pointer;
  end;
  PSecBufferDesc=^TSecBufferDesc;
  TSecBufferDesc = record
    ulVersion:ULONG;
    cBuffers :ULONG;
    pBuffers:PSecBuffer;
  end;

function my_EncryptMessage(phContext:integer;fQOP:ULONG;pMessage:PSecBufferDesc;MessageSeqNo:ULONG):Integer; stdcall;
begin
OutputDebugStringA(PChar('EncryptMessage'+IntToStr(pMessage.cBuffers)+','+IntToStr(pMessage.pBuffers.cBuffers)+','+IntToStr(pMessage.pBuffers.BufferType)+' :'+PChar(pMessage.pBuffers.pvBuffer)));
  Result:=old_EncryptMessage(phContext,fQOP,pMessage,MessageSeqNo);
end;


Как результат переменная pMessage.cBuffers содержит информацию, что имеется 3 или 4 блока данных. 
Я всегда получаю только хедер заголовка, без POST запроса, в чём проблема?
Я думаю дело в том что информация хранится в остальных блоках, но как их найти, где они?

Как получить всю инфу, которая передаётся в эту функцию? 

Автор: Illusion Dolphin 12.9.2013, 18:23
Цитата

в чём проблема?

Имхо вы неправильно перевели структуры. Вот тут http://technet.microsoft.com/en-us/library/bb742535.aspx судя по описанию они другие:
Код

//
// SecBuffer
//
// Generic memory descriptors for buffers passed in to the security
// API
//
typedef struct _SecBuffer {
unsigned long cbBuffer;    // Size of the buffer, in bytes
unsigned long BufferType;   // Type of the buffer (below)
void SEC_FAR * pvBuffer;   // Pointer to the buffer
} SecBuffer, SEC_FAR * PSecBuffer;
typedef struct _SecBufferDesc {
unsigned long ulVersion;   // Version number
unsigned long cBuffers;    // Number of buffers
#ifdef MIDL_PASS
[size_is(cBuffers)]
#endif
PSecBuffer pBuffers;    // Pointer to array of buffers
} SecBufferDesc, SEC_FAR * PSecBufferDesc;
#define SECBUFFER_VERSION   0
#define SECBUFFER_EMPTY    0 // Undefined, replaced by provider
#define SECBUFFER_DATA    1 // Packet data
#define SECBUFFER_TOKEN    2 // Security token
#define SECBUFFER_PKG_PARAMS  3 // Package specific parameters
#define SECBUFFER_MISSING   4 // Missing Data indicator
#define SECBUFFER_EXTRA    5 // Extra data
#define SECBUFFER_STREAM_TRAILER 6 // Security Trailer
#define SECBUFFER_STREAM_HEADER  7 // Security Header
#define SECBUFFER_ATTRMASK   0xF0000000
#define SECBUFFER_READONLY   0x80000000 // Buffer is read-only

SecBuffer  Buffers[3];
SecBufferDesc BufferDesc;
...
BufferDesc.ulVersion = SECBUFFER_VERSION;
BufferDesc.cBuffers = 3;
BufferDesc.pBuffers = &Buffers;
Buffers[0].cbBuffer = sizeof(Protocol_Header);
Buffers[0].BufferType = SECBUFFER_READONLY | SECBUFFER_DATA;
Buffers[0].pvBuffer = pHeader;
Buffers[1].cbBuffer = pHeader->MessageSize;
Buffers[1].BufferType = SECBUFFER_DATA;
Buffers[1].pvBuffer = pMessage;
Buffers[2].cbBuffer = pHeader->TrailerSize;
Buffers[2].BufferType = SECBUFFER_READONLY | SECBUFFER_TOKEN;
Buffers[2].pvBuffer = pSecurityTrailer;


Для делфи это будет чтото вроде (не компилировал, но суть, думаю, понятна):
Код

type
  PSecBuffer=^TSecBuffer;
  TSecBuffer = record
    cBuffers :ULONG;
    BufferType:ULONG;
    pvBuffer:Pointer;
  end;
  ArrSecBuffer = array[0..0] of TSecBuffer; 
  PArrSecBuffer = ^PArrSecBuffer;
  PSecBufferDesc=^TSecBufferDesc;
  TSecBufferDesc = record
    ulVersion:ULONG;
    cBuffers :ULONG;
    pBuffers:PArrSecBuffer;
  end;

Автор: lollollollol 12.9.2013, 18:54
Я брал описание структур и функции тут
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379815%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379814%28v=vs.85%29.aspx

Сразу видно, мастер, спасибо! Получил ВСЕ данные.
Но вот незадача:
Иногда данные начинаются как бы не сначала:
Цитата

[31264] EncryptMessage0,5,2:ё˜
[31264] ЁPOST /cgi-bin/auth?from=splash HTTP/1.1 

перед POST могут быть разное количество данных, всяких символов. В конце пакетов тоже самое.
Плюс почемуто часть пакетов пустые.

И ещё странность, длину структуры получаю так:
IntToStr(pMessage.pBuffers[a].cBuffers), в данном примере оно отобразило 5, но чаще покаывает цифры больше 900

В чём может быть дело?

Чуть подправил ваш вариант, вот так структуру объявил
Код

  PSecBuffer=^TSecBuffer;
  TSecBuffer = record
    cBuffers :ULONG;
    BufferType:ULONG;
    pvBuffer:Pointer;
  end;
  ArrSecBuffer = array[0..3] of TSecBuffer;
  PArrSecBuffer = ^ArrSecBuffer;
  PSecBufferDesc=^TSecBufferDesc;
  TSecBufferDesc = record
    ulVersion:ULONG;
    cBuffers :ULONG;
    pBuffers:PArrSecBuffer;
  end;

Автор: Illusion Dolphin 12.9.2013, 22:11
Цитата

Но вот незадача:

Не вижу кода логирования и кода перехвата - сложно сказать

Автор: lollollollol 14.9.2013, 19:01
Я разобрался, хотя честно признаться сам не совсем понял что сделал - в один момент всё заработало как по маслу, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)