Windows Phoneのトップシークレットまたは静的IP

最近、Windows Phoneで静的IPを作成する必要がありました。

Googleで解決策を探しに行きました。 私が見つけたものはすべて、ルーターまたは完全にルート化された電話のセットアップに直接関係していたため(私のルートはTangoへのアップグレード後にカバーされていました)、このソリューションも私には不向きでした。 そして、素晴らしいアイデアが私の頭に浮かびました-サムスンの人がすでに働いていたが、それを報告するのを忘れたらどうでしょうか? そのため、診断メニューを繰り返し使用しました。 穴を通して、彼らは本格的なルートを作成し、署名なしでexeファイルを起動したことなどを思い出させてください。 過去に。 再びGoogle、しかしそれは何も与えません-誰も実際に診断コードを知りません。 いいね xap診断メニューを探しています。 驚いたことに、見つかった、なぜなら それらは通常、核の奥深くに埋め込まれています。 カーネルはネイティブコードで作成されましたが、インターフェイスはC#でした。 必要なもの! しかし、私は最後のページの中国語リソースのキャッシュにありましたが、本質は見つかりませんでした。

さて、途中で! JetBrainsからお気に入りのdotPeekを開き、次の図を参照してください。

画像



ツリーが開くことを拒否したポイントは、ネイティブコードを含むdllです。 すぐに破棄します。

また、Microsoftという言葉で始まるものは破棄します。 これらは単なるリンクです。 最初のプロジェクトは残りました-DiagnosisApp。

ネームスペース、ルート、メインを展開して確認します。

画像



ルートでは、DotObfuscatorがここで試行したことがわかります。これにより、プロセスが非常に複雑になります。余分なgoto、空の条件、ループ、1文字の変数名...

DiagnosisAppはすでに興味深いものです。 ここでは、ページコード自体を担当するクラスを確認します。 bydlocodeの最高の伝統にあるすべてのロジックは、ViewModelではなく、クラスに直接あります。 部分的ではありません。 クラスの最初に、Button型の変数があります。 必要なもの! これはコードセットパネルです。

internal Button btnDelete; internal Button btn1; internal Button btn3; internal Button btn2; internal Button btn4; internal Button btn5; internal Button btn6; internal Button btn7; internal Button btn8; internal Button btn9; internal Button btnSharp; internal Button btn0; internal Button btnStar;
      
      







Clickイベントを探しています:

 this.btn1.Click += new RoutedEventHandler(this.b); this.btn2.Click += new RoutedEventHandler(this.b); this.btn3.Click += new RoutedEventHandler(this.b); this.btn4.Click += new RoutedEventHandler(this.b); this.btn5.Click += new RoutedEventHandler(this.b); this.btn6.Click += new RoutedEventHandler(this.b); this.btn7.Click += new RoutedEventHandler(this.b); this.btn8.Click += new RoutedEventHandler(this.b); this.btn9.Click += new RoutedEventHandler(this.b); this.btn0.Click += new RoutedEventHandler(this.b); this.btnStar.Click += new RoutedEventHandler(this.b); this.btnSharp.Click += new RoutedEventHandler(this.b);
      
      







削除ボタンとバイブレーションを制御するだけで、どこにもつながりません。



 private void b(object A_0, RoutedEventArgs A_1) { if (1 == 0) ; label_2: this.timer_btn.Stop(); this.timer_btn.Start(); this.vibrate.Start(TimeSpan.FromSeconds(0.05)); this.e((string) ((ContentControl) A_0).Content); bool flag = this.txtDial.Text.Length <= 0; int num = 1; while (true) { switch (num) { case 0: this.btnDelete.Visibility = Visibility.Visible; num = 2; continue; case 1: if (!flag) { num = 0; continue; } else goto label_7; case 2: goto label_5; default: goto label_2; } } label_5: return; label_7:; }
      
      







まあ、そして神に感謝します。これを理解して、始めない方が良いです...

