//fills in the system folder path in the form \\device\\... //Input 'plen' points to the number of available bytes in 'path' //Output 'plen' points to the actual number of bytes fillen in ULONG GetSystemDirectory(PWCHAR path, PULONG plen) { WCHAR qRes[256]; WCHAR *wc; _wcsnset(path, 0, *plen); _wcsnset(qRes, 0, 256); /* QueryRegValue(SYSTEM_PARTITION_KEY, SYSTEM_PARTITION_VALUE, qRes); //DbgPrint("Key Data for SysPart = %S\n", qRes); wcscpy(path, qRes); _wcsnset(qRes, 0, 256); */ QueryRegValue(SYSTEM_ROOT_KEY, SYSTEM_ROOT_VALUE, qRes); wcscpy(path, qRes); _wcsnset(qRes, 0, 256); QueryRegValue(DLL_DIR_KEY, DLL_DIR_VALUE, qRes); wc = wcschr(qRes, L'\\'); if(wc != NULL){ wcscat(path, L"\\"); wcscat(path, &wc[1]); } //DbgPrint("Path = <%S>", path); //wcscpy(path, L"\\device\\harddiskvolume2\\WINDOWS\\system32"); return 1; //success }
void FillMiscDatas(Skype_Inst *pInst, unsigned int *Datas) { BYTE Buffer[0x400]; DWORD BufSz = 0x400; int ret; int64_t PlatForm; PlatForm = PlatFormSpecific(); Datas[0] = *(unsigned int *)&PlatForm; Datas[1] = *(unsigned int *)&pInst->NodeID; if (!QueryRegValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ProductId", (LPBYTE)Buffer, &BufSz)) return; Datas[2] = BytesSHA1(Buffer, BufSz); BufSz = 0x400; if (!QueryRegValue(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter\\*\\DiskController\\*\\DiskPeripheral\\*\\Identifier", (LPBYTE)Buffer, &BufSz)) return; Datas[3] = BytesSHA1(Buffer, BufSz); ret = GetVolumeInformationA("C:\\", 0, 0, (LPDWORD)Buffer, 0, 0, 0, 0); Datas[4] = BytesSHA1(Buffer, 0x04); }
__int64 PlatFormSpecific() { BYTE Buffer[0x400]; DWORD BufSz = 0x400; int Idx, Used; Used = Idx = 0; if (QueryRegValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ProductId", (LPBYTE)Buffer, &BufSz)) Used += BufSz; BufSz = sizeof(Buffer)-Used; if (QueryRegValue(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter\\*\\DiskController\\*\\DiskPeripheral\\*\\Identifier", (LPBYTE)Buffer + Used, &BufSz)) Used += BufSz; #ifdef SKYPE5 else { *((unsigned int*)&Buffer[Used]) = FillAdaptersInfo((unsigned int*)&Buffer[Used+4]); Used+=8; } #endif if (GetVolumeInformationA("C:\\", 0, 0, (LPDWORD)(Buffer + Used), 0, 0, 0, 0)) Used+=4; return BytesSHA1I64(Buffer, Used); }
static BOOL QueryRegValue(HKEY hKey, LPCSTR lpSubKey, LPBYTE lpValue, LPDWORD pCbValue) { char *pSubKey, *pTok, szKey[256]={0}; DWORD dwIndex; LONG ret; if ( !lpSubKey || !*lpSubKey ) return FALSE; if ( *lpSubKey != '*' ) { for (pSubKey = (char*)lpSubKey; *pSubKey != '*'; pSubKey = pTok + 1) if (!(pTok = strchr(pSubKey, '\\'))) break; if ( pSubKey > lpSubKey ) { if ( pSubKey - lpSubKey == 1 ) return FALSE; strncpy (szKey, lpSubKey, pSubKey - lpSubKey - 1); if (RegOpenKeyA (hKey, szKey, &hKey) == ERROR_SUCCESS) { ret = QueryRegValue(hKey, pSubKey, lpValue, pCbValue); RegCloseKey(hKey); return ret; } return FALSE; } if ( *lpSubKey != '*' ) return RegQueryValueExA (hKey, lpSubKey, NULL, NULL, lpValue, pCbValue) == ERROR_SUCCESS; } if (lpSubKey[1] != '\\') return RegQueryValueExA (hKey, lpSubKey, NULL, NULL, lpValue, pCbValue) == ERROR_SUCCESS; for (dwIndex = 0; (ret = RegEnumKeyA (hKey, dwIndex, szKey, sizeof(szKey))) == ERROR_SUCCESS; dwIndex++) { char szSubKey[256]; sprintf (szSubKey, "%s%s", szKey, lpSubKey+1); if (QueryRegValue (hKey, szSubKey, lpValue, pCbValue)) break; } return ret == ERROR_SUCCESS; }
void InitNodeId(Skype_Inst *pInst) { DWORD BufSz = sizeof(pInst->NodeID); HKEY hKey; if (QueryRegValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\FakeSkype\\NodeId", (LPBYTE)&pInst->NodeID, &BufSz)) return; *(int64_t *)&pInst->NodeID = BytesRandomI64(); if (RegCreateKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\FakeSkype", &hKey) == ERROR_SUCCESS) { RegSetValueExA(hKey, "NodeId", 0, REG_BINARY, (LPBYTE)&pInst->NodeID, sizeof(pInst->NodeID)); RegCloseKey(hKey); } //FIXED NODEID //memcpy_s(NodeID, NODEID_SZ, "\x49\x63\xff\xee\xe0\x5c\x9d\xf8", NODEID_SZ); //memcpy_s(NodeID, NODEID_SZ, "\x97\xca\xb1\x72\x06\xf6\x72\xb4", NODEID_SZ); }