2020年11月5日木曜日

香港版Xperia 5 Ⅱ(XQ-AS72)でau VoLTEを使うユメ

 夢なので実践等は自己責任で行ってください。

 

みなさんごきげんよう!みれんくです。

題意の通り、先日香港版Xperia 5 Ⅱにおいてau VoLTEを有効化することができた夢を見たので共有します。この手法においてauと楽天モバイルは動作確認できました。SBとdcmでも使える気はしますが確認手段がないのでなんとも言えません…

追記2(2021/5/15):国内版1 Ⅱのmodemを焼くことでVoLTE化できるそうです(https://mirenote.blogspot.com/2020/11/Xperia5ii-VoLTE.html?showComment=1620481446893#c8631811460278459309)

これにより、Bootloader UnlockせずともVoLTE化できそうですが、記事はこのまま残しておきます。1 Ⅱのmodem焼きで動かない場合にお試しください。

追記(2020/12/31):docomoでの動作確認をしました


 

もくじ

  1. 概要

  2. よういするもの

  3. modemの編集

  4. Bootloader Unlockとroot化

  5. まとめ

 

1.概要

通信に関するものはmodemパーティションにあるのですが、通常の香港版では中国向けにカスタマイズされているらしく、そのままだとauではIMS登録ができずデータ通信しかできません。

そこでau版5ⅡのmodemをデュアルSIM機用に少し改変したものを焼いてあげる、というのがこの記事の手法です。どこぞやの流出ソフトは使用しませんので比較的クリーンな手法となっております。

2.よういするもの

  • 香港版Xperia 5 Ⅱ
  • 使用しているROM(ここではCustomized HK)のbootファイル
  • SOG02のmodemファイル 
  • adb,fastbootが使えるPC 

3.modemの編集 

modemファイルをUnSINにかけると、FATなイメージが出力されます。このイメージ内の

 images/modem_pr/mcfg/configs/mcfg_hw/oem_hw.txt

を編集します。このファイルを開くとSOG02のイメージの場合

 mcfg_hw/generic/common/SDX55/PDX206_K1/mcfg_hw.mbn

となっていると思います。これを

 mcfg_hw/generic/common/SDX55/PDX206_J2/mcfg_hw.mbn

と変更してあげます。Linuxマシンであればloopマウントで直接編集可能…なはずなのですが、自分が行うとIOエラーを吐いてうまくいきませんでした。したがって、バイナリエディタを使用し、上記の文字を直接置換しました。 バイナリエディタを使用する際は、mbn_hw.txtの方にある文字列を置換しないように注意してください。こちらのファイルは上記以外のmbnファイルも記載されているため、置換場所はわかりやすいと思います。

4.Bootloader Unlockとroot化

Bootloader UnlockはSony公式ページからUnlockコードをもらってくる必要があるのですが、執筆時(2020/11/5)現在、デバイスリストに5 Ⅱが存在しません。

しかし、Xperia 1 Ⅱを選択しIMEIを入れてあげることで使用可能なUnlockコードが出力されます。じゃあデバイスリスト作るなよ…

その後、これに従って作業を行えばBootloader Unlockは完了です。あとは用意しておいたbootイメージをMagisk Managerでパッチ当ててfastbootで焼いて終わりです。これ読むくらいならわかると思うので書きません。

rootが取れたら、あとは3.で用意した改変済みmodemを

 /dev/block/by-name/modem_a

 /dev/block/by-name/modem_b

にddで焼いてあげて工事完了です…

5.まとめ

 いかがでしたか?動作したら幸いです!

 

mcfg_hwの中身について補足ですが、ディレクトリ名の命名規則が

<コードネーム>_<キャリアor国一文字><SIMスロット数>

となっている感じがします。元の香港版はPDX206_C2となっております。J2=日本向けデュアルSIM向け設定では…?と思い上記の操作を無事動きました。ということは日本向けデュアルSIM機がそのうち出てもおかしくないねえ……

 



2020年4月28日火曜日

おそとにでれないのでボルテコンを買ったらめっちゃ待った話

yoi


こんにちは、最近SOUND VOLTEX(以下ボルテ)にハマっているみれんくです。
流行病のおかげで大学が伸び、家でボルテしてあんまり外に出ないようにしよう!という考えよりSVSE5を購入しました。
しかし、時期が時期で通常の配送より大幅に遅れて届いたため、今到着待ちの方や購入を検討している方向けにぼくの配送スケジュールをまとめようと思います。(ぼくは毎日追跡ページ更新してTwitterでほかの購入者の様子見たりしてたので絶対需要ある) 

最終的な追跡結果

日本郵便の追跡(リンク)


中国邮政速递物流の追跡(リンク)

中国発のものなので中国の方で追跡した方が国を出たかどうかが詳しく知れるかなと思っていましたが、結局ほぼ変わりありませんでした。何なら国際交換局発の時刻を打ち間違ってる気がするんですけど…
今注文してる方は日本郵便の追跡で十分だと思われます。 
 

3/30 - 注文

自分はGAMO2で購入しました。オプションはつまみをコーパルセットにし、ほかはデフォルトです。\28800。

4/1 - 発送完了メールが届く


友達とゲーセン行ってオンゲキやってたら届きました。この調子なら二週間位で来るんじゃないかとこのころは思ってました…

4/8 - 中国→日本のEMS便が一週間に1本ということを知る


ちょっと不安になったけど来週来るって信じてた

4/17 - 同時期注文の方が届き始める

つらかったです、ですがこの時期に届いたツイートを見ると全員4/8(水)に中国(鄭州)を出ていること、中国→日本便が一週間1本だという情報より来週の22日を待つことに…

4/22 - 追跡、動かず

4/17の時点で中国発の便に乗ると追跡が動くのを確認していた(国際交換局から発送のステータスが新たに出る)ので期待していたのですが、全く変わらずでした。
過去には一か月半待ったという方もいらっしゃったのでこの時はもうあきらめてました。

4/24 - 日本着!!!!!!

22日で更新されてないだけで、実際は動いてるかも…という淡い期待から毎日更新してましたが、急に「国際交換局に到着」のステータスが現れました。うれしかったです(KONAMI)

4/26 - 到着

この日はバイトで受け取りができそうになかったので、わざわざ郵便局に行って受け取ってきたのですが、箱が馬鹿でかいので車持ち以外はおすすめしません。

まとめ - いつかはくる!

ゲーセンも閉まり、中国来の郵便物は来ないでさんざんですが、頑張ってこの時期を乗り越えていきましょう…!
あと余談ですが、デフォルトで遊んでたらおとなりさんに怒られたので、静音化はしようね!自分はボタンにゴム手袋2重張り、ボタンの爪部分にゴム手袋1枚、バネに油、中身をバスタオルで詰める、台の下にタオルを敷くことでなんとか許しを得ました。
それではすてきなボルテライフをお過ごしください…


2019年7月15日月曜日

チャレンジパッド2を任意のイメージで起動させる方法(root化もあるよ!)

はじめに

この記事で発生したいかなる損害も、私は一切の責任を負いません。

全て自己責任の上で行ってください。

 書いたからな!ヨシ!

概要

チャレンジパッド2(以下CPad2)のUARTを使い、U-Bootの起動コマンドを変えてMagiskが入ったramdiskで起動させroot化出来ました。その詳細な情報を書いていきます。UARTのパターン以外はCPad2以外の要素なので、更なる情報が欲しい場合は適宜調べてください。


もくじ

  1. CPad2のUARTについて
  2. Magiskのramdisk作成
  3. U-Bootからの起動

1. CPad2のUARTについて

 CTab(40TL04)やCPad(40S404)と同様なパターンが基板上に存在します。以下の画像の青線がTX、橙線がRXとなっています。またボーレートは115200、電圧レベルは1.8Vです。自分は3.3Vのシリアルアダプタでレベル変換モジュールを使って接続しています。はんだ付けの下手さは放っておいてください。つながりゃいいんだよ
 接続後、起動時に何らかの入力をシリアルから入れ続けるとU-Bootのコンソールに入ることができます。

2. Magiskのramdisk作成

 Magiskのramdisk作成ですが、自分のCPad2上で行ってみたら裏で「Killed」とログが測れており、うまくいきませんでした。従ってほかのスマホにMagiskManagerを入れ、CPad2のboot.imgにパッチを当てる方法を取りました。CPad2のboot.imgはここのupdate.zipを展開して取得できます。

パッチの当て方

 1. MagiskManagerを起動し上の「インストール」を選択



 2. 表示されたダイアログの「インストール」を選択後、「Select and Patch a File」を選択し、CPad2のboot.imgを選択 



その後、パッチされたboot.imgをmkbootimgを使い展開して終了です。

3. U-Bootからの起動

 標準状態のCPad2ではbootcmd=mrvlbootとなっています。すべての環境変数はこのようになっており、mrvlbootのソースはこれです。CPad2のmrvlbootではkernel、ramdiskのロード時にRSAのチェックが入るようになっているのでそれらを直接書き換えても動作はしません。しかし、mrvlbootの実態はソースを読むとわかる通り、実行コマンドの文字列を生成してそれを実行するものとなっています。そのため実行コマンドを自分で組み立てれば自由自在です。
 自分はSDカードにFAT16の第一パーティションを作り、その中に2.で作成したramdiskをramdisk.imgとして置き、bootcmdをこれに変更しました。bootcmdのような環境変数の確認はprintenv、変更はeditenv <編集したい環境変数>、保存はsaveenv(これは直接eMMCに書き込むので十分注意して行ってください)で行えます。

 2022/02/28 追記

mrvlbootで行っていることのメモを共有しておきます。

https://gist.github.com/Mirenk/7cb24e7fe1c162caa8f20f32a49771ca

mrvlbootではhandle_dtbが宣言されていますが、実際にCPad向けにコンパイルした際はこちらが実装となります。BR向けでは3.でのコマンドで問題なく動いてしまうのですが、BSでは画面が映らなくなってしまいます。したがって、メモのコマンドを行わなければなりません。BRだった場合もメモに沿うことをおすすめします。



2019年3月28日木曜日

ELF弄りメモ Part.1 ~各セクションの分割~

Part0に書いたようにELFファイルはセクションごとに役割が決まってるので、それごとに分けてあげた方が弄りやすいのではと思ったので分割してみることにしました。分割するためにこのようなプログラムを書きました。これを書いたときに躓いたことを記しておきます。

0. 型

次項から構造体を書いていきますが、それに使われている型は以下の通りです。
/* 32-bit ELF base types. */
typedef __u32 Elf32_Addr;
typedef __u16 Elf32_Half;
typedef __u32 Elf32_Off;
typedef __s32 Elf32_Sword;
typedef __u32 Elf32_Word;

/* 64-bit ELF base types. */
typedef __u64 Elf64_Addr;
typedef __u16 Elf64_Half;
typedef __s16 Elf64_SHalf;
typedef __u64 Elf64_Off;
typedef __s32 Elf64_Sword;
typedef __u32 Elf64_Word;
typedef __u64 Elf64_Xword;
typedef __s64 Elf64_Sxword;

1. ELFヘッダ

elf.hによって以下のように定義されています。
typedef struct elf32_hdr{
  unsigned char e_ident[EI_NIDENT];
  Elf32_Half e_type;
  Elf32_Half e_machine;
  Elf32_Word e_version;
  Elf32_Addr e_entry;  /* Entry point */
  Elf32_Off e_phoff;
  Elf32_Off e_shoff;
  Elf32_Word e_flags;
  Elf32_Half e_ehsize;
  Elf32_Half e_phentsize;
  Elf32_Half e_phnum;
  Elf32_Half e_shentsize;
  Elf32_Half e_shnum;
  Elf32_Half e_shstrndx;
} Elf32_Ehdr;

typedef struct elf64_hdr {
  unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */
  Elf64_Half e_type;
  Elf64_Half e_machine;
  Elf64_Word e_version;
  Elf64_Addr e_entry;  /* Entry point virtual address */
  Elf64_Off e_phoff;  /* Program header table file offset */
  Elf64_Off e_shoff;  /* Section header table file offset */
  Elf64_Word e_flags;
  Elf64_Half e_ehsize;
  Elf64_Half e_phentsize;
  Elf64_Half e_phnum;
  Elf64_Half e_shentsize;
  Elf64_Half e_shnum;
  Elf64_Half e_shstrndx;
} Elf64_Ehdr;
ELFのマジックは0x7fELFで、次に32bitなら0x01、64bitなら0x02が来ます。私は5バイト分読み込んでELFファイルであるか、32ビットか64ビットであるかを判定しました。
他のメンバはPart.0の参考サイトが役にたちます。
個人的に記しておきたいのはe_shstrndxで、これはセクションヘッダの文字列セクションがセクションの何番目かを示しています。したがって後述するセクションヘッダテーブルをセクションヘッダの配列として扱い、これを使うことで簡単にアクセスできます。

2. セクションヘッダ

以下のように定義されています。
typedef struct elf32_shdr {
  Elf32_Word sh_name;
  Elf32_Word sh_type;
  Elf32_Word sh_flags;
  Elf32_Addr sh_addr;
  Elf32_Off sh_offset;
  Elf32_Word sh_size;
  Elf32_Word sh_link;
  Elf32_Word sh_info;
  Elf32_Word sh_addralign;
  Elf32_Word sh_entsize;
} Elf32_Shdr;

typedef struct elf64_shdr {
  Elf64_Word sh_name;  /* Section name, index in string tbl */
  Elf64_Word sh_type;  /* Type of section */
  Elf64_Xword sh_flags;  /* Miscellaneous section attributes */
  Elf64_Addr sh_addr;  /* Section virtual addr at execution */
  Elf64_Off sh_offset;  /* Section file offset */
  Elf64_Xword sh_size;  /* Size of section in bytes */
  Elf64_Word sh_link;  /* Index of another section */
  Elf64_Word sh_info;  /* Additional section information */
  Elf64_Xword sh_addralign; /* Section alignment */
  Elf64_Xword sh_entsize; /* Entry size if section holds table */
} Elf64_Shdr;
ここでつまずいたのは各セクション名の取得です。sh_nameはインデックス値を保持していますが、このインデックス値は.shstrtab先頭から目的の文字列の先頭までのバイト数で、文字列は0x00までです。この項がわかりやすいです。
コードで書くならe_shstrndx番目のセクションヘッダを読み込み、そのsh_offset + 任意のセクションヘッダのsh_nameで名前が取得できます。

いかがでしょうか

自分メモ感が強いので読みにくくてすいません。分割で結構重かったのでやる気が失せかけていますが、次は.dynamicや.sym、.rel/.relaの構造を見ていきたいと思っています。その後セクションを弄るPythonコードをそれぞれ書き、ヘッダ類調整して固めて動作確認、Pythonコードリファクタリングを行いたいと思っています。先が長い…

ELF弄りメモ Part.0 ~事前調査編~

耳がとんがってる妖精でも爆発するやつでもない、ELFファイル弄りです。
軽く弄って闇鍋に突っ込もうと思ってたんですけど、軽く弄れなかったので別記事で書くことになった次第です。自分で解釈したこと、弄ってみたこと中心に書いていきます。

やりたいこと

既存のELF実行ファイルに共有ライブラリ参照を追加し、そのライブラリの関数を実行する。

まずELFって?

Executable and Linkable Format(実行可能でリンク可能なフォーマット)の略。LinuxだけでなくBSDとかにも使われてるらしい。Linuxの実行ファイルや共有オブジェクト(.so)の形式はこれ。

構造 

図1 ELFファイルの構造(簡略)
ELFファイルは図1のような構造をしています。詳しい構造はこのスライドサイトが参考になります。
プログラムヘッダはセグメント毎、セクションヘッダはセクション毎に構造体を持っていて、それの塊がテーブルです。構造体の定義はLinuxの場合/usr/include/linux/elf.hにあるはずです。
セクションはそれぞれ役割があります。 またセクションは増えたり減ったりするためセクションヘッダを見ないとだめそうです。

かせつ

 以下のように考えています。
.interp、.shstrtab以外をうまく弄ればできそう?
.dynstrに読み込みたいライブラリ名と関数の文字列を書き込んで、.hashと.dynsymをそれに合わせてうまく描き替える
PLT→GOTもうまくやれるようにして.textから呼び出す
最後にヘッダ類を修正する

その他の参考サイト

http://warabanshi.hatenablog.com/archive/category/ELF
https://web.archive.org/web/20170607001117/http://www.hyuki.com:80/yukiwiki/wiki.cgi?WhirlwindTutorialOnCreatingReallyTeensyElfExecutablesForLinux



2019年3月21日木曜日

闇鍋(個人的雑多メモ)

なにもわからん!

完全に個人用なので読みやすさ度外視してます。こんなのでも読んでくれて間違いを指摘してくれる神がいるなら泣いて喜びますのでコメントでお願いします。

移植関係

Linuxカーネル関係

デバッグ

kgdbを使うらしい(未検証、参考サイト(原文))

コードリーディング

Eclipseだと便利そう?(参考サイト)
今使ってるVSCodeだとIntelliSenceだよりっぽい(参考サイト)

ドライバ/Device Tree

Device Treeはここのサイトがわかりやすかった。

Androidポート

kernel/configs以下にandroid-*.cfgというファイルがあるが、これをデバイス固有のdefconfigに混ぜることによってできる。
kernel/configs/android-fetch-configs.sh で最新の泥defconfigの元がもらえる。
scripts/kconfig/merge_config.sh で複数のconfigを混ぜて.configにしてくれる。
参考サイト:公式ドキュメント

HAL(HIDL込)

Default HAL(*.default.soのソースコード)は/hardware/libhardware/modules以下にある。
HIDLはFrameworkとHALを繋ぐもの。Oreo以降に実装されている。動作モードは/system/manifest.xmlで記述する。
hwbinderモード:FrameworkとHALを別プロセスで動作させる。/system側に*-impl.so、/vendor側に*-service.soが必要。Treble化する(/systemと/vendorを分ける)場合はこのモード。
passthroughモード:FramoworkとHALを同じプロセスで動作させる。/systemに-impl.soが必要。泥ポートするときTreble化しないならこっちで開発を進めた方が良さそう。
参考サイト:公式ドキュメントスライド

ビルド関係

Oreo以降は/system(Trebleなら/vendorも)のearly mountが必要。Linux KernelのDevice Treeで記述する(こんな感じ)。
HIDLは上記の必要なのを記述してあげる(こんな感じ)。
BoardConfig.mkでandroidboot.hardware=<ハードウェア名> でro.hardwareを指定すると、init.<ハードウェア名>.rcが読み込めるようになる。
BOARD_<パーティション名>IMAGE_PARTITION_SIZEはbyte換算。

AOSP系のみ

AndroidProducts.mkにaosp_なんちゃら.mkを書く(aospじゃなくても可)
PRODUCT_DEVICEはdevice configurationのフォルダ名と同じくする

りばーすえんナントカ

smali弄り

ここにはるろいど氏がいい感じにまとめてくれてます、感謝。

invoke系の違いは
invoke-static:staticメソッド呼ぶ
invoke-direct:privateメソッド呼び出し、コンストラクタ呼び出し(<init>って書いてあるやつ)で使われる
invoke-virtual:publicメソッド呼ぶ
なのかなって思ってる。これ考えて1からsmali書くよりアプリ書いてばらして移植が手っ取り早いと思う。
あと引数レジスタp0はthisで、p1から引数になる。引数レジスタを通常レジスタのように使いまわすことも可能。
iget-objectのレジスタは宛先、呼び元の順

ダークELF

Part.0 ~事前調査編~
Part.1 ~各セクションの分割~

2019年1月25日金曜日

例のグラボをminiPCIeのeGPUで使ってみる(17,000円)



中高生に需要ありそう
巷で話題の「映像出力なしのマイニング用RX470」(通称例のグラボ)をタイトルの通りやってみました。
結果としては動かしたかった方のPC(Dynabook KIRA L93/TG)では動かず、前使っていたPC(FRNX516、Clevoのベアボーン)では動作しました。ですがフリーズしたりと不安定です。
また、miniPCIeスロット、Key Eのm.2スロットはPCIe x2での動作となり、RX470の実力をフルに出せません。
上記のことよりオススメはしません。が、ロマンをお持ちの方のために書き残しておきます。

もくじ

  1. よういしたもの
  2. せつぞく
  3. せいのう
  4. さいごに

1.よういしたもの


・RADEON RX 470 8G GDDR5 MINING QUAD

言わずもがな、例のグラボです。お近くのパソコン工房またはネット通販でどうぞ。全国に転がっているらしいので、ネット通販の際は近くのところを選びましょう(1敗)。
また、私はRX480のBIOSを焼いて使っています。ATiFlashのポート番号引数(?)は0で出来ました。7106円

・EXP GDC

miniPCIeをPCIeに変換してくれるものです。私はBanggoodで購入しました。5976円

・PC用電源

RX470の消費電力は170W程度であり、グラボに電源供給するだけなのでアマゾンの上の方にあった350W電源を使用しました。3191円

2.せつぞく

電源とEXP GDCの説明書を読めばすんなりできました。合わない端子は物理的に入らないようになってるため、間違えることもないと思います。
他サイトでは、補助電源をEXP GDCの横端子から引き出して接続する、といったことが書かれていましたが、そのケーブルは同梱されていなかったので電源を直接つないでいます。

3.せいのう

GPU割り当てが面倒臭くなかったFFベンチと、個人的に気になったSteam VRベンチのスクショを張り付けておきます。

SteamVRのGPUが内蔵になっているのは、ランチャーを割り当てていないためです。ベンチ自体はRX470で走っています。
まぁそこそこのゲームは動くんじゃないんですかね、私はゲームはしないのでわかりませんが…

4.さいごに

ゲームするならデスクトップ!!!!!!!!!

 

予定としては、今使っているメイン兼おえかきノートPCに接続すれば、クリスタの3D機能やCADが快適に動かせて良いのではと思って実行したのですが、はじめに書いた通り動きませんでした。
外付けグラボは小さいPCにつけて普段は持ち歩き、家で必要なときは繋いでパワーアップといった用途が一番合っていると私は思うため、15インチノートでやる必要性はないと感じています。それならもう少しお金出して自作作ればその投資以上のスペックが得られると思います。
最近ではThunderBolt3の外付けGPUが出ているため、ThunderBolt接続ができるならそちらを強くお勧めします。

結論としてこの手法は
「現在販売されているノートPCでは移行先がみつからないノートPCで、グラフィックを少し高めたいが、ThunderBolt接続はできない。お金ならある。冒険大好き!」
って人には最適だと思います。おしまい。