行き止まりのように見えますが、すべてのボタンは、ボタンを押すたびにオンになるタイマーによって制御されます。



 this.timer_btn.Tick += new EventHandler(this.ParseDial); public void ParseDial(object sender, EventArgs e) { if (1 == 0) ; this.timer_btn.Stop(); this.GetEnumFromList(this.f(this.txtDial.Text)); } public void GetEnumFromList(uint hashCode) { label_2: int A_0 = 0; int num = 12; bool flag; while (true) { switch (num) { case 0: case 16: num = 3; continue; case 1: if (!flag) { num = 10; continue; } else { flag = Convert.ToBoolean(this.iNVBlock); num = 14; continue; } case 2: this.TitleBrush.Color = Color.FromArgb(byte.MaxValue, (byte) 0, (byte) 80, byte.MaxValue); this.textBlockPageTitle.Foreground = (Brush) this.TitleBrush; this.NavigationService.Navigate(new Uri(string.Format(HiddenKeyTable.Current.hashTable[A_0].strPage, (object) HiddenKeyTable.Current.hashTable[A_0].iPageMode, (object) HiddenKeyTable.Current.hashTable[A_0].iHashcode), UriKind.Relative)); num = 9; continue; case 3: case 9: case 15: num = 4; continue; case 4: if (1 == 0) ; ++A_0; num = 17; continue; case 5: if (flag) { this.TitleBrush.Color = Color.FromArgb(byte.MaxValue, byte.MaxValue, (byte) 0, (byte) 0); this.textBlockPageTitle.Foreground = (Brush) this.TitleBrush; num = 0; continue; } else { num = 8; continue; } case 6: if (!flag) { num = 13; continue; } else goto case 4; case 7: if (!flag) { num = 11; continue; } else { flag = HiddenKeyTable.Current.hashTable[A_0].iHash.CompareTo(hashCode) != 0; num = 6; continue; } case 8: this.TitleBrush.Color = Color.FromArgb(byte.MaxValue, byte.MaxValue, (byte) 127, (byte) 0); this.textBlockPageTitle.Foreground = (Brush) this.TitleBrush; this.NavigationService.Navigate(new Uri(string.Format(HiddenKeyTable.Current.hashTable[A_0].strPage, (object) HiddenKeyTable.Current.hashTable[A_0].iPageMode), UriKind.Relative)); num = 16; continue; case 10: this.NavigationService.Navigate(new Uri(string.Format(HiddenKeyTable.Current.hashTable[A_0].strPage, (object) HiddenKeyTable.Current.hashTable[A_0].iPageMode, (object) HiddenKeyTable.Current.hashTable[A_0].iHashcode), UriKind.Relative)); num = 15; continue; case 11: goto label_26; case 12: case 17: flag = A_0 < this.length; num = 7; continue; case 13: this.HybridInterface_FCRProxy.w(out this.iNVBlock); flag = !this.g(A_0); num = 1; continue; case 14: if (flag) { this.TitleBrush.Color = Color.FromArgb(byte.MaxValue, byte.MaxValue, (byte) 127, (byte) 0); this.textBlockPageTitle.Foreground = (Brush) this.TitleBrush; flag = this.d(); num = 5; continue; } else { num = 2; continue; } default: goto label_2; } } label_26:; }
      
      







主よ、このコードを理解するにはたくさんのアルコールが必要です...ページへのナビゲーション以外はすべて削除します:



 this.NavigationService.Navigate(new Uri(string.Format(HiddenKeyTable.Current.hashTable[A_0].strPage, (object) HiddenKeyTable.Current.hashTable[A_0].iPageMode, (object) HiddenKeyTable.Current.hashTable[A_0].iHashcode), UriKind.Relative)); this.NavigationService.Navigate(new Uri(string.Format(HiddenKeyTable.Current.hashTable[A_0].strPage, (object) HiddenKeyTable.Current.hashTable[A_0].iPageMode), UriKind.Relative)); this.NavigationService.Navigate(new Uri(string.Format(HiddenKeyTable.Current.hashTable[A_0].strPage, (object) HiddenKeyTable.Current.hashTable[A_0].iPageMode, (object) HiddenKeyTable.Current.hashTable[A_0].iHashcode), UriKind.Relative));
      
      







