Windows 10ソースツリーの学習:テレメトリからオープンソースまで

画像






Microsoftソフトウェアがどれほど閉鎖的であっても、その内部デバイスに関する情報はたくさんあります。 たとえば、ライブラリから名前で関数をエクスポートすると、そのインターフェイスの概念がわかります。 また、パブリックドメインにはデバッグシンボルがあり、OSのエラーを診断するために広く使用されています。 ただし、コンパイル済みのバイナリモジュールはまだ手元にあります。 興味深いことになります。コンパイル前は何でしたか? 違法なことを何もせずにソースコードに関する詳細情報を取得する方法を考えてみましょう。



もちろん、このアイデアは新しいものではありません。 かつて、Mark RussinovichとAlex Ionescuの両方が同じことをしました。 私は、最新のデータを取得し、他の人がすでに行った小さな作業を追加して明確にすることにのみ興味がありました。 実験のために、パブリックドメインにあるデバッグシンボルのパッケージが必要です。 トップ10(64ビット)の最新リリースバージョンのパッケージを取り上げ、リリースパッケージ(フリービルド)とデバッグ(チェックビルド)の両方を調査することにしました。



デバッグシンボルは、OS内のバイナリモジュールのデバッグ機能を拡張するためのさまざまな情報を格納する拡張pdb(プログラムデータベース、プログラムデータベース)を持つファイルのセットです。グローバル、関数、データ構造の名前、およびその内容も含まれることがあります。



シンボルに加えて、条件付きで使用可能なデバッグアセンブリ「10」を使用できます。 このようなアセンブリにはアサーションが豊富であり、シンボルファイル内の文書化されていない変数名だけでなく、アサーションが機能するファイル内の行番号も記述します。



画像



この例は、ファイル名とその拡張子だけでなく、その前のディレクトリ構造も示しており、ルートがなくても非常に便利です。



文字列ユーティリティをsysinternalsから文字ファイルに設定し、約13 GBの生データを取得します。 しかし、デバッグアセンブリの配布キットからすべてのファイルを連続してフィードするには、あまりにも多くの不必要なデータが必要になります。 exe-実行可能ファイル、sys-ドライバー、dll-ライブラリ、ocx-ActiveXコンポーネント、cpl-コントロールパネルコンポーネント、efi-EFIアプリケーション、特にブートローダーの拡張機能に限定します。 ディストリビューションからの生データは5.3 GBでした。



驚いたことに、少なくとも数十ギガバイトのサイズのファイルを開くことができるプログラムは多くないことがわかりました。さらに、ユニットはそのようなファイル内の検索機能をサポートできました。 この実験では、010 Editorを使用して生データと中間データを手動で表示しました。 安価で怒ったデータのフィルタリングは、Pythonスクリプトによって実行されました。



文字ファイルからデータをフィルタリングする



とりわけ、シンボルファイルにはリンカー情報が含まれています。 つまり、シンボルファイルには、対応するバイナリを構成するために使用されたオブジェクトファイルのリストがあり、オブジェクトファイルへのフルパスがリンカで使用されます。



画像








  • フックフィルターNo. 1:マスク ":\\"の行を探します。



絶対パスを取得し、並べ替え、重複を削除します。 ちなみに、ゴミはそれほど多くなく、手動で削除されました。



受信したデータを調べると、ソースツリーのおおよその構造が明らかになりました。 ルートは「d:\ th」です。これは、Windows 10の11月バージョンの名前であるしきい値1に基づいて、明らかにしきい値を意味します。 これは、リンカがすでに収集されたファイルを受け入れるためです。 そして、オブジェクトのアセンブリは、リリースビルドの場合は「d:\ th.obj.amd64fre」、デバッグの場合は「d:\ th.obj.amd64chk」フォルダーで実行されます。



  • フックフィルターNo. 2:ソースファイルは、アセンブリ後にオブジェクトファイルと同様に保存されると想定し、オブジェクトファイルをソースファイルに「ソート」します。 注意! この手順では、ソースアセンブリのパラメーターが確実にわからないため、一部のフォルダーの構造に歪みが生じる場合があります。



