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でこれを示してください。 正確な作り方がわかりません。 ありがとう