すでに良い。 ここでは、ナビゲーションが特定のHiddenKeyTableテーブルを通過し、キーとして、入力されたコードのハッシュである特定の関数f(A_0)の結果が渡されることがわかります。 関数コードを見てみましょう:



 private uint f(string A_0) { switch (0) //  switch ,     - default,    { default: //   label_2: //  label uint num1 = 0U; int index = 0; int num2 = 2; uint num3; bool flag; //     ,    while (true) { switch (num2) //  switch,      { case 0: goto label_9; case 1: case 2: flag = index < A_0.Length; num2 = 4; continue; case 3: num3 = num1; num2 = 0; continue; case 4: if (!flag) { num2 = 3; continue; } else { num1 = (num1 << 5) + num1 + (uint) A_0[index]; //   ,    ++index; if (1 == 0) ; num2 = 1; continue; } default: goto label_2; } } label_9: return num3; } }
      
      







まあ、あなたはアルコールなしでそれを把握する必要があります。 スイッチ(0)、余分なケース、デバッガーがコードをウォークスルーし、最終的にどこにつながるかを確認するなど、単純に紛らわしいコード行を削除します(読み取り可能な形式でやり直し)



 private static uint GetHashCode(string code) { var hash = 0U; foreach (var ch in code) hash = (hash << 5) + hash + ch; return hash; }
      
      







すでに動作していないコードを見つけると、*#123#のようなものがどこでも使用されていることがわかりました。 数値コードは*#で始まり、#で終わります。 行を作りましょう:



 const string format = "*#{0}#"
      
      







そして、ハッシュを突破し、それをテーブルの値と比較するための完全な列挙メソッド:



 public static void Main() { BruteHash("0{0}"); //     0,   - ,     BruteHash("{0}"); //    } private static void BruteHash(string f) { const string format = "*#{0}#"; //    var thread = new Thread(() => { var i = 0; while (true) { var code = string.Format(f, i); var codeStr = string.Format(format, code); var value = GetHashCode(codeStr); //      *#123# if (IsIpHash(value)) //    { Console.Write(codeStr); //  return; } i++; } }); thread.Start(); } private static uint GetHashCode(string code) { var hash = 0U; foreach (var ch in code) hash = (hash << 5) + hash + ch; return hash; } private static bool IsIpHash(uint hash) { return hash == 3974577854U; }
      
      







値3974577854Uは非常に簡単に見つけることができます。HiddenKeyTableテーブルで、IPを検索すると、キーg_IPSettingが見つかりました。その値はまさにこの数値です。 開始するだけで、文字通り結果が得られます-コード*#232340#、エンター、そして出来上がり! IPアドレス、サブネットマスク、ゲートウェイ、DNSを変更できます。 Diagnosis 1109、Samsung Omnia Wでのみ動作します。残念ながら、他ではテストしていません。 ただし、このコードを非表示にする理由は明確ではありません。 テーブルをいじくり回すと、他の作業コードがいくつか見つかりました。



*#9900#-デバッグダンプ

*#745#-RILDUMP(SLOG_DUMP、sth to file)

*#9990#-g_VERIFYCOMPARE(PLS操作8のIMEI比較)

*#2470#-g_CAMERAUPDATE(CameraFWUpdate)

*#0589#!-g_LIGHTSENSORTEST

*#1111#-g_SWversionFTA(テストモードFTA SWバージョン)

*#2222#-g_HWversionFTA(テストモードFTA HWバージョン)

*#1234#-g_SWversionEx(システム、wifi、bt、csc、pda、電話のバージョン)

*#0228#-g_BATTERYINFO

*#0842#-g_DEVICETEST

*#0283#-g_PHONELOOPBACKTEST

*#7284#-g_USBPATHCHANGE

*#232337#-g_BLUETOOTH_MAC_VIEWER

*#232331#-g_BLUETOOTH_RF_TEST

*#232338#-g_WIFI_MAC_VIEWER

*#770#-g_VPHONE770

*#771#-g_VPHONE771

*#772#-g_VPHONE772

*#773#-g_VPHONE773

*#774#-g_VPHONE774

*#775#-g_VPHONE775

*#776#-g_VPHONE776

*#777#-g_VPHONE777

*#778#-g_VPHONE778

*#779#-g_VPHONE779

*#7451#-g_ERROR_REPORT_ON

*#6381#-g_RILNETLOG_ON

*#6380#-g_RILNETLOG_OFF

*#9908#-g_GUMITEST3G_CAB_INSTALL

*#9920#-g_CONNECTION_SETTING(接続文字列)

*#07#-g_VIEWHISTORYNW

*#2663#-g_TouchFirmare_2663(タッチスクリーンバージョン)

*#99785#-g_PVKKey

*#997856#-g_PVKFileName

*#86824#-g_TouchkeySensitivity(ファームウェアのアップグレードが可能!(09から08まで))

*#0123#-g_MPS(MPSビューアー、接続文字列)

*#232340#-g_IPSetting(IP設定!!!)



残りはBlockType.noneテーブルでマークされていますが、それらを呼び出す方法はまだわかりません。何かを返すHybridInterface_FCRProxy.w()関数がありますが、理解できませんでした。



XAPアーカイブをダウンロードするためのリンク 。 すみません、どこに注ぐかわかりません。



PS何か間違ったことを書いたりデザインした場合は、PMでこれを示してください。 正確な作り方がわかりません。 ありがとう



All Articles