例:

d:\ th.obj.amd64fre \ shell \ osshell \ games \ freecell \ objfre \ amd64 \ freecellgame.obj

これは前者です

d:\ th \ shell \ osshell \ games \ freecell \ freecellgame.c ??



ファイル拡張子について:オブジェクトファイルは、「c」、「cpp」、「cxx」、「asm」など、さまざまな種類のソースファイルから取得されます。この段階では、どの種類のソースファイルが使用されたかは不明です。 「C ??」。



d:\ thフォルダーに加えて、他の多くのルートがあります。 たとえば、「d:\ th.public.chk」および「d:\ th.public.fre」。 このフォルダーは、sdkの公開部分が含まれているという事実のため、省略します。つまり、私たちにとってあまり興味深いものではありません。 また、ドライバー向けのプロジェクトのさまざまな方法に注目する価値があります。これは明らかに、開発者の職場のどこかで行われています。



c:\ users \ joseph-liu \ desktop \ sources \ rtl819xp_src \ common \ objfre_win7_amd64 \ amd64 \ eeprom.obj

C:\ ALLPROJECTS \ SW_MODEM \ pcm \ amd64 \ pcm.lib

C:\ Palau \ palau_10.4.292.0 \ sw \ host \ drivers \ becndis \ inbox \ WS10 \ sandbox \ Debug \ x64 \ eth_tx.obj

C:\ Users \ avarde \ Desktop \ inbox \ working \ Contents \ Sources \ wl \ sys \ amd64 \ bcmwl63a \ bcmwl63a \ x64 \ Windows8Debug \ nicpci.obj



言い換えれば、OSソースツリーに含まれているUSB XHCIなど、標準を満たすデバイスドライバーのセットがあります。 そして、特定のドライバーはすべて別の場所に向かっています。



  • フックフィルターNo. 3:ソースファイルのみに関心があるため、バイナリファイルを削除します。 「pdb」、「lib」、「exp」などを削除します。ファイル「res」は、リソースファイルのソースコードである「rc」にロールバックされます。



画像








出力がより美しくなっています! ただし、この段階では、追加のデータを取得することはほとんど不可能です。 次の生データのセットに進みます。



実行可能ファイルからのデータのフィルタリング



生データには絶対パスがほとんどなかったため、行を拡張機能でフィルタリングします。



データをフィルタリングした後、結果のパスにはルートがありませんが、ディレクトリ構造はそれに対して構築されていることを示唆していることが明らかになります。 つまり、すべてのパスでルートの先頭に「d:\ th」を追加するだけで済みます。



この時点で、文字から派生したデータにはいくつかの問題があります。 最初の問題:ソースファイルのアセンブリパスをオブジェクトファイルに正しくロールバックしたかどうかはわかりません。



  • フックフィルターNo. 4:オブジェクトファイルへのパスとソースへのパスの間に一致があるかどうかを確認します。



そして彼らは本当に! つまり、ほとんどのディレクトリについて、それらの構造が正しく復元されたと主張することができます。 もちろん、疑わしいカタログはまだ残っていますが、このエラーは受け入れられると思います。 途中で、拡張子「c ??」をパスに一致するソースコードの拡張子に安全に置き換えることができます。



2番目の問題はヘッダーファイルです。 これはソースファイルの重要な部分ですが、オブジェクトファイルはヘッダーから取得されないため、オブジェクトファイルに関する情報からヘッダーを復元することはできません。 小さなもの、つまりバイナリファイルの生データで見つかった見出しに満足する必要があります。



3番目の問題:まだほとんどのソースファイル拡張子がわかりません。



  • フックフィルターNo. 5:同じフォルダー内に同じタイプのソースファイルが保存されていると仮定します。



つまり、拡張子が "cpp"のファイルがいずれかのフォルダーに既に存在する場合、ほとんどの場合、そのすべての隣接するフォルダーの拡張子は同じになります。

