Ниже приведен полный исходный код для вспомогательного приложения IP-адресов. В исходный код добавлена дополнительная проверка ошибок.
#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #include #include #include #include #include // Need to link with Iphlpapi.lib and Ws2_32.lib #pragma comment(lib, «iphlpapi.lib») #pragma comment(lib, «ws2_32.lib») #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) /* Note: could also use malloc() and free() */ int main() < /* Some general variables */ ULONG ulOutBufLen; DWORD dwRetVal; unsigned int i; /* variables used for GetNetworkParams */ FIXED_INFO *pFixedInfo; IP_ADDR_STRING *pIPAddr; /* variables used for GetAdapterInfo */ IP_ADAPTER_INFO *pAdapterInfo; IP_ADAPTER_INFO *pAdapter; /* variables used to print DHCP time info */ struct tm newtime; char buffer[32]; errno_t error; /* variables used for GetInterfaceInfo */ IP_INTERFACE_INFO *pInterfaceInfo; /* variables used for GetIpAddrTable */ MIB_IPADDRTABLE *pIPAddrTable; DWORD dwSize; IN_ADDR IPAddr; char *strIPAddr; /* variables used for AddIpAddress */ UINT iaIPAddress; UINT imIPMask; ULONG NTEContext; ULONG NTEInstance; /* variables used for GetIpStatistics */ MIB_IPSTATS *pStats; /* variables used for GetTcpStatistics */ MIB_TCPSTATS *pTCPStats; printf(«————————n»); printf(«This is GetNetworkParamsn»); printf(«————————n»); pFixedInfo = (FIXED_INFO *) MALLOC(sizeof (FIXED_INFO)); if (pFixedInfo == NULL) < printf(«Error allocating memory needed to call GetNetworkParamsn»); return 1; >ulOutBufLen = sizeof (FIXED_INFO); if (GetNetworkParams(pFixedInfo, FREE(pFixedInfo); pFixedInfo = (FIXED_INFO *) MALLOC(ulOutBufLen); if (pFixedInfo == NULL) < printf(«Error allocating memory needed to call GetNetworkParamsn»); return 1; >> if (dwRetVal = GetNetworkParams(pFixedInfo, printf(«GetNetworkParams failed with error %dn», dwRetVal); if (pFixedInfo) FREE(pFixedInfo); return 1; >else < printf(«tHost Name: %sn», pFixedInfo->HostName); printf(«tDomain Name: %sn», pFixedInfo->DomainName); printf(«tDNS Servers:n»); printf(«tt%sn», pFixedInfo->DnsServerList.IpAddress.String); pIPAddr = pFixedInfo->DnsServerList.Next; while (pIPAddr) < printf(«tt%sn», pIPAddr->IpAddress.String); pIPAddr = pIPAddr->Next; > printf(«tNode Type: «); switch (pFixedInfo->NodeType) < case 1: printf(«%sn», «Broadcast»); break; case 2: printf(«%sn», «Peer to peer»); break; case 4: printf(«%sn», «Mixed»); break; case 8: printf(«%sn», «Hybrid»); break; default: printf(«n»); >printf(«tNetBIOS Scope ID: %sn», pFixedInfo->ScopeId); if (pFixedInfo->EnableRouting) printf(«tIP Routing Enabled: Yesn»); else printf(«tIP Routing Enabled: Non»); if (pFixedInfo->EnableProxy) printf(«tWINS Proxy Enabled: Yesn»); else printf(«tWINS Proxy Enabled: Non»); if (pFixedInfo->EnableDns) printf(«tNetBIOS Resolution Uses DNS: Yesn»); else printf(«tNetBIOS Resolution Uses DNS: Non»); > /* Free allocated memory no longer needed */ if (pFixedInfo) < FREE(pFixedInfo); pFixedInfo = NULL; >printf(«————————n»); printf(«This is GetAdaptersInfon»); printf(«————————n»); pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO)); if (pAdapterInfo == NULL) < printf(«Error allocating memory needed to call GetAdapterInfon»); return 1; >ulOutBufLen = sizeof (IP_ADAPTER_INFO); if (GetAdaptersInfo(pAdapterInfo, FREE(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen); if (pAdapterInfo == NULL) < printf(«Error allocating memory needed to call GetAdapterInfon»); return 1; >> if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, printf(«GetAdaptersInfo failed with error %dn», dwRetVal); if (pAdapterInfo) FREE(pAdapterInfo); return 1; >pAdapter = pAdapterInfo; while (pAdapter) < printf(«tAdapter Name: t%sn», pAdapter->AdapterName); printf(«tAdapter Desc: t%sn», pAdapter->Description); printf(«tAdapter Addr: t»); for (i = 0; i < (int) pAdapter->AddressLength; i++) < if (i == (pAdapter->AddressLength — 1)) printf(«%.2Xn», (int) pAdapter->Address[i]); else printf(«%.2X-«, (int) pAdapter->Address[i]); > printf(«tIP Address: t%sn», pAdapter->IpAddressList.IpAddress.String); printf(«tIP Mask: t%sn», pAdapter->IpAddressList.IpMask.String); printf(«tGateway: t%sn», pAdapter->GatewayList.IpAddress.String); printf(«t***n»); if (pAdapter->DhcpEnabled) < printf(«tDHCP Enabled: tYesn»); printf(«tDHCP Server: t%sn», pAdapter->DhcpServer.IpAddress.String); printf(«tLease Obtained: «); /* Display local time */ error = _localtime32_s(pAdapter->LeaseObtained); if (error) printf(«tInvalid Argument to _localtime32_sn»); else < // Convert to an ASCII representation error = asctime_s(buffer, 32, if (error) printf(«Invalid Argument to asctime_sn»); else /* asctime_s returns the string terminated by n */ printf(«%s», buffer); >printf(«tLease Expires: «); error = _localtime32_s(pAdapter->LeaseExpires); if (error) printf(«Invalid Argument to _localtime32_sn»); else < // Convert to an ASCII representation error = asctime_s(buffer, 32, if (error) printf(«Invalid Argument to asctime_sn»); else /* asctime_s returns the string terminated by n */ printf(«%s», buffer); >> else printf(«tDHCP Enabled: tNon»); if (pAdapter->HaveWins) < printf(«tHave Wins: tYesn»); printf(«tPrimary Wins Server: t%sn», pAdapter->PrimaryWinsServer.IpAddress.String); printf(«tSecondary Wins Server: t%sn», pAdapter->SecondaryWinsServer.IpAddress.String); > else printf(«tHave Wins: tNon»); printf(«n»); pAdapter = pAdapter->Next; > printf(«————————n»); printf(«This is GetInterfaceInfon»); printf(«————————n»); pInterfaceInfo = (IP_INTERFACE_INFO *) MALLOC(sizeof (IP_INTERFACE_INFO)); if (pInterfaceInfo == NULL) < printf(«Error allocating memory needed to call GetInterfaceInfon»); return 1; >ulOutBufLen = sizeof (IP_INTERFACE_INFO); if (GetInterfaceInfo(pInterfaceInfo, FREE(pInterfaceInfo); pInterfaceInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen); if (pInterfaceInfo == NULL) < printf(«Error allocating memory needed to call GetInterfaceInfon»); return 1; >printf(«t The size needed for the output buffer ulLen = %ldn», ulOutBufLen); > if ((dwRetVal = GetInterfaceInfo(pInterfaceInfo, printf(«tNum Adapters: %ldnn», pInterfaceInfo->NumAdapters); for (i = 0; i < (unsigned int) pInterfaceInfo->NumAdapters; i++) < printf(«tAdapter Index[%d]: %ldn», i, pInterfaceInfo->Adapter[i].Index); printf(«tAdapter Name[%d]: %wsnn», i, pInterfaceInfo->Adapter[i].Name); > printf(«GetInterfaceInfo call succeeded.n»); > else < LPVOID lpMsgBuf = NULL; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) printf(«tError: %s», lpMsgBuf); >LocalFree(lpMsgBuf); > /* If DHCP enabled, release and renew the IP address */ /* THIS WORKS BUT IT TAKES A LONG TIME AND INTERRUPTS NET CONNECTIONS */ if (pAdapterInfo->DhcpEnabled pInterfaceInfo->NumAdapters) < printf(«Calling IpReleaseAddress for Adapter[%d]n», 0); if ((dwRetVal = IpReleaseAddress(Adapter[0])) == NO_ERROR) < printf(«Ip Release succeeded.n»); >if ((dwRetVal = IpRenewAddress(Adapter[0])) == NO_ERROR) < printf(«Ip Renew succeeded.n»); >> /* Free allocated memory no longer needed */ if (pAdapterInfo) < FREE(pAdapterInfo); pAdapterInfo = NULL; >if (pInterfaceInfo) < FREE(pInterfaceInfo); pInterfaceInfo = NULL; >printf(«———————-n»); printf(«This is GetIpAddrTablen»); printf(«———————-n»); pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE)); if (pIPAddrTable == NULL) < printf(«Error allocating memory needed to call GetIpAddrTablen»); return 1; >dwSize = 0; IPAddr.S_un.S_addr = ntohl(pIPAddrTable->table[1].dwAddr); strIPAddr = inet_ntoa(IPAddr); if (GetIpAddrTable(pIPAddrTable, FREE(pIPAddrTable); pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize); if (pIPAddrTable == NULL) < printf(«Error allocating memory needed to call GetIpAddrTablen»); return 1; >> if ((dwRetVal = GetIpAddrTable(pIPAddrTable, printf(«GetIpAddrTable failed with error %dn», dwRetVal); if (pIPAddrTable) FREE(pIPAddrTable); return 1; >printf(«tNum Entries: %ldn», pIPAddrTable->dwNumEntries); for (i = 0; i < (unsigned int) pIPAddrTable->dwNumEntries; i++) < printf(«ntInterface Index[%d]:t%ldn», i, pIPAddrTable->table[i].dwIndex); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr; printf(«tIP Address[%d]: t%sn», i, inet_ntoa(IPAddr)); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask; printf(«tSubnet Mask[%d]: t%sn», i, inet_ntoa(IPAddr)); IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr; printf(«tBroadCast[%d]: t%s (%ld%)n», i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr); printf(«tReassembly size[%d]:t%ldn», i, pIPAddrTable->table[i].dwReasmSize); printf(«tAddress Index[%d]: t%ldn», i, pIPAddrTable->table[i].dwIndex); printf(«tType and State[%d]:», i); if (pIPAddrTable->table[i].wType tPrimary IP Address»); if (pIPAddrTable->table[i].wType tDynamic IP Address»); if (pIPAddrTable->table[i].wType tAddress is on disconnected interface»); if (pIPAddrTable->table[i].wType tAddress is being deleted»); if (pIPAddrTable->table[i].wType tTransient address»); printf(«n»); > iaIPAddress = inet_addr(«192.168.0.27»); imIPMask = inet_addr(«255.255.255.0»); NTEContext = 0; NTEInstance = 0; if ((dwRetVal = AddIPAddress(iaIPAddress, imIPMask, pIPAddrTable->table[0]. dwIndex, NTEInstance)) != NO_ERROR) < LPVOID lpMsgBuf; printf(«tError adding IP address.n»); if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) printf(«tError: %s», lpMsgBuf); >LocalFree(lpMsgBuf); > if ((dwRetVal = DeleteIPAddress(NTEContext)) != NO_ERROR) < printf(«DeleteIPAddress failed with error %dn», dwRetVal); >/* Free allocated memory no longer needed */ if (pIPAddrTable) < FREE(pIPAddrTable); pIPAddrTable = NULL; >printf(«————————-n»); printf(«This is GetIPStatistics()n»); printf(«————————-n»); pStats = (MIB_IPSTATS *) MALLOC(sizeof (MIB_IPSTATS)); if (pStats == NULL) < printf(«Error allocating memory needed to call GetIpStatisticsn»); return 1; >if ((dwRetVal = GetIpStatistics(pStats)) != NO_ERROR) < printf(«GetIPStatistics failed with error %dn», dwRetVal); if (pStats) FREE(pStats); return 1; >printf(«tNumber of IP addresses: %ldn», pStats->dwNumAddr); printf(«tNumber of Interfaces: %ldn», pStats->dwNumIf); printf(«tReceives: %ldn», pStats->dwInReceives); printf(«tOut Requests: %ldn», pStats->dwOutRequests); printf(«tRoutes: %ldn», pStats->dwNumRoutes); printf(«tTimeout Time: %ldn», pStats->dwReasmTimeout); printf(«tIn Delivers: %ldn», pStats->dwInDelivers); printf(«tIn Discards: %ldn», pStats->dwInDiscards); printf(«tTotal In: %ldn», pStats->dwInDelivers + pStats->dwInDiscards); printf(«tIn Header Errors: %ldn», pStats->dwInHdrErrors); /* Free allocated memory no longer needed */ if (pStats) < FREE(pStats); pStats = NULL; >printf(«————————-n»); printf(«This is GetTCPStatistics()n»); printf(«————————-n»); pTCPStats = (MIB_TCPSTATS *) MALLOC(sizeof (MIB_TCPSTATS)); if (pTCPStats == NULL) < printf(«Error allocating memory needed to call GetTcpStatisticsn»); return 1; >if ((dwRetVal = GetTcpStatistics(pTCPStats)) != NO_ERROR) < printf(«GetTcpStatistics failed with error %dn», dwRetVal); if (pTCPStats) FREE(pTCPStats); return 1; >printf(«tActive Opens: %ldn», pTCPStats->dwActiveOpens); printf(«tPassive Opens: %ldn», pTCPStats->dwPassiveOpens); printf(«tSegments Recv: %ldn», pTCPStats->dwInSegs); printf(«tSegments Xmit: %ldn», pTCPStats->dwOutSegs); printf(«tTotal # Conxs: %ldn», pTCPStats->dwNumConns); /* Free allocated memory no longer needed */ if (pTCPStats) < FREE(pTCPStats); pTCPStats = NULL; >return 0; >
Источник: learn.microsoft.com
Как ВЗЛОМАТЬ приложение и получить ИСХОДНЫЙ КОД программы? [Reverse engineering, JetBrains dotPeek]
КАК ДЕКОМПИЛИРОВАТЬ EXE DLL C# | КАК УЗНАТЬ ИСХОДНЫЙ КОД ПРОГРАММЫ | ДЕКОМПИЛЯЦИЯ | C# ПЛЮШКИ
Исходники Windows: что это и где их можно найти
Легендарная Windows ХР уже давно канула в лету, однако по признанию многих пользователей она все еще является самой удачной операционной системой от компании Майкрософт. Она официально не поддерживается уже с 2014 года, однако до сих пор , по разным подсчетам , этой ОС пользуются около 1% пользователей интернета. Кажется, что 1% — это очень мало, однако в масштабах всей планеты это миллионы компьютеров. В связи с утечкой этим пользователям самое время подумать о безопасности, но и пользователям других версий «Винды» не время расслабляться.
Чем опасна утечка исходников Windows ХР
- во-первых, чтобы найти новые уязвимости самой Windows ХР и взломать компьютеры, которые до сих пор ее используют, и как показывает статистика , ее до сих пор используют некоторые организации, а значит , у них есть чем поживиться для хакеров;
- во-вторых, чтобы найти уязвимости ядра Windows и использовать их для взлома современных версий «Окон».
Заключение
Если вам нужны исходники Windows, то самый верны й способ — это найти «слитые» исходники Windows ХР. Если там будет весь комплект кода этой операционной системы, то вам будет его достаточно, чтобы изучить , как она работает. Восстанавливать самостоятельно исходники современных версий Windows — это очень долго и трудно, но самое главное — потребует от вас очень мощного оборудования и финансовых затрат. Потому что если бы заполучить исходники это й ОС было очень просто , то у каждого второго пользователя они бы были на руках.
Изучаем дерево исходников Windows 10: от телеметрии до open source
Насколько бы закрытым ни было программное обеспечение Microsoft, информации о своем внутреннем устройстве оно выдает предостаточно. К примеру, экспорт функций из библиотеки по именам дает представление о ее интерфейсах. В свободном доступе есть и отладочные символы, которые повсеместно используются для диагностики ошибок в ОС.
Однако на руках у нас все равно имеются только скомпилированные бинарные модули. Становится интересно: а какими они были до компиляции? Давайте попробуем разобраться, как вытащить побольше информации об исходных кодах, не делая ничего незаконного.
Идея, конечно, не нова. В свое время подобное делали и Марк Руссинович, и Алекс Ионеску. Мне лишь было интересно получить свежие данные, немного дополнив и уточнив уже проделанную другими работу. Для эксперимента нам понадобятся пакеты отладочных символов, которые есть в свободном доступе. Я взял пакеты для последней релизной версии «десятки» (64 бита), причем решил исследовать и релизный пакет (free build), и отладочный (checked build).
Отладочные символы — это набор файлов с расширением pdb (program database, база данных программы), в которых хранится различная информация для расширения возможностей отладки бинарных модулей в ОС, включая имена глобалов, функций и структур данных, иногда вместе с их содержимым.
Помимо символов можно взять условно доступную отладочную сборку «десятки». Такая сборка богата на ассерты, в которых бывают описаны не только недокументированые и отсуствующие в символьных файлах имена переменных, но и номер строки в файле, в котором сработал ассерт.
В примере видно не только имя файла и его расширение, но и структура каталогов до него, очень полезная даже без корня.
Натравливаем на файлы символов утилиту strings от sysinternals и получаем около 13 ГБ сырых данных. А вот кормить все файлы из дистрибутива отладочной сборки подряд — так себе идея, ненужных данных будет слишком много. Ограничимся набором расширений: exe — исполняемые файлы, sys — драйвера, dll — билиотеки, ocx — ActiveX-компоненты, cpl — компоненты панели управления, efi — EFI-приложения, в частности загрузчик. Сырых данных от дистрибутива набралось 5,3 ГБ.
К своему удивлению я обнаружил, что не так много программ способны хотя бы открыть файлы размером в десяток гигабайт, и уж тем более единицы смогли поддержать функцию поиска внутри таких файлов. В данном эксперименте для ручного просмотра сырых и промежуточных данных использовался 010 Editor. Фильтрация данных дешево и сердито осуществлялась скриптами на питоне.
Фильтрация данных из символьных файлов
В символьных файлах помимо прочего содержится информация компоновщика. То есть, в символьном файле присутствует список объектных файлов, которые использовались для компоновки соответствующего бинарника, причем в компоновщике используется полный путь до объектного файла.
- Зацепка-фильтр № 1: ищем строки по маске «:\».
Получаем абсолютные пути, сортируем, удаляем дубликаты. К слову, мусора получилось не так много, и он был удален вручную.
При осмотре полученных данных стала понятна примерная структура дерева исходных кодов. Корень — «d:th», что по всей видимости означает threshold, в соответствии с названием ноябрьской версии Windows 10 — Threshold 1. Однако файлов с корнем «d:th» оказалось мало. Это объясняется тем, что компоновщик принимает уже собранные файлы. А сборка объектников осуществляется в папки «d:th.obj.amd64fre» для релизной сборки и «d:th.obj.amd64chk» для отладочной.
- Зацепка-фильтр № 2: предполагаем, что исходные файлы хранятся по аналогии с объектными файлами после сборки, и осуществляем «разборку» объектных файлов в исходные. Внимание! Этот шаг может внести искажение структуры для некоторых папок, потому как достоверно не известны параметры сборки исходников.
Для примера:
d:th.obj.amd64freshellosshellgamesfreecellobjfreamd64freecellgame.obj
это бывший
d:thshellosshellgamesfreecellfreecellgame.c??
По поводу расширения файлов: объектный файл получается из кучи разных типов исходного файла: «c», «cpp», «cxx», «asm» и т. д. На данном этапе неясно, какой именно тип исходного файла использовался, поэтому оставим расширение «c??».
Помимо папки «d:th» наблюдается множество других корней. Например, «d:th.public.chk» и «d:th.public.fre». Данную папку мы опустим ввиду того, что в ней хранится публичная часть sdk, то есть она нам не очень интересна. Также стоит отметить различные пути проектов для драйверов, которые, судя по всему, собираются где-то на рабочих местах разработчиков:
c:usersjoseph-liudesktopsourcesrtl819xp_srccommonobjfre_win7_amd64amd64eeprom.obj
C:ALLPROJECTSSW_MODEMpcmamd64pcm.lib
C:Palaupalau_10.4.292.0swhostdriversbecndisinboxWS10sandboxDebugx64eth_tx.obj
C:UsersavardeDesktopinboxworkingContentsSourceswlsysamd64bcmwl63abcmwl63ax64Windows8Debugnicpci.obj
Другими словами, существует набор драйверов устройств, отвечающих стандартам, например, USB XHCI, которые входят в дерево исходных кодов ОС. А все специфичные драйвера собираются где-то в другом месте.
- Зацепка-фильтр № 3: удаляем бинарные файлы, поскольку нам интересны только исходные. Удаляем «pdb», «lib», «exp» и т. п. Файлы «res» откатываем до «rc» — исходного кода ресурсного файла.
Выходные данные становятся все красивее! Однако на этом этапе дополнительные данные получить уже практически невозможно. Переходим к следующему набору сырых данных.
Фильтрация данных из исполняемых файлов
- «c» — исходные файы на языке C,
- «cpp» — исходные файлы на языке C++,
- «cxx» — исходные файлы на C или C++,
- «h» — заголовочные файлы на языке C,
- «hpp» — заголовочные файлы на языке C++,
- «hxx» — заголовочные файлы на C или C++,
- «asm» — исходные файлы на MASM,
- «inc» — заголовочные файлы на MASM,
- «def» — описательный файл для библиотек
На этом этапе есть несколько проблем с данными, полученными из символов. Первая проблема: мы не уверены, что правильно откатили путь сборки исходного файла в объектный файл.
- Зацепка-фильтр № 4: проверим, есть ли совпадения между путями до объектных файлов и путями до исходных.
И они действительно есть! То есть, для большинства каталогов можно утверждать, что их структура восстановлена правильно. Конечно, все еще остаются сомнительные каталоги, но думаю, эта погрешность вполне приемлема. Попутно можно смело заменять расширение «c??» на расширение совпавшего по пути исходника.
Вторая проблема — заголовочные файлы. Дело в том, что это важная часть исходных файлов, однако из заголовочника не получается объектный файл, а это значит, что из информации об объектных файлах нельзя восстановить заголовочники. Приходится довольствоваться малым, а именно теми заголовочниками, которые мы нашли в сырых данных бинарных файлов.
Третья проблема: мы все еще не знаем большинство расширений исходных файлов.
- Зацепка-фильтр № 5: будем считать, что в пределах одной папки хранятся исходные файлы одинакового типа.
То есть, если в какой-либо из папок уже присутствует файл с расширением «cpp», скорее всего все его соседи будут иметь такое же расширение.
Ну а как же исходники на ассемблере? За последним штрихом можно обратиться к Windows Research Kernel — исходным кодам Windows XP — и часть исходников на ассемблере переименовать вручную.
Изучаем полученные данные
Телеметрия
Какое-то время я изучал вопрос об устройстве телеметрии в Windows 10. К сожалению, анализ на скорую руку не выявил ничего стоящего. Я не нашел никаких кейлоггеров, никакой утечки чувствительных данных, ничего, к чему можно было бы прикопаться. И первым ключевым словом для поиска среди исходных файлов было «telemetry». Результат превзошел мои ожидания: 424 совпадения.
Самые интересные приведу ниже.
Телеметрия в исходных файлах
d:thadminenterprisemgmtenterprisecspsv2certificatecorecertificatestoretelemetry.cpp
d:thbaseappcompatappraiserheadstelemetrytelemetryappraiser.cpp
d:thbaseappmodelsearchcommontelemetrytelemetry.cpp
d:thbasediagnosisfeedbacksiuflibstelemetrysiufdatacustom.c??
d:thbasediagnosispduidewizardwizardtelemetryprovider.c??
d:thbaseenterpriseclientsyncsettingsyncazurelibazuresettingsyncprovidertelemetry.cpp
d:thbasefsexfattelemetry.c
d:thbasefsfastfattelemetry.c
d:thbasefsudfstelemetry.c
d:thbasepowerenergyplatformtelemetry.c??
d:thbasepowerenergysleepstudytelemetry.c??
d:thbasestorvdsdiskpartdiskparttelemetry.c??
d:thbasestorvdsdiskraiddiskraidtelemetry.cpp
d:thbasewin32winnlselsadvancedservicesspellingplatformspecificcurrentspellingtelemetry.c??
d:thdriversinputhidhidcorehidclasstelemetry.h
d:thdriversmobilepclocationproductcorecrowdsourcelocationoriontelemetry.cpp
d:thdriversmobilepcsensorscommonhelperssensorstelemetry.cpp
d:thdriverswdmbluetoothuserbthtelemetrybthtelemetry.c??
d:thdriverswdmbluetoothuserbthtelemetryfingerprintcollector.c??
d:thdriverswdmbluetoothuserbthtelemetrylocalradiocollector.c??
d:thdriverswdmusbtelemetryregistry.c??
d:thdriverswdmusbtelemetrytelemetry.c??
d:thdsdnsserverserverdnsexednstelemetry.c??
d:thdsextliveidentitylibtracinglitemicrosoftaccounttelemetry.c??
d:thdssecuritybaselsaservercfilestelemetry.c
d:thdssecurityprotocolsmsv_sspidllntlmtelemetry.c??
d:thdssecurityprotocolsssltelemetrytelemetry.c??
d:thdssecurityprotocolssspcommonssptelemetry.c??
d:thenduserwindowsupdateclientinstallagentcommoncommontelemetry.cpp
d:thenduserwinstorelicensemanagerlibtelemetry.cpp
d:thminiondissysmpndistelemetry.c??
d:thminiosecuritybaselsasecuritydrivertelemetry.cxx
d:thminkernelfscdfstelemetry.c
d:thminkernelfsntfsmptelemetry.c??
d:thminkernelfsrefsmptelemetry.c??
d:thnetnetioiphlpsvcserviceteredo_telemetry.c
d:thnetpeernetngtorinotelemetrynotelemetrypeerdistnotelemetry.c??
d:thnetrrasipnathlpdhcptelemetryutils.c??
d:thnetwinrtnetworkingsrcsocketssocketstelemetry.h
d:thshellcortanacortanauisrctelemetrymanager.cpp
d:thshellexplorertraynotificationareatelemetry.h
d:thshellexplorerframedllribbontelemetry.c??
d:thshellfileexplorerproductfileexplorertelemetry.c??
d:thshellosshellcontrolscrnsavedefaultscreensavertelemetryc.c??
d:thwindowsmoderncoreinputv2inputprocessorsdeviceskeyboardlibkeyboardprocessortelemetry.c??
d:thwindowspublishedmaintouchtelemetry.h
d:thxboxonecoreconnectedstorageservicelibconnectedstoragetelemetryevents.cpp
d:thxboxshelluicommonxbox.shell.datatelemetryutil.c??
Комментировать, пожалуй, не стоит, поскольку все равно достоверно ничего не известно. Однако эти данные могут послужить хорошей отправной точкой для более детального исследования.
Kernel Patch Protection
Следующая находка — всеми любимый PatchGuard. Правда, в дереве исходников ОС присутствует только один файл непонятного, скорее всего бинарного типа.
d:thminkernelntoskepatchgd.wmp
Поискав совпадения в нефильтрованных данных, я обнаружил, что на самом деле Kernel Patch Protection — это отдельный проект.
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen00.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen01.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen02.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen03.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen04.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen05.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen06.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen07.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen08.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmpxcptgen09.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmp_noltcgpatchgd.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmp_noltcgpatchgda.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmp_noltcgpatchgda2.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmp_noltcgpatchgda3.c??
d:bnb_kpgminkerneloemsrckernelpatchgdmp_noltcgpatchgda4.c??
Сомнительные файлы
Не придумав больше ничего меня интересующего, я начал искать все подряд — и остался доволен!
d:thwindowscorentgdifondrvotfdatmdrvrumlibbackdoor.c??
в драйвере шрифтов?
d:thinetcoreedgehtmlsrcsitewebaudioopensourcewtfwtfvector.h
Web Template Framework, это всего лишь Web Template Framework, спорная аббревиатура. Погодите,
Open source?
d:thprintscanprintdriversrenderfiltersmsxpsfiltersutilopensourcelibjpegjaricom.c??
d:thprintscanprintdriversrenderfiltersmsxpsfiltersutilopensourcelibpngpng.c??
d:thprintscanprintdriversrenderfiltersmsxpsfiltersutilopensourcelibtifftif_compress.c??
d:thprintscanprintdriversrenderfiltersmsxpsfiltersutilopensourcezlibdeflate.c??
Думаю, на этой находке пора закругляться.
Архив с текстовым файлом со списком исходников приведен по ссылке. Делитесь своими находками в комментариях!
- Блог компании Positive Technologies
- Информационная безопасность
- Open source
- Реверс-инжиниринг
Источник: habr.com