Как и ожидалось, программно дампить ключ шифрования трафика в WoT плёвое дело, правда сделал я это очень грязным способом - подменил libeay32.dll на свою, оригинальную dll переименовал в libeay33.dll. Внутри моей dll нет ничего интересного - практически весь
экспорт форвардится в одноимённые функции из libeay33.dll за исключением единственной функции BF_set_key, которая реализована тривиально:
#define BF_ENCRYPT 1
#define BF_DECRYPT 0
#define BF_LONG unsigned int
#define BF_ROUNDS 16
#define BF_BLOCK 8
typedef struct bf_key_st
{
BF_LONG P[BF_ROUNDS+2];
BF_LONG S[4*256];
} BF_KEY;
void myBF_set_key(BF_KEY *key, int len, const unsigned char *data)
{
SYSTEMTIME st;
GetLocalTime(&st);
WCHAR fname[MAX_PATH];
wsprintf(fname, L".\\key_%.4d%.2d%.2d_%.2d%.2d%.2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
HANDLE hFile=CreateFile(fname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, NULL);
if (hFile!=INVALID_HANDLE_VALUE)
{
DWORD wr;
WriteFile(hFile, data, len, &wr, NULL);
CloseHandle(hFile);
}
void (*orig_f)(BF_KEY *, int, const unsigned char*)=(void (*)(BF_KEY *, int, const unsigned char*))GetProcAddress(GetModuleHandle(L"libeay33"), "BF_set_key");
if (orig_f)
{
orig_f(key, len, data);
}
}
В .def файле прописана она так:
BF_set_key=myBF_set_key @46
А остальные так:
...
BF_ecb_encrypt=libeay33.BF_ecb_encrypt @42
BF_encrypt=libeay33.BF_encrypt @43
BF_ofb64_encrypt=libeay33.BF_ofb64_encrypt @44
BF_options=libeay33.BF_options @45
Аналогичным образом можно перехватить и BF_ecb_encrypt, где можно дампить весь трафик непосредственно перед шифрованием (для исходящего) или сразу после расшифровки (для входящего). Правда там есть нюансы, т.к. вызовы идут из разных потоков, в итоге либо получается каша в файле, либо начинаются тормоза из-за кривой синхронизации, которую я наваял за 5 минут. В любом случае, трафик не самое интересное, интереснее поковырять питоновскую часть, где, скорее всего,
много вкуснятины. Жаль выходные быстро закончились, ну ничего, ещё одни через 5 дней, может ещё займусь.