画像






さて、アセンブラーのソースはどうですか? 最後に、Windows Research Kernel(Windows XPのソースコード)を使用して、アセンブラソースの一部の名前を手動で変更できます。



得られたデータを調査します



テレメトリー



しばらくの間、私はWindows 10のテレメトリデバイスの問題を研究しました。 残念ながら、簡単な分析では価値のあることは明らかになりませんでした。 キーロガー、機密データの漏洩、触ることのないものは見つかりませんでした。 そして、ソースファイルを検索する最初のキーワードは「テレメトリー」でした。 結果は予想を上回りました:424件の一致。 以下に最も興味深いものを挙げます。



ソースファイルのテレメトリ
d:\ th \ admin \ enterprisemgmt \ enterprisecsps \ v2 \ certificatecore \ certificatestoretelemetry.cpp

d:\ th \ base \ appcompat \ appraiser \ heads \ telemetry \ telemetryappraiser.cpp

d:\ th \ base \ appmodel \ search \ common \ telemetry \ telemetry.cpp

d:\ th \ base \ diagnostic \ feedback \ siuf \ libs \ telemetry \ siufdatacustom.c ??

d:\ th \ base \ diagnostic \ pdui \ de \ wizard \ wizardtelemetryprovider.c ??

d:\ th \ base \ enterpriseclientsync \ settingsync \ azure \ lib \ azuresettingsyncprovidertelemetry.cpp

d:\ th \ base \ fs \ exfat \ telemetry.c

d:\ th \ base \ fs \ fastfat \ telemetry.c

d:\ th \ base \ fs \ udfs \ telemetry.c

d:\ th \ base \ power \ energy \ platformtelemetry.c ??

d:\ th \ base \ power \ energy \ sleepstudytelemetry.c ??

d:\ th \ base \ stor \ vds \ diskpart \ diskparttelemetry.c ??

d:\ th \ base \ stor \ vds \ diskraid \ diskraidtelemetry.cpp

d:\ th \ base \ win32 \ winnls \ els \ advancedservices \ spelling \ platformspecific \ current \ spellingtelemetry.c ??

d:\ th \ドライバー\入力\ hid \ hidcore \ hidclass \ telemetry.h

d:\ th \ドライバー\ mobilepc \ location \ product \ core \ crowdsource \ locationoriontelemetry.cpp

d:\ th \ドライバー\ mobilepc \センサー\共通\ヘルパー\ sensortelemetry.cpp

d:\ th \ドライバー\ wdm \ bluetooth \ユーザー\ bthtelemetry \ bthtelemetry.c ??

d:\ th \ドライバー\ wdm \ bluetooth \ユーザー\ bthtelemetry \ Fingerprintcollector.c ??

d:\ th \ドライバー\ wdm \ bluetooth \ユーザー\ bthtelemetry \ localradiocollector.c ??

d:\ th \ drivers \ wdm \ usb \ telemetry \ registry.c ??

d:\ th \ drivers \ wdm \ usb \ telemetry \ telemetry.c ??

d:\ th \ ds \ dns \ server \ server \ dnsexe \ dnstelemetry.c ??

d:\ th \ ds \ ext \ live \ identity \ lib \ tracing \ lite \ microsoftaccounttelemetry.c ??

d:\ th \ ds \ security \ base \ lsa \ server \ cfiles \ telemetry.c

d:\ th \ ds \ security \ protocols \ msv_sspi \ dll \ ntlmtelemetry.c ??

d:\ th \ ds \ security \ protocols \ ssl \ telemetry \ telemetry.c ??

d:\ th \ ds \ security \ protocols \ sspcommon \ ssptelemetry.c ??

d:\ th \エンドユーザー\ windowsupdate \ client \ installagent \ common \ commontelemetry.cpp

d:\ th \エンドユーザー\ winstore \ licensemanager \ lib \ telemetry.cpp

d:\ th \ minio \ ndis \ sys \ mp \ ndistelemetry.c ??

d:\ th \ minio \ security \ base \ lsa \ security \ driver \ telemetry.cxx

d:\ th \ minkernel \ fs \ cdfs \ telemetry.c

d:\ th \ minkernel \ fs \ ntfs \ mp \ telemetry.c ??

d:\ th \ minkernel \ fs \ refs \ mp \ telemetry.c ??

d:\ th \ net \ netio \ iphlpsvc \ service \ teredo_telemetry.c

d:\ th \ net \ peernetng \ torino \ telemetry \ notelemetry \ peerdistnotelemetry.c ??

d:\ th \ net \ rras \ ip \ nathlp \ dhcp \ telemetryutils.c ??

d:\ th \ net \ winrt \ networking \ src \ sockets \ socketstelemetry.h

d:\ th \ shell \ cortana \ cortanaui \ src \ telemetrymanager.cpp

d:\ th \ shell \ explorer \ traynotificationareatelemetry.h

d:\ th \ shell \ explorerframe \ dll \ ribbontelemetry.c ??

d:\ th \ shell \ fileexplorer \ product \ fileexplorertelemetry.c ??

d:\ th \ shell \ osshell \ control \ scrnsave \ default \ screensavertelemetryc.c ??

d:\ th \ windows \ moderncore \ inputv2 \ inputprocessors \ devices \ keyboard \ lib \ keyboardprocessortelemetry.c ??

d:\ th \ windows \ published \ main \ touchtelemetry.h

d:\ th \ xbox \ onecore \ connectedstorage \ service \ lib \ connectedstoragetelemetryevents.cpp

d:\ th \ xbox \ shellui \ common \ xbox.shell.data \ telemetryutil.c ??



おそらく、コメントする価値はありません。すべて同じであり、特定のものは何も知られていないからです。 ただし、これらのデータは、より詳細な調査の開始点として役立ちます。



カーネルパッチ保護



次の発見は、愛されているPatchGuardです。 確かに、OSのソースツリーには、理解できない、最も可能性の高いバイナリタイプのファイルが1つしかありません。

d:\ th \ minkernel \ ntos \ ke \ patchgd.wmp

フィルタリングされていないデータの一致を検索すると、カーネルパッチ保護は実際には別のプロジェクトであることがわかりました。

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen00.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen01.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen02.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen03.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen04.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen05.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen06.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen07.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen08.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp \ xcptgen09.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp_noltcg \ patchgd.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp_noltcg \ patchgda.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp_noltcg \ patchgda2.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp_noltcg \ patchgda3.c ??

d:\ bnb_kpg \ minkernel \ oem \ src \ kernel \ patchgd \ mp_noltcg \ patchgda4.c ??



疑わしいファイル



興味のあるものを発明することなく、私はすべてを一列に探し始めました-そして満足しました!



d:\ th \ windows \ core \ ntgdi \ fondrv \ otfd \ atmdrvr \ umlib \ backdoor.c ??

フォントドライバで?



d:\ th \ inetcore \ edgehtml \ src \ site \ webaudio \ opensource \ wtf \ wtfvector.h

Webテンプレートフレームワークは単なるWebテンプレートフレームワークであり、物議を醸す略語です。 ちょっと待って



オープンソース?



d:\ th \ printscan \ print \ drivers \ renderfilters \ msxpsfilters \ util \ opensource \ libjpeg \ jaricom.c ??

d:\ th \ printscan \ print \ drivers \ renderfilters \ msxpsfilters \ util \ opensource \ libpng \ png.c ??

d:\ th \ printscan \ print \ drivers \ renderfilters \ msxpsfilters \ util \ opensource \ libtiff \ tif_compress.c ??

d:\ th \ printscan \ print \ drivers \ renderfilters \ msxpsfilters \ util \ opensource \ zlib \ deflate.c ??

この発見を締めくくる時だと思います。



ここに 、ソースのリストを含むテキストファイルのアーカイブを示します 。 コメントであなたの発見を共有してください!



All Articles