WiFi Ledコントローラーの探索

今日、私たちの生活を楽にするために設計された装置が検査のために提示されています。

このデバイスは照明制御用です。 RGBダイオードを接続すると、色と輝度を制御でき、単色のダイオードランプを接続すると、輝度のみを制御できます。 後者の場合、3つのカラーチャネルを個別に使用できます。 さらに、デバイスには、常時点灯または点滅を指定するいくつかのモードがあります。 デバイスの電源は5〜24ボルトです。 デバイスは同じ電圧をチャネルに与えます。 技術仕様は次のとおりです。

最大負荷:288 W

リモコン:50 M

モデル:WIFI100 wifiコントローラー



画像



しかし、電源を入れたとき、私の人生は楽になりませんでした。 それどころか、複雑になりました。 この理由は、パッケージに含まれているMagicColor v1.0アプリケーションでした。 このプログラムはHTCとLGの携帯電話で機能していましたが、Samsung Galaxy Note 10.1とGalaxy Nexusのデバイスでは機能しませんでした。 最初に確立されたものは、手順には記載されていませんが、ユーザー名:adminとパスワード1234を持つWEBインターフェイスの存在でした。



デフォルトでスクリーンショットからわかるように、デバイスはネットワークへの保護されていないアクセスでアドホックモードで動作します。 デフォルトのプロトコルはTCPおよびポート5000です。



画像

画像



私は、この状況が私には決して合わなかったと言わなければなりません。 第一に、それはセキュリティであり、ただそこにありません。 誰でもこのデバイスにアクセスできます。 第二に、すでに独自のDHCPサーバーがあり、外部攻撃からの保護があるホームネットワークでこのデバイスを見たいと思います。 残念ながら、MagicColorにはデバイスのIPアドレスを変更する機能がありません。 さらに、後で判明したように、プログラムにはssidネットワーク名チェックがあります。



それでは、プログラムを見てみましょう。 MagicColor.apkファイルを解凍するには、APK Manager v.4.9を使用しました。 これを行うには、.apkを「place-apk-here-for-modding」フォルダーにコピーして、Script.batスクリプトを実行します。 これらの操作の後、「プロジェクト」フォルダーがプログラムのルートフォルダーに表示され、その中に.apkファイルと同じ名前のフォルダーが表示されます。 ここで、dex2jarスクリプトが使用されたclasses.dexファイルから.jarファイルを取得する必要があります。 マウスで.dexファイルをdex2jar.batにドラッグするだけで十分です。



次のステップは、結果のclasses_dex2jar.jarファイルを逆コンパイルすることです。 最初に、JD-guiデコンパイラを試しました。 しかし、彼は誤ったコードを発行することで期待に応えることができませんでした。 しかし、次のAndroChef逆コンパイラーはこのタスクに完全に対応しました。



ソースコードを扱います。 分解には、ADTプラグインプラグインがインストールされたKeplerのEclipse Standartバージョンを使用しました。 「ヘルプ」-「新しいソフトウェアのインストール...」メニューを呼び出して、Eclipseシェルからインストールできます。 [追加]ボタンをクリックして、[名前]フィールドに「ADTプラグイン」と入力し、[場所:]フィールドにdl-ssl.google.com/android/eclipse入力ます 。 すべてのコンポーネントを選択し、「完了」をクリックします。



最初に、空のAndroidアプリケーションプロジェクトを作成しました。 アプリケーション名:Color、プロジェクト名:MagicColor2、パッケージ名:com.android.colorをインストールした場所。 次に、[カスタムランチャーアイコンの作成]と[アクティビティの作成]のチェックを外しました。



srcフォルダーに、逆コンパイル中に受信した「cn」フォルダーと「com」フォルダーを配置しました。 「com / android / color」から、R.javaファイルを「gen / com / android / color」フォルダーに置き換えて転送します。



すべてのファイルを「res」フォルダーからプロジェクトの同じ名前のフォルダーに転送することを忘れないでください。 AndroidManifest.xml。 パラメータjava -jar apktool.jar d MagicColor.apkを出力したapktoolスクリプトで取得しました。 スクリプトの実行後、「res」フォルダーとAndroidManifest.xmlが存在する「out」フォルダーが作成されます



プログラムコードの分析を開始できます。 Eclipseは、プログラムで修正が必要ないくつかのエラーを検出します。 これをどのように行ったかは、以下の記事に添付したソースコードで確認できます。



StaticClass.javaには、デフォルトのプログラム設定が表示されます。 これらのパラメータのいくつかは後で便利になります。 Protocol.javaファイルには、デバイスのコマンド生成アルゴリズムが記述されています。このアルゴリズムの基礎は、コマンドが形成されるgetAll()関数です。



public byte[] getAll() { this.all[0] = this.frameHead[0]; this.all[1] = this.frameHead[1]; this.all[2] = 0; this.all[3] = this.mode; this.all[4] = this.keyNumber; this.all[5] = this.keyValue; this.all[6] = this.colorRGB[0]; this.all[7] = this.colorRGB[1]; this.all[8] = this.colorRGB[2]; this.all[9] = this.checkValue; return this.all; }
      
      







このデータに基づいて、最初の2バイトは常に同じで、-86と85に等しく、バイナリ形式10101010と1010101でビットのシーケンスを形成し、コマンドの信頼性と正確性を判断します。 また、正確性を判断するために、コマンドの最後にある9バイトのコマンドにチェックサムが含まれています。 getCurCheckValue関数(int paramInt1、int paramInt2、int paramInt3、int paramInt4、int paramInt5)によって、次の元の方法で計算されます: Key_Num +(blue +(green +(red +(bar_No + 255)))+ mode)%255

場所:paramint1-StaticClass.bar_No、paramint2-StaticClass.red、paramint3-StaticClass.green、paramin4-StaticClass.blue、paramint5-StaticClass.Key_Num



ご想像のとおり、赤、緑、青のフィールドは、それぞれチャンネル1、2、3の1〜255の値です。 RGB照明を接続すると色が変化し、従来のダイオードランプを接続すると輝度が変化します。 Key_Numフィールドは、デバイスの動作モードを決定します。 モードは次のとおりです。1-ライトをオフにし、2-ライトをオンにし、3内蔵デバイスモードを頻繁に点滅から一定のグローに順次切り替えます。 ランプを備えたチャネルを1つしか使用できないため、さまざまなモードに慣れることができませんでした。 フィールドモード= 1、フィールドbar_Noは常に50です。



送信前に、コマンドはexchangeBytesおよびexchangeInt関数によって変更されます。これは、明らかに転送プロトコルをわずかに暗号化するためです。 これらの関数の考え方は、たとえば、最初のメッセージAB CDがあり、変換後にAC BDが得られ、12 34 56 78が17 35 46 28になった場合、中心に関して極端に対称なバイトの部分が交換されるということです。 !



次に、Samsungデバイスでプログラムを使用できない問題について説明します。 アプリケーションのデバッグ時に判明したように、ネットワークSSIDは引用符で囲まれ、その長さはプログラムが予期しない2文字増加します。SSIDの長さをチェックすると、7ではなく5が期待されます。ColorActivity.javaファイルにある検証関数については以下で説明します それらの2つがあります: private void getWifiInfo()およびprotected void isWifiInfo ()。 両方の関数にはコードがあります:



 if(this.ssid != null) { if(this.ssid.length() != 5) { StaticClass.wifi_correct = false; return; } if(!this.ssid.substring(0, 2).equals("LN")) { StaticClass.wifi_correct = false; return; }
      
      







これらの簡単なチェックを太字で強調しました。 SSIDの長さとSSIDの最初の2文字を確認し、それらが常に同じである理由はわかりません。 SSIDでは、最後の3文字のみが異なり、デバイス上のSSIDスイッチの位置に依存します。 スイッチの位置0は、SSID名「LN001」に対応しています。 プログラムが私の電話で動作するためには、これらのチェックを削除するのに十分であることが判明しました。



次に、デバイスのIPアドレスを入力できるプログラム設定ページにフィールドを追加しました。 デバイスを「アドホック」モードから「インフラストラクチャ」モードに切り替え、セキュリティを設定し、ホームネットワークから接続して、モバイルデバイスから照明を制御できるようになりました。



完成したプロジェクトと、設定にデバイスIPアドレスフィールドが追加されたbinフォルダー内の作業プログラムは、 Magic Color 2プロジェクトで取得できます



All Articles