約 4,857,883 件
https://w.atwiki.jp/is01/pages/26.html
常に人柱と噂のまとめ人募集中。IS01で起動できないとか×なところを見つけたら修正をお願いします。 まだ発売されていないので動作チェックは原宿のKDDIデザインスタジオでしてくる他は手がありませぬ。 ソフト作者様、人柱の皆様に感謝します。 ■マークの意味 【○】IS01で動作確認できたもの 【△】IS01で一応動作するが、一部難あり 【×】IS01で起動しなかった、まともに操作できなかったもの 【ヾ(=゚ω゚)シ】 オススメソフト 【神】必携ソフト 【¥】有料・シェアウェア 【英】英語ソフト
https://w.atwiki.jp/is01next/pages/22.html
Jailbreakの仕組み root化の仕組み 脆弱性を使って、現在のタスク(プロセス又はスレッド)の権限をrootにしてシェルを実行します。具体的に言うと、特権を持った何か(root権限のプロセスやカーネルスレッド)を使って current- cred- uid = current- cred- euid = current- cred- gid = current- cred- egid = 0 にさせてから、シェルを実行します。もしくは、特権を持った何かから直接シェルを起動させるという方法もあります。 ROM焼きの仕組み 一般的にAndroidのシステムはNANDフラッシュに入っています。NANDフラッシュにはハードディスクやSSDとは特性が異なるため、NAND用の特殊なファイルシステムが使われています。 ここに書きこむことによってシステムを改造したり、別のシステムへと変えることができます。 通常、システムのファイルシステムやブロックデバイスへの書き込みにはroot権限が必要なため、ROM焼きをするためにはroot化が必要です。 また、IS01には別のプロテクトが存在するためにカーネルでのコード実行が必要です。 脆弱性とは 脆弱性とは、ソフトウェアの考慮ミスによって生まれた裏道のようなものです。 正当性の検証を迂回することによって、権限やメモリ・レジスタの値を想定外のものにすることができます。 それによって本来の権限よりも高い権限でコードを実行することが可能になります。 脆弱性の種類 可能な事 スタックバッファオーバーフロー スタックにあるバッファの境界チェックにある問題を突くことで、後続する想定外のメモリに書き込みできる ヒープバッファオーバーフロー ヒープにあるバッファの境界チェックにある問題を突くことで、後続する想定外のメモリに書き込みできる 不十分な正当性検証 十分な正当性検証が備わっていない部分を突くことで、コーナーケースなどで正当性検証を迂回できる メモリ破壊 メモリアドレスの正当性検証が正しく行われていない部分を突くことで、想定外のメモリの書き換えができる 整数オーバーフロー 整数型の最大値を越えさせることで正当性検証を迂回できる 整数アンダーフロー 整数型の最小値を越えさせることで正当性検証を迂回できる 競合状態 マルチスレッドやプリエンプションの未考慮部分を突くことで、競合を起こして正当性検証を迂回できる 情報リーク 初期化し忘れなどの部分を突くことで、隠されていた情報を盗み見ることができる NULLの参照外し アーキテクチャによってはNULL付近にデータを置くことでコードを実行させることが可能になる 開放済みメモリの使用 場合によっては任意のコードが実行できる 二重開放 場合によっては任意のコードが実行できる 権限昇格 権限の管理のミスを突くことで、上位権限に移行できる 書式文字列脆弱性 任意のコードが実行できる 複数の脆弱性を組み合わせる事で、可能になることが増えます。 脆弱性の使い方 脆弱性を突く方法を知るには、既存のJailbreakのソースコードや既存の脆弱性実証コード(exploit)を読むのが簡単です。exploitはExploits Databaseにまとまっています。遠隔でも使えるものをremote exploit、システム内でしか使えないものをlocal exploitと呼びます。また、攻撃の種類によっても区別されます。 攻撃の種類 説明 Root Exploit root権限のユーザープロセスでのコードの実行をする ring0 Root Exploit カーネルでのコードの実行をする (ARMでは特権モードをring0とは言わないので注意) Stack Disclosure Exploit スタックメモリを盗み見する Kernel Memory Disclosure Exploit カーネルメモリを盗み見する Denial of Service Exploit システムサービスを妨害する 一部のexploitは、ビルドするためにカーネルのビルドが必要です。
https://w.atwiki.jp/is01rebuild/pages/26.html
さて、実機に転送して Android2.2r1.3 が起動したとは言え…ddmsで見るとエラーだらけ。 1.setreuid()のエラー setreuid()で表示され、引数が出ない。 デバッグ出来ないじゃないか! と言う事で、java コードに修正を 適用したところ下記のように出てきた。(javaコードの修正にミス発見下記は誤情報の可能性あり) 12-25 04 05 23.641 INFO/Zygote(1216) setregid(0,9999) err 0 errno 0 12-25 04 05 23.641 INFO/Zygote(1216) setreuid(0,9999) err 0 errno 2 12-25 04 05 23.641 ERROR/Zygote(1216) setreuid(9999) failed. errno 2 しかし、上3つと最後の1つは出力箇所が違う???? 再検証する。 setreuid(9999)??? だれが、これを呼んでいる? Zygote であることは確かだが、どこで? さて、追跡 or 無視 どちらでしょう? 2.proc に該当箇所ががない 明らかに kernel の問題。 12-25 04 05 26.793 ERROR/SurfaceFlinger(1263) Couldn t open /sys/power/wait_for_fb_sleep or /sys/power/wait_for_fb_wake fbはフレームバッファでしょうか。要調査。 他にも、デフォルトinit.rc にあり標準kernel の /proc に無いものがある。それも、要調査。 /proc は重要なのでこっちも本格調査しないといけないとは分かってるものの後回し。 3.copyBits failed (Operation not permitted) 12-25 04 05 31.641 ERROR/copybit(1263) copyBits failed (Operation not permitted) copyBits failed (Operation not permitted) で、copyBits って何?→ソース検索。 しかも、このエラー、大量に出てくるので ddms で見ると非常にうっとうしい。 エラーを吐いている lib を削除でとりあえず静まる。 画面描画周りの高速化は xda あたりにコンパイル済みで適用できるのが有るようです。 4.Wi-Fi 関連 INFO/WifiService(1263) WifiService starting up with Wi-Fi disabled ERROR/WifiService(1263) Failed to load Wi-Fi driver. ERROR/WifiService(1263) Failed to load Wi-Fi driver. 要調査。→通信可能になった。無線LANを有効にする、GUIで無線LANを有効にする ∞.まだまだたくさん? …^^; 解決法、ご存じの方ぜひコメント下さい。 SDカードが使えない状態で、MiniThumbFileが書き込みエラーを大量に吐く問題の対処 -- RO215IS01 (2011-01-09 18 38 03) 途中で送ってしまいました・・・。framework/base/media/java/android/media/MiniThumbFile.javaのL85-L86を、"/data/DCIM/.thumbnails"; とすることで収まる。 -- RO215IS01 (2011-01-09 18 40 15) 名前 コメント
https://w.atwiki.jp/is01rebuild/pages/34.html
Android の画面上で無線LANを有効にするには…? このページは、無線LANを有効にするからの続きのページです。 wpa_supplicant のクライアントとして Android を認識させる wrapper の役割になります。 下記を編集… $ANDROID_SRC/hardware/libhardware_legacy/wifi/wifi.c する…、のだが…、 これをとりあえず動くようにするだけで…、結構かかりました。。。 しかも、ソースコードはデバッグ情報出力でズタボロ。。。 Android の一次情報をしっかり読んでいれば分かるんでしょうが、 エラー&トライのような感じで。。。Androidの wext がドライバに要求するコマンドを 実ドライバにバイパスしないといけないのだが、面倒なので無視する事にした。 後で、wext の要求を見てどうするか考える。 そうして出来たのが下記コード…。もう、きっちり型変換はしてないし、 usleepはいい加減な値だし、driver の有効化の部分は一応チェックは入れたがまだ甘いし。 本来は Android.mk で指定しなければならない、定数などはハードコーディングしているし…。 文字列ポインタや文字数は少なければ安全だろうと…いうことで。 本ページサイトの情報は全て無保証であるがままです。 かなり不安定ですので、そのまま実用には耐えません。 それなりに使えるようになっています、デバッグでは無いときはlog出力コメントアウトするのがオススメ。 Ver.0.0.2α 初期公開から更新しました。 2010/12/31 13 20) Ver.0.0.3α_20110101_00 若干、安定化させました (2011/01/01 02 18) 無効化しているコマンドですが、本来的には reply ポインタに文字列を返さなければいけません。 そこに、len=0にしてリターンしていますが、上位層及び下位層の影響範囲を調べていません。 無線LANアクセスポイントの新規追加できません。(1.6の時に接続していた先は大丈夫と思います) データ通信速度取得できません。 無線LAN RSSI 取得出来ません。 Ver.0.0.4α_20110105_00 IS01向けwpa_supplicant GPLソースマージ。コマンド無視部分をコメントアウト (2011/01/05 19 05) IS01向けGPLソースの external/wpa_supplicant/driver_wext.c を利用する事で、下記コードの wifi_send_command() からswitch文をごっそり削除できます。RSSIの取得には対応してないようなので、後で検討します。下記コードはIS01向けGPLソースの external/wpa_supplicant/driver_wext.c をマージした場合の wifi.c になります。マージしてない場合は、switch文部分のコメント一連のコメントを外してして下さい。 fi01氏よりの情報にてGUIにおいてもRSSIの取得が可能になりました。 無線LANアクセスポイントの新規追加、検証していません。 データ通信速度取得できるようになりました。 無線LAN RSSI 取得できるようになりました。 /* * Copyright 2008, The Android Open Source Project * Copyright 2011, RO178 is01rebuid * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http //www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include stdlib.h #include fcntl.h #include errno.h #include string.h #include "hardware_legacy/wifi.h" #include "libwpa_client/wpa_ctrl.h" #define LOG_TAG "WifiHW" #include "cutils/log.h" #include "cutils/memory.h" #include "cutils/misc.h" #include "cutils/properties.h" #include "private/android_filesystem_config.h" #ifdef HAVE_LIBC_SYSTEM_PROPERTIES #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ #include sys/_system_properties.h #endif static struct wpa_ctrl *ctrl_conn; static struct wpa_ctrl *monitor_conn; extern int do_dhcp(); extern int ifc_init(); extern void ifc_close(); extern char *dhcp_lasterror(); extern void get_dhcp_info(); extern int init_module(void *, unsigned long, const char *); extern int delete_module(const char *, unsigned int); static char iface[PROPERTY_VALUE_MAX]; // TODO use new ANDROID_SOCKET mechanism, once support for multiple // sockets is in #ifndef WIFI_DRIVER_MODULE_PATH #define WIFI_DRIVER_MODULE_PATH "/system/lib/modules/wlan.ko" #endif #ifndef WIFI_DRIVER_MODULE_NAME #define WIFI_DRIVER_MODULE_NAME "wlan" #endif #ifndef WIFI_DRIVER_MODULE_ARG #define WIFI_DRIVER_MODULE_ARG "" #endif #ifndef WIFI_FIRMWARE_LOADER #define WIFI_FIRMWARE_LOADER"" #endif #define WIFI_TEST_INTERFACE"sta" #define WIFI_DRIVER_LOADER_DELAY2000000 static const char WLAN0_DEVICE[] = "/sys/devices/platform/msm_sdcc.1/mmc_host/mmc1/mmc1 0001/mmc1 0001 1/net/wlan0/wireless/status"; // "/sys/class/net/wlan0"; static const char IFACE_DIR[] = "/data/misc/wifi/sockets"; //"/data/system/wpa_supplicant"; static const char DRIVER_MODULE_NAME[] = "unifi_sdio.ko"; //WIFI_DRIVER_MODULE_NAME; static const char DRIVER_MODULE_TAG[] = "unifi_sdio.ko"; // WIFI_DRIVER_MODULE_NAME; static const char DRIVER_MODULE_PATH[] = "/system/lib/modules/unifi_sdio.ko"; //WIFI_DRIVER_MODULE_PATH; static const char DRIVER_MODULE_ARG[] = ""; //WIFI_DRIVER_MODULE_ARG; static const char FIRMWARE_LOADER[] = ""; //WIFI_FIRMWARE_LOADER; static const char DRIVER_PROP_NAME[] = "wlan.driver.status"; static const char SUPPLICANT_NAME[] = "wpa_supplicant"; static const char SUPP_PROP_NAME[] = "init.svc.wpa_supplicant"; static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf"; static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf"; static const char MODULE_FILE[] = "/proc/modules"; static int insmod(const char *filename, const char *args) { LOGD( "wifi %s() function in", __FUNCTION__ ); /* void *module; unsigned int size; int ret; module = load_file(filename, size); if (!module) return -1; ret = init_module(module, size, args); free(module); return ret; */ int ret; char command[]="echo 1 /sys/devices/platform/bwpm/wifi"; char command2[]="echo 1 /sys/bus/platform/drivers/msm_sdcc/msm_sdcc.1/polling"; property_set( "ctl.stop" , "dhcpcd" ); sched_yield(); //property_set( "ctl.stop " , "wpa_supplicant" ); //sched_yield(); ret=system(command); LOGD( "wifi %s() %s ret=%d" , __FUNCTION__ , command ,ret); sched_yield(); usleep(100000); ret=system(command2); sched_yield(); LOGD( "wifi %s() %s ret=%d" , __FUNCTION__ , command2 , ret ); int maxtry = 10; char text[256]; while (maxtry-- 0) { if (access( WLAN0_DEVICE , R_OK ) == 0) { FILE *fp; if ((fp = fopen( WLAN0_DEVICE , "r")) != NULL ) { fgets(text, 256, fp); LOGV( "wifi %s() wlan0 status=%s" , __FUNCTION__ , text ); if ( strncmp( text , "0x0" , 3 ) == 0) { LOGD( "wifi %s() wlan0 enabled!" , __FUNCTION__ ); return 0; } fclose(fp); } } else LOGV( "wifi %s() wait for enable wlan0 ...." , __FUNCTION__ ); usleep(500000); } return -1; } static int rmmod(const char *modname) { LOGD( "wifi %s() function in", __FUNCTION__ ); /* int ret = -1; int maxtry = 10; while (maxtry-- 0) { ret = delete_module(modname, O_NONBLOCK | O_EXCL); if (ret 0 errno == EAGAIN) usleep(500000); else break; } */ int ret=-1; char command[]="echo 0 /sys/devices/platform/bwpm/wifi"; char command2[]="echo 0 /sys/bus/platform/drivers/msm_sdcc/msm_sdcc.1/polling"; ret=system(command); LOGD( "wifi %s() %s ret=%d" , __FUNCTION__ , command ,ret); usleep(200000); ret=system(command2); LOGD( "wifi %s() %s ret=%d" , __FUNCTION__ , command2 , ret ); int maxtry = 50; while (maxtry-- 0) { if ( (ret=access( WLAN0_DEVICE , R_OK )) == 0) { LOGD( "wifi %s() wait for disable wlan0 ...." , __FUNCTION__ ); usleep(100000); } else { LOGD("wifi %s() wlan0 driver Disabled! return " , __FUNCTION__ ); return 0; } } if (ret == 0) LOGE("wifi %s() Unable to disable wlan0 driver return 0;", __FUNCTION__); return -1; } int do_dhcp_request(int *ipaddr, int *gateway, int *mask, int *dns1, int *dns2, int *server, int *lease) { LOGD( "wifi %s() function in", __FUNCTION__ ); /* For test driver, always report success */ if (strcmp(iface, WIFI_TEST_INTERFACE) == 0) return 0; if (ifc_init() 0) return -1; LOGD( "wifi %s() sleep 1sec...." , __FUNCTION__ ); usleep(1000000); if (do_dhcp(iface) 0) { ifc_close(); return -1; } ifc_close(); get_dhcp_info(ipaddr, gateway, mask, dns1, dns2, server, lease); return 0; } const char *get_dhcp_error_string() { LOGD( "wifi %s() function in", __FUNCTION__ ); return dhcp_lasterror(); } static int check_driver_loaded() { char driver_status[PROPERTY_VALUE_MAX]; FILE *proc; char line[sizeof(DRIVER_MODULE_TAG)+10]; LOGD( "wifi %s() function in", __FUNCTION__ ); if (!property_get(DRIVER_PROP_NAME, driver_status, NULL) || strcmp(driver_status, "ok") != 0) { LOGD( "wifi %s() driver not loaded.", __FUNCTION__ ); return 0; /* driver not loaded */ } /* * If the property says the driver is loaded, check to * make sure that the property setting isn t just left * over from a previous manual shutdown or a runtime * crash. */ if ((proc = fopen(MODULE_FILE, "r")) == NULL) { LOGW("wifi %s() Could not open %s %s", __FUNCTION__ , MODULE_FILE, strerror(errno)); LOGW("wifi %s() property_set( \"%s\" , \"unloaded\");", __FUNCTION__ , DRIVER_PROP_NAME ); property_set(DRIVER_PROP_NAME, "unloaded"); return 0; } while ((fgets(line, sizeof(line), proc)) != NULL) { if (strncmp(line, DRIVER_MODULE_TAG, strlen(DRIVER_MODULE_TAG)) == 0) { fclose(proc); LOGD( "wifi %s() driver loaded", __FUNCTION__ ); return 1; } } fclose(proc); LOGD( "wifi %s() property_set( \"%s\" , \"unloaded\");",__FUNCTION__ , DRIVER_PROP_NAME ); property_set(DRIVER_PROP_NAME, "unloaded"); return 0; } int wifi_load_driver() { LOGD( "wifi %s() function in", __FUNCTION__ ); char driver_status[PROPERTY_VALUE_MAX]; int count = 100; /* wait at most 20 seconds for completion */ if (check_driver_loaded()) { return 0; } LOGD( "wifi %s() check driver .... true.",__FUNCTION__); if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) 0) { LOGE( "wifi %s() try insmod %s %s ....false,",__FUNCTION__,DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); return -1; } LOGD( "wifi %s() try insmod %s %s ....true.",__FUNCTION__,DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); if (strcmp(FIRMWARE_LOADER,"") == 0) { LOGD( "wifi %s() none FIRMWARE_LOADER." , __FUNCTION__); LOGD( "wifi %s() sleep %dusec...." , __FUNCTION__ , WIFI_DRIVER_LOADER_DELAY ); usleep(WIFI_DRIVER_LOADER_DELAY); LOGD( "wifi %s() property_set( \"%s\", \"ok\" ) ." , DRIVER_PROP_NAME ,__FUNCTION__); property_set(DRIVER_PROP_NAME, "ok"); } else { LOGD( "wifi %s() property_set( ctl.start, %s )",__FUNCTION__ , FIRMWARE_LOADER ); property_set("ctl.start", FIRMWARE_LOADER); } sched_yield(); while (count-- 0) { usleep(200000); if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) { if (strcmp(driver_status, "ok") == 0) { LOGD( "wifi %s() driver status ... true",__FUNCTION__); return 0; } else if (strcmp(DRIVER_PROP_NAME, "failed") == 0) { wifi_unload_driver(); LOGD( "wifi %s() call driver unload",__FUNCTION__); return -1; } } } property_set(DRIVER_PROP_NAME, "timeout"); wifi_unload_driver(); return -1; } int wifi_unload_driver() { LOGD( "wifi %s() function in", __FUNCTION__ ); int count = 20; /* wait at most 10 seconds for completion */ if (rmmod(DRIVER_MODULE_NAME) == 0) { while (count-- 0) { if (!check_driver_loaded()) break; usleep(500000); } if (count) { return 0; } return -1; } else return -1; return 0; } int ensure_config_file_exists() { LOGD( "wifi %s() function in", __FUNCTION__ ); char buf[2048]; int srcfd, destfd; int nread; if (access(SUPP_CONFIG_FILE, R_OK|W_OK) == 0) { return 0; } else if (errno != ENOENT) { LOGE("wifi %s() Cannot access \"%s\" %s", __FUNCTION__ , SUPP_CONFIG_FILE, strerror(errno)); return -1; } srcfd = open(SUPP_CONFIG_TEMPLATE, O_RDONLY); if (srcfd 0) { LOGE("wifi %s() Cannot open \"%s\" %s", __FUNCTION__ , SUPP_CONFIG_TEMPLATE, strerror(errno)); return -1; } destfd = open(SUPP_CONFIG_FILE, O_CREAT|O_WRONLY, 0660); if (destfd 0) { close(srcfd); LOGE("wifi %s() Cannot create \"%s\" %s", __FUNCTION__ , SUPP_CONFIG_FILE, strerror(errno)); return -1; } while ((nread = read(srcfd, buf, sizeof(buf))) != 0) { if (nread 0) { LOGE("wifi %s() Error reading \"%s\" %s", __FUNCTION__ , SUPP_CONFIG_TEMPLATE, strerror(errno)); close(srcfd); close(destfd); unlink(SUPP_CONFIG_FILE); return -1; } write(destfd, buf, nread); } close(destfd); close(srcfd); if (chown(SUPP_CONFIG_FILE, AID_SYSTEM, AID_WIFI) 0) { LOGE("wifi %s() Error changing group ownership of %s to %d %s", __FUNCTION__ , SUPP_CONFIG_FILE, AID_WIFI, strerror(errno)); unlink(SUPP_CONFIG_FILE); return -1; } return 0; } int wifi_start_supplicant() { char supp_status[PROPERTY_VALUE_MAX] = { \0 }; int count = 200; /* wait at most 20 seconds for completion */ #ifdef HAVE_LIBC_SYSTEM_PROPERTIES const prop_info *pi; unsigned serial = 0; #endif LOGD("wifi %s() function in" , __FUNCTION__ ); /* Check whether already running */ if (property_get(SUPP_PROP_NAME, supp_status, NULL) strcmp(supp_status, "running") == 0) { LOGD("wifi %s() wpa supplicant running" , __FUNCTION__ ); return 0; } property_set("ctl.start", "wpa_supplicant"); return 0; /* Before starting the daemon, make sure its config file exists */ if (ensure_config_file_exists() 0) { LOGE("wifi %s() Wi-Fi will not be enabled", __FUNCTION__ ); return -1; } /* Clear out any stale socket files that might be left over. */ wpa_ctrl_cleanup(); #ifdef HAVE_LIBC_SYSTEM_PROPERTIES /* * Get a reference to the status property, so we can distinguish * the case where it goes stopped = running = stopped (i.e., * it start up, but fails right away) from the case in which * it starts in the stopped state and never manages to start * running at all. */ pi = __system_property_find(SUPP_PROP_NAME); if (pi != NULL) { serial = pi- serial; } #endif property_set("ctl.start", SUPPLICANT_NAME); LOGD("wifi %s() property_set(\"ctl.start\", %s );" , __FUNCTION__ , SUPPLICANT_NAME ); sched_yield(); while (count-- 0) { usleep(100000); #ifdef HAVE_LIBC_SYSTEM_PROPERTIES if (pi == NULL) { pi = __system_property_find(SUPP_PROP_NAME); } if (pi != NULL) { __system_property_read(pi, NULL, supp_status); if (strcmp(supp_status, "running") == 0) { return 0; } else if (pi- serial != serial strcmp(supp_status, "stopped") == 0) { return -1; } } #else if (property_get(SUPP_PROP_NAME, supp_status, NULL)) { if (strcmp(supp_status, "running") == 0) { LOGD("wifi %s() wpa supplicant running" , __FUNCTION__ ); return 0; } } #endif } LOGE("wifi %s() timeout!" , __FUNCTION__ ); return -1; } int wifi_stop_supplicant() { char supp_status[PROPERTY_VALUE_MAX] = { \0 }; int count = 50; /* wait at most 5 seconds for completion */ /* Check whether supplicant already stopped */ if (property_get(SUPP_PROP_NAME, supp_status, NULL) strcmp(supp_status, "stopped") == 0) { return 0; } LOGD( "wifi %s() stop wpa_supplicant...", __FUNCTION__ ); property_set("ctl.stop", SUPPLICANT_NAME); sched_yield(); while (count-- 0) { usleep(100000); if (property_get(SUPP_PROP_NAME, supp_status, NULL)) { if (strcmp(supp_status, "stopped") == 0) return 0; } } return -1; } int wifi_connect_to_supplicant() { char ifname[256]; char supp_status[PROPERTY_VALUE_MAX] = { \0 }; LOGD( "wifi %s() function in", __FUNCTION__ ); /* Make sure supplicant is running */ if (!property_get(SUPP_PROP_NAME, supp_status, NULL) || strcmp(supp_status, "running") != 0) { LOGE("wifi %s() Supplicant not running, cannot connect", __FUNCTION__); return -1; } property_get("wifi.interface", iface, WIFI_TEST_INTERFACE); LOGD("wifi %s() property_get(\"wifi.interface\", iface, WIFI_TEST_INTERFACE);" , __FUNCTION__ ); LOGD("wifi %s() iface=%s", __FUNCTION__ , iface ); LOGD("wifi %s() IFACE_DIR=%s", __FUNCTION__ , IFACE_DIR ); if (access(IFACE_DIR, F_OK) == 0) { LOGD("wifi %s() IFACE_DIR ok", __FUNCTION__ ); snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface); } else { LOGE("wifi %s() IFACE_DIR NG", __FUNCTION__ ); LOGE("wifi %s() IFACE_DIR check error=%s", __FUNCTION__ , strerror(errno) ); strlcpy(ifname, iface, sizeof(ifname)); } LOGD("wifi %s() ifname=%s", __FUNCTION__ , ifname ); LOGD("wifi %s() wpa_ctrl_open(%s);", __FUNCTION__ , ifname); ctrl_conn = wpa_ctrl_open(ifname); if (ctrl_conn == NULL) { LOGE("wifi %s() Unable to open connection to supplicant on \"%s\" %s", __FUNCTION__ , ifname, strerror(errno)); return -1; } monitor_conn = wpa_ctrl_open(ifname); if (monitor_conn == NULL) { wpa_ctrl_close(ctrl_conn); ctrl_conn = NULL; return -1; } if (wpa_ctrl_attach(monitor_conn) != 0) { wpa_ctrl_close(monitor_conn); wpa_ctrl_close(ctrl_conn); ctrl_conn = monitor_conn = NULL; return -1; } return 0; } int wifi_send_command(struct wpa_ctrl *ctrl, const char *cmd, char *reply, size_t *reply_len) { static const char *zero=""; int ret; char text[256]; LOGD( "wifi %s() function in command=%s", __FUNCTION__ , cmd ); if (ctrl_conn == NULL) { LOGV("wifi %s() Not connected to wpa_supplicant - \"%s\" command dropped.\n", __FUNCTION__ , cmd); return -1; } /* switch(cmd[0]) { case B if( strncmp(cmd , "BLACKLIST" , 9 ) == 0 ) { LOGW( "wifi %s() function command=%s comannd ignored! return 0;", __FUNCTION__ , cmd ); *reply_len=0; return 0; } break; case D if( strncmp(cmd , "DRIVER RSSI-APPROX" , 18) == 0 ) { LOGW( "wifi %s() function command=%s comannd ignored! return 0;", __FUNCTION__ , cmd ); reply=""; *reply_len=0; return 0; } if( strncmp(cmd , "DRIVER LINKSPEED" , 16) == 0 ) { LOGW( "wifi %s() function command=%s comannd ignored! return 0;", __FUNCTION__ , cmd ); reply=""; *reply_len=0; return 0; } else if( strncmp(cmd , "DRIVER" , 6) == 0 ) { LOGW( "wifi %s() function command=%s comannd ignored! return 0;", __FUNCTION__ , cmd ); *reply_len=0; return 0; } break; case G if( strncmp(cmd , "GET_" , 4 ) == 0 ) { LOGW( "wifi %s() function command=%s comannd ignored! return 0;", __FUNCTION__ , cmd ); *reply_len=0; return 0; } break; } */ ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), reply, reply_len, NULL); snprintf( text , 254 , "%s" , reply ); text[((*reply_len 256)?*reply_len 255)]= \0 ; if (ret == -2) { LOGD("wifi %s() %s command timed out.", __FUNCTION__ , cmd); return -2; } else if (ret 0 || strncmp(reply, "FAIL", 4 ) == 0 ) { LOGE( "wifi %s() function command=%s (reply=FAIL || ret 0) reply=%s length=%d ret=%d return -1;", __FUNCTION__ , cmd, text, *reply_len , ret ); return -1; } LOGD( "wifi %s() function command=%s reply=%s ret=%d", __FUNCTION__ , cmd , text , ret ); if (strncmp(cmd, "PING", 4) == 0) { reply[*reply_len] = \0 ; } return 0; } int wifi_wait_for_event(char *buf, size_t buflen) { size_t nread = buflen - 1; int fd; fd_set rfds; int result; struct timeval tval; struct timeval *tptr; LOGD( "wifi %s() function in", __FUNCTION__ ); if (monitor_conn == NULL) { LOGD("wifi %s() Connection closed\n" , __FUNCTION__ ); strncpy(buf, WPA_EVENT_TERMINATING " - connection closed", buflen-1); buf[buflen-1] = \0 ; return strlen(buf); } result = wpa_ctrl_recv(monitor_conn, buf, nread); if (result 0) { LOGD("wifi %s() wpa_ctrl_recv failed %s\n", __FUNCTION__ , strerror(errno)); strncpy(buf, WPA_EVENT_TERMINATING " - recv error", buflen-1); buf[buflen-1] = \0 ; return strlen(buf); } buf[nread] = \0 ; /* LOGD("wait_for_event result=%d nread=%d string=\"%s\"\n", result, nread, buf); */ /* Check for EOF on the socket */ if (result == 0 nread == 0) { /* Fabricate an event to pass up */ LOGD("wifi %s() Received EOF on supplicant socket" , __FUNCTION__ ); strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1); buf[buflen-1] = \0 ; return strlen(buf); } /* * Events strings are in the format * * N CTRL-EVENT-XXX * * where N is the message level in numerical form (0=VERBOSE, 1=DEBUG, * etc.) and XXX is the event name. The level information is not useful * to us, so strip it off. */ if (buf[0] == ) { char *match = strchr(buf, ); if (match != NULL) { nread -= (match+1-buf); memmove(buf, match+1, nread+1); } } return nread; } void wifi_close_supplicant_connection() { LOGD( "wifi %s() function in", __FUNCTION__ ); if (ctrl_conn != NULL) { wpa_ctrl_close(ctrl_conn); ctrl_conn = NULL; } if (monitor_conn != NULL) { wpa_ctrl_close(monitor_conn); monitor_conn = NULL; } } int wifi_command(const char *command, char *reply, size_t *reply_len) { return wifi_send_command(ctrl_conn, command, reply, reply_len); } RSSI(電界強度)をGUIに反映させるには? fi01さんより、RSSI値をAndroid GUIに反映させる修正をコメントに頂きました。 driver_wext.c はシャープのWebサイトより、IS01向けGPLソースを取得して driver_wext.c のみ利用した。 $ diff -u driver_wext.c.gpl_is01 driver_wext.c --- driver_wext.c.gpl_is012011-01-13 22 05 39.827724368 +0900 +++ driver_wext.c2011-01-13 22 06 34.807605306 +0900 @@ -2715,7 +2715,7 @@ } else if( os_strncasecmp(cmd, "scan-channels", 13) == 0 ) { } - else if( os_strcasecmp(cmd, "rssi") == 0 ) { + else if( os_strcasecmp(cmd, "rssi") == 0 || os_strcasecmp(cmd, "rssi-approx") == 0 ) { struct iwreq wrq; struct iw_statistics stats; signed int rssi; 以上。 コメント テスト -- (is01rebuild ) 2011-01-05 15 14 10 IS01向けGPLソースでのRSSIの取得は下記でよいかもです。 - else if( os_strcasecmp(cmd, "rssi") == 0 ) { + else if( os_strcasecmp(cmd, "rssi") == 0 || os_strcasecmp(cmd, "rssi-approx") == 0 ) -- (fi01) 2011-01-13 16 54 22 fi01さん、ありがとうございます。 追って、組み込みます。 wpa_supplicant/driver_wext.c はまだ、全く見ていなかったので助かります。 私がすると、/sysから直接読み込むところでした^^; -- (is01rebuild ) 2011-01-13 21 19 04 # echo 0 wifi # echo 0 polling # echo 1 wifi # echo 1 polling # stop synergy_service # start synergy_service でwlan0が復活することが確認できました。 wifi.cを上手く書き換えると確実性が上がるかもしれません。 -- (RO215IS01) 2011-01-14 04 29 06 wpa_ctrl_openで"/dev/socket/wpa_wlan0"を指定すれば "/data/misc/wifi/wpa_supplicant.conf"の修正 ctrl_interface=DIR=/data/misc/wifi/sockets は不要です。 -- (fi01) 2011-01-14 08 56 30 自ビルドcyanogenmodの場合は設定ファイルの修正が必要でした。 dhcpでIPアドレス取得後すぐに切断されてしまう場合は下記を適用してみてください。 system/etc/dhcpcd/dhcpcd-run-hooks - if ls "${hook}" /dev/null 2 1; then + if [ -f "${hook}" ]; then -- (fi01) 2011-01-14 14 46 51 RO215IS01さん、fi01さんありがとうございます。 wpa_ctrl_openで"/dev/socket/wpa_wlan0"は後ほど試してみます。 wiki内にマージします。 デフォルトのservice起動では socket wpa_wlan0 dgram 660 wifi wifi が指定されてますので、それを利用という形でしょうか。 wpa_supplicant も Android もかなりの素人なので助かります。 現段階でAndroidのバージョンが、2.2_r1.3、2.2.1_r1、2.3.1r1、 CyanogenMod6(でしょうか?)の情報が入ってきていますので、 本wikiでもバージョン毎の差異をまとめないといけないですね。 ベースが大きく変わらなければほぼ同一の内容でいけるとは思いますが。 -- (is01rebuild ) 2011-01-14 18 52 20 No spitting on the street.I know what you wantHe resolved to give up smoking.The teams are coming onto the field.What s the weather like to day? Does the computer ever make a mistake.It rather surprised me.Is this the fight bus for the Capital Library? Cancer is a deadly disease.Will you connect this wire to the television ? -- (http //oakleyfrogskins2.cabanova.com/) 2013-03-17 06 38 29 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/is01rebuild/pages/73.html
githubアカウントを取得したので… 以降、何かこちらで公開するかも。 https //github.com/is01rebuild/ (2011/02/01 22 50)
https://w.atwiki.jp/is01/pages/14.html
キーボード IS01はQWERTYのハードウェアキーボードを搭載しています。 同社の「NetWalker」の反省を生かして、タッチ感を重視したパンタグラフキーボードを採用したということです。 キーボードのタッチ感は極めて良好なのですが、キーボードの大きさは両手で打つにはあまりにも小さすぎて正直、手の小さな女性でない限り片手打ちが限界といった所。 IS01を利用してblogの更新や出先で大量の記事を書こうと思って購入しようと思っている方は注意した方がいいでしょう。 1円PCなどとしてよく売られている安価なネットブックや以前に発売されたNTT DocomoのPocket PCのSigmarion3や電子メモ帳「ポメラ」の様なキーボードの様な操作感を求めている人には少々使いにくく物足りない感じがするかもしれません。 IS01はスマートフォンとネットブックのちょうど中間として位置づけられて作られているため「W-ZERO3[ES]の様なキーボード付きスマートフォンのキーボードがちょっと豪華になって打ちやすくなったモノ」程度に考える感じがいいかもしれません。 リンク先は横幅2000ピクセルの画像です。 ノイズが多くてすいません。
https://w.atwiki.jp/is01next/pages/35.html
365 kernel書き換え試してみるのはとりあえず、自己リスクで。 /system書き換える場合も、androidを起動しなくても adbがつながるようにしてからやるのが安心だと思います。 現状androidが起動しない adbでつながらないときに元に戻す 手段がないので危険だと思います。 現在bootloaderにそういったモードがないか確認中です。 自分の場合はandroid起動しなくてもadbでつなげられるのですが qxdmを有効にした状態ですので、もしadb認識してない人は qxdmを有効にしてみてください。 echo 1 /sys/devices/platform/msm_hsusb_periphera/qxdm_enable 407 戻りました。bootloader解析続けます。 文鎮状態の人を大量発生させるのはいやなので。^^; 412 /dev/mem, /dev/kmemの代わりをするドライバを起こしました。 /dev/mem_ex, /dev/kmem_exが使えます。 http //hotfile.com/dl/86203816/abbea85/mem_ex.zip.html ./mem_ex 20008000 100 | /data/bootkit/busybox hexdump -C こうすると、物理アドレス0x20008000 から 0x100バイトダンプできます。 不安定のため、テスト版ということで。後ほどソースUpします。 たとえば、 cat /proc/kallsyms | /data/busybox/grep kstrtab_jiffies_64$ 804cd1a8 r __ksymtab_jiffies_64 ./mem_ex 204cd1a8 4 | /data/busybox/hexdump -C 00000000 a8 e5 4f 80 00000004 ./mem_ex 204fe5a8 4 | /data/busybox/hexdump -C これで、jiffiesがダンプで着ます。 432 bootloader内に、リカバリーモードに移行するモードがあるのを発見 現在方法解析中 743 以前に質問があがっていた、URA_MODE指定でのbootが できるようにしてみました。 手元に実機がないので、なんともいえないですが・・ insmodした後に、 cat /proc/reboot_fastboot でfastbootの起動にtryします。 cat /proc/reboot_uramode でuramodeの起動にtryします。 http //hotfile.com/dl/87649426/0077814/shdiag_test.zip.html URA_MODEって何なんでしょうね・・ 745 743 お疲れ様です。 cat /proc/reboot_fastboot cat /proc/reboot_uramode 両方とも、通常起動してきます。 よろしければ、私も合同デバッグに参加したくおもいます。 746 オリジナルのブートローダですが、のっとるのは無理そうでした。 ダウンロードモードでファームウェアを更新するほうも、 xperiaのようにまずダウンロード用のbootloaderを転送してから 実際の書き換え処理をしなければいけなく、手間が多いので ちょっとこの辺できりにしようと思ってます。 747 一応解析した結果は後ほどまとめておきますね。 いづれにしても文鎮化対策は必要だと思いますので、 kernel system,recoveryが壊れたときにもリカバリできる手段を考えます。 いまのところは、オリジナルのブートローダからの起動に さらに自家製ブートローダを挟み込み、あるキーが押されて 起動されたときは、自家製ブートローダ+fastbootでNANDが 書き換えられるような方向で考えています。 750 どなたか。 こちらをrecovery領域に焼いて、fastbootが起動するか確認お願いできますか? http //hotfile.com/dl/87692648/6ca0cd3/mtd2.zip.html reboot recoveryでfastbootに移行します。 画面上には変化は出ませんが、新しいUSBが認識すると思いますので、 そこで、sdkに付属のusbドライバ、android_winusb.infを変更して、 SingleBootLoaderInterfaceとして認識するようにVendorID, ProductIDをあわせてください。 認識後は、 fastboot -i 0x4dd getvar version ができると思います。 ちょっとできるかどうか確認お願いできますか? 752 750 # flash_image recovery_rw /sdcard/tmp/mtd2bin 実行後 adb reboot recovery で端末が再起動しますが "IS series" のロゴのまま進みません。3分ほど放置。 一旦、電池抜いて通常bootで起動はできました。 753 752 ロゴがでっぱなしで動いているように見えないのは仕様です。 その状態でUSB認識しますでしょうか? 754 adb からは device not found windows 上からは USB デバイス認識していないように見えます。 デバイスマネージャーから Android Phone が見えない。 不明なデバイス等は見当たらない android_winusb.info は書き換えていません。 755 752 カーネルのスタートコードにいきなりリターン命令を入れてみたのですが、 うまくいかないですね・・。 引き続き見てみます。 772 JN-DK01では、fastboot modeはトラックボールを押しながら電源をONします。 他のandroidでも、何かを押しながら電源ONでモードに入ることが多い見たいですが IS01にはボタン等を押しながら電源ONでfastboot modeする方法はないとか、 fastboot mode自体ないと解析の結果でたのでしょうか? 773 772 その通りで、ボタンからはfastboot,recoveryに入る方法はない可能性が大です。 少なくてもfastbootには入れません。 以前にbootloaderのバイナリ アセンブラソースはあげましたが、もう一度あげておきます。 http //hotfile.com/dl/87926737/33050a5/is01_bootloader.zip.html is01でも同じようにトラックボール押しながら電源ONでfastboot要求自体は 入るのですが、 is01ブートローダーはmain関数内で、fastbootに入るかどうかのチェックを 無視するようにパッチがあたっています。 775 773 ブートローダを書き換える方法はありそうですか? 786 773 というとトラックボール押しながら電源ONでboot recoveryという設定にすることは可能なのでしょうか? 792 775 モデム側のファームウェアにあるダウンロードモードであれば可能と思われますが、 根が深く調査は困難です。HTCのようなQualcomm互換のものではないので。 現状はブートローダーは書き換えない方向で考えています。 786 トラックボール押しながらの操作はモデム側のファームウェアでfastboot用の フラグは立てていますが、Recoveryモード用のフラグは存在しなさそうでした。 キー操作でRecoveryにするのは絶対とは言えませんが無理な可能性が高いです。 なので、これらの方向から攻めるのはいったんキリにしようかと思っています。 ちなみに、IS01のキーボードはモデム側のファームウェアで管理されており I2Cというバスでつながっています。4つまでのキーの同時押しに対応している ようです。 817 773 bootloaderのバイナリ アセンブラソース拝見しました。 もし、usbloader動くとvendor idが18D1、product idがD00Dとなるのでしょうか? 18D1ってシャープではないですよね。 他のベンダーID使っていいわけではないと思うので動かないことを前提で放置だったのかな。 android_winusb.infの修正は、SingleBootLoaderInterfaceとして VID 18D1、PID D00Dを追記なのでしょうか? 819 817 www.linux-usb.org/usb.ids 18D1はGoogle Inc.で、PIDには 4e11 Nexus One Phone 4e12 Nexus One Phone (Debug) 4e13 Nexus One Phone (USB Tether) がある 818 is01用のmkbootimg作れた人います? ソースは落としたものの、makeが出来ない・・・ できればバイナリをアップしてもらえると嬉しいのですが・・・ 応援スレにあげたんですけどスレチな気がしてこっちに書き直しました。 820 818 助けが欲しいならもうちょっと詳しく書くべき こっちではmkbootimg.cにsha.c sha.hをインクルード後gccで正常�コンパイル出来てる もうちょっとまともなやり方もあるとおもうけどね 821 818 http //hotfile.com/dl/88199283/527d4cd/mkbootimg.html CM版なので、こんな感じで使います ./mkbootimg --kernel kernel.bin --ramdisk ramdisk.bin --cmdline "console=ttyMSM2,115200n8 androidboot.hardware=qcom" --base 0x20000000 --ramdiskaddr 0x04000000 --pagesize 0x1000 -o boot.img 822 IS01でとりあえず動作する bootloderのソースとバイナリです。 JN-DK01ではusb認識するのですが、IS01だと認識せず。 ただし、画面にコンソール出力ができるようになったので デバッグはできると思われます。 http //hotfile.com/dl/88205875/33a5b88/is01_fastboot20101209.tgz.html 632 まずはsystemがマウントできなくてもadb shellでつながるように見るのが先決と思われます。 まずは、recovery領域で・・ default.propとinit.rcを書き換え、adbを電源ON時に起動するようにする。 /sys/devices/platform/usb_periphera/qxdm_enableに1を書き、adbが 電源ON時に有効になるようにする。(ここは、kernelを書き換えてqxdmが有効でなくても 初期をadb接続にするのも手) adbのソースをいれかえて、/system/bin/shではなく、/sbin/shあたりから起動するようにする。 /sbin/の下にbusyboxやそれにシンボリックリンク張られたshを用意 これで、systemがマウントできなくてもadbでとりあえずつながるようになるので、 まずこの環境を用意するのがよいと思います。 720 boot領域に焼いていれば復旧するカーネルができたっぽい。 NVさんありがとうございます。 http //www.megaupload.com/?d=T63HMVRO 既出だったらごめん。 746 誰か 720試した? 749 746 NVさん自身がそのことを書いているのが見当たらない。 boot領域に焼いていれば復旧するカーネルができたっぽい。 これをどう解釈していいのやら。 750 749 ついったーにあるよ 754 746 入れたよ まだsystemまで到達してないからなんとも言えないけど 入れた結果変な挙動なるってことはなさそう 771 recovery_kitは、boot領域に焼いて意味があるものです。 recovery領域に焼いても、現時点ではboot領域を通る必要があるので意味がないです。 929 recovery_kit v1.20を公開。 リカバリメニューを追加しました。 また、自動ブートを追加したので、必要なときだけリカバリメニューを使うことができます。 http //www.megaupload.com/?d=YGH8MHY1 12 recovery_kit v1.25を公開。 起動画面の変更と、adbdを自動起動に戻しました。 http //www.megaupload.com/?d=3LFMY78G 36 Recovery_kit書き込むやつが多いが、Boot領域に書き込むリスクわかってるのか? 1.よくわからないやつ 手を出さないで素直にLinuxを勉強する。 IS01RooterとSDKでコマンドプロンプトからadbで色々遊べる。 2.Swap有効化したい、Adhoc有効化したい Swapやadhocのファイル書き換え程度なら文鎮化するリスクなどほぼ無いので、 Recovery領域にnvさんか仙石さんのカーネルイメージを書き込む。 これなら書き損じても通常Bootでき、文鎮化は回避できる。 又、書き損じて文鎮化するリスクを覚悟出来るなら、 Recoveryをオリジナル、Bootを改造カーネルする。 これなら、わざわざRecoveryから起動する必要がなく、工場出荷状態に戻すが使えるようになる(らしい) 3.adhocやswap以外にSystemをいじりたい(build.porpなど) 起動時に影響するシステムファイルを書き換えるなら、 Recovery_kitを導入したほうが起動時にこけた場合に復旧が可能となるので入れたほうがよさげ。 ただし、Bootを書き換えるので書き損じると文鎮化するリスクあり。 こんな感じか? だいたいの奴は2だろ? Recoveryにカーネル書き込むぐらいで平気だろ。 918 自分で試してみました。やはり、qxdm_enableによってadbdの認識状況が変わるようです。 0だと、放置しても認識しません。 1にすると、ちょっと放置すると認識しました。 qxdm_enableが0でも、recovery領域に通常起動用のカーネルを焼いておくことで、1に設定するために リカバリメニューから通常起動用のカーネルを起動させることが可能です。 また、qxdm_enableを1にするための方法を、次回アップデート時に追加します。 まとめとして、recovery_kitを使用するときは、qxdm_enableを1に設定し、recovery領域に通常起動用のカーネルを 焼いた上で使用してください。 926 918 いろいろ進んでいるみたいでよかったです。bootloader入れることもいろいろ検討しましたが、 ・fastbootのubi対応が面倒くさい(標準では実装がない) ・初回インストール時に結局文鎮化の恐れ自体は存在する(NANDを書き換える点では変わらない) というわけで、NVさんの解法標準領域をRecovery用にしておいて、本来のRecovery領域で再起動する、 が一番スマートかなと思いました。 ちなみに、qxdm_enableに1を書いておくと、adbが有効になる理由は、カーネルソースコードの drivers/usb/function/msm_hsusb.cの4055付近でqxdm_enableだったら、adb_enableにする、っていう 実装が入っていることにより行われます。 echo adb=1 /sys/devices/platform/msm_hsusb_periphera/func_enable でも同様の効果が得られます。 927 recovery_kit v1.30をリリースしました。 qxdm_enableを1にするための項目をリカバリメニューに追加しました。 導入している場合は"必ず"更新をお願いします。 http //www.megaupload.com/?d=D3F66M78 928 918 おおぉ…ということは /recoveryがデフォルトでqxdm_enable=0の状態で入れてしまったら 文鎮(電池充電機能付き)決定ということですね といいつつ懲りずに今日is01もう一つ買ってきました 931 928 v1.25まではそうでしたが、v1.30からqxdm_enableをリカバリメニューから1にできるようになったので、 文鎮化の可能性は低くなってます。 945 IS01のfirmware updateはイノパスソフトウェアのMobile Updateで実現してるらしいね。 http //www.innopath.com/jp/news/press_releases/2010/2010_06_23.shtml SyncML、OMADMなどを参照すると良いかも。 948 945 ひえー。ゴロー君たちはこのバイナリを解析していることに なるのか。本当に乙です。 342 現在の状況ですが、 モデム側のsharp版downloaderモードのパケット解析進行中です。 モデム側のfirmwareは参考ソースもなく、バイナリの量が多くて時間がかかりましたが・・ ダウンロードモードに移行後任意のバイナリをメモリ上に転送するところまで行きましたが、 実行するためには認証チェックがあるためそこをどうにかすることを検討中。 これ利用して、モデム側のfirmwareからfastboot起動することや bootloaderそのものの書きかえもできるようになると思います。 246 244 fi01さん そちらのディレクトリ構成のがわかりやすいですね。 私の方はちょっとごちゃごちゃしてます^^; ふと、思いついたのですが、mount、permission設定 までを init.rc に書き、以降の service 部分などはファイルシステムから include すると boot.img を1回作成するだけで良いかもしれません。 確か、init に import が有ったような気がします。 ドキュメントちゃんと読んでないのでこれからですが、試してみます。 346 246 initのimportコマンドとmountのloop@~も一応動いたから 毎回flash_imageしなくても環境切り替えが可能に出来そうです。 execまで使えるように変更すれば、ほとんどブートローダになりそう。
https://w.atwiki.jp/auroot/pages/31.html
IS12SH ROOT化 SHBreak、ISTweak、をインストールします。 「庵怒露慰怒」http //marijuana.ddo.jp/is01/index.php?moddir=downloads action=single cid=3 lid=44 1.現在のカーネルのバックアップを取る SHBreakにて、Breakボタンを押す。もう一度起動してCopy AU ISTweakにてSU有効。 端末エミュレータを起動。 以下のコマンドを順に実行(Enter押下) su cat /dev/mtd/mtd3ro /data/local/recovery.img cat /dev/mtd/mtd0ro /data/local/boot.img mtd0が通常のbootイメージ、mtd3がリカバリー用のイメージとなります。 このバックアップは各自で管理してください。 2.boot.imgの編集 data/localにコピーしたboot.imgをPCへ移動 バイナリエディタで開く。 autoexec.shをサービスとして実行させるための変更を行う。 変更点 変更済みイメージ 変更したら別名(mtd02.binとする)で保存し、IS12SHのdata/localへコピー 3.nandlock解除、カーネル焼き IS12SHにて作業。一時ルートが取れてない場合は再びSHBreakとISTweakでSU有効。 nandunlockshspamp、flash_image、 autoexec.shと一連のファイル群をdata/localへ保存 nandunlockshspamp,flash_image,autoexec.shのパーミッションを755に変更 adb接続で、以下のコマンド実行 su cd data/local ./nandunlockshspamp 0xc08a9a88 y ./flash_image recovery ./mtd02.bin (失敗したらもう一度) reboot recovery 再起動後、通常のandroidが起動すれば成功です。 4.Root まずSuperuser.apkをインストールしましょう。 Rootの切り替えはIS03rootswitcherが使えます。ボタンひとつでroot有効、無効切り替え可能。 カーネルはDropBoxで公開しています。 5.その後 MIYABI解除をやってみたところ、不安定すぎていつの間にか電源断になっていました。でも、とにかくできたことはできた! .MIYABIの解除 boot.imgをバイナリエディタで開きます。 次の2つのHexValを検索します。 002F73797374656D2F00 (文字列だと./system/.) 0073797374656D00 (文字列だと.system.) すると、./system/.が一ヶ所、.system.が二ヶ所ヒットすると思います。 この./system/.と、ramdisk領域で無い方の.system.の2つを何か別のものに書き換えます。 するとMIYABIが解除されます。
https://w.atwiki.jp/is01next/pages/15.html
■insmod解禁 http //codepad.org/LteMrcnv IS01のmodules_disabledを0にするためのカーネルモジュール http //nsft.108shiki.com/soft/modules_enabler_v100.zip v1.10によるLSM無効化を使って/systemに直接unlockされたNANDをマウントするときの記録 http //codepad.org/NjEmAmj2 modules_enabler v1.10 LSM無効化 http //nsft.108shiki.com/soft/modules_enabler_v110.zip 768 insmodができない理由を調べてみた どうやら、module_disableが1になってるかららしい 0から1にすることしかできないから、0に戻すのは難しいかと kernel/module.cとかkernel/sysctl.cとかに書いてある 774 768 ローダブルモジュール類不可? 775 774 /init.rcで/proc/sys/kernel/modules_disabledを1にするように設定されてる 778 SELinuxでもはいってんのかこいつは 780 778 もっとえげつないDeckard LSMなる物がkernel.tar.gz/security/に入ってる DeckardってのはたぶんIS01の内部名。Nexus 6を追ったブレードランナーの名前 431 twitterより転載。 @nvsofts insmod解禁 http //codepad.org/LteMrcnv #is01 @nvsofts #IS01 のmodules_disabledを0にするためのカーネルモジュール http //nsft.108shiki.com/soft/modules_enabler_v100.zip 460 DECKARD LSMの無効化はモジュール作って こんな感じでできるかな? static struct security_operations disable_ops; security_fixup_ops( disable_ops); security_ops = disable_ops; security_fixup_opsは/proc/kallsymsで分かるし、 あとはsecurity_opsのアドレス探せば出来るよね? 467 Twitterから @nvsofts modules_enabler v1.10によるLSM無効化を使って/systemに直接unlockされたNANDをマウントするときの記録 http //codepad.org/NjEmAmj2 #IS01 @nvsofts modules_enabler v1.10 LSM無効化を追加 http //nsft.108shiki.com/soft/modules_enabler_v110.zip @nvsofts #IS01 のLSM外せた!!!!! ■insmod+が同梱されたカーネル:パスはdeckard http //uploading.com/files/faff9af4/rachael-0.0.beta.2.7z/ http //uploading.com/files/m64ma8db/rachael-0.0.beta.2-src.zip/ 371 ./insmod+ -f rachael.koで普通にロードできた。 何だこれ。 377 素の01.00.07なんだが、 /sh_tmp # lsmod unifi_sdio 294368 0 - Live 0x7f000000 /sh_tmp # cat /proc/sys/kernel/modules_disabled 1 /sh_tmp # ./insmod+ -f rachael.ko force loading... insmod rachael.ko addr=0x800a206c /sh_tmp # lsmod rachael 11660 0 - Live 0x7f0aa000 unifi_sdio 294368 0 - Live 0x7f000000 /sh_tmp # cat /proc/sys/kernel/modules_disabled 1 何かおかしくね? 378 377 insmod+使うと、modules_disabledが1でもロードできるっぽい。 どうやってやってるかは知らないけど。 380 378 レスさんくすです。 俺の勘違いじゃなくて良かった。 381 いや、良かないか。新手の罠か? 382 中身を覗いてみたけど、なんかの脆弱性を突いてる気がする。 383 しれっとすごいコードがリリースされてるんだな…
https://w.atwiki.jp/dnmagazine/pages/124.html
ROOT 作者:メカ道楽 連載時期:2013年2月4日 - 作品概要 あらすじ 登場人物 作品リンク chapter1 chapter2 chapter3