Skip to content

Commit

Permalink
v1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Kobold831 committed May 21, 2024
1 parent a2e42e3 commit 5b20c7b
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 45 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,6 @@ android {
}

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])
}
Binary file added app/libs/IDchaLibrary.jar
Binary file not shown.
11 changes: 7 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="jp.co.benesse.dcha.permission.ACCESS_SYSTEM" />

<application
android:icon="@android:mipmap/sym_def_app_icon"
android:label="EasyBLU"
android:theme="@android:style/Theme.Light">
android:theme="@android:style/Theme">

<activity
android:name=".MainActivity"
android:exported="true">
android:exported="true"
android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>

</manifest>
212 changes: 179 additions & 33 deletions app/src/main/java/com/saradabar/easyblu/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,76 +1,139 @@
package com.saradabar.easyblu;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;

import jp.co.benesse.dcha.dchaservice.IDchaService;

public class MainActivity extends Activity {

DataOutputStream dos;
BufferedReader bufferedReader, bufferedReader1;
String str, str2;
StringBuilder stringBuilder;

@Deprecated
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Handler().postDelayed(this::run, 1000);
addText("****************************");
addText("Easy BLUへようこそ!");
addText("");
addText("続行するには、該当する数字を入力してください");
addText("- 1: frp.bin上書きまで実行します。実行後はbootloaderへの再起動が必要になります。");
addText("- 0: 終了");
addText("****************************");
addText(Build.FINGERPRINT);
init();
}

void run() {
stringBuilder = new StringBuilder();
str2 = System.lineSeparator();
void init() {
EditText editText = findViewById(R.id.edit);
editText.setEnabled(true);
Button button = findViewById(R.id.button);
button.setEnabled(true);
button.setOnClickListener(v -> {
switch (editText.getText().toString()) {
case "1":
confirm();
break;
case "0":
finishAffinity();
break;
default:
addText("- 通知: " + editText.getText().toString() + "は実行できません");
break;
}
editText.getEditableText().clear();
});
}

copyAssetsFile(this);
void confirm() {
addText("- 確認: よろしいですか?よろしければ0を入力してください");
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
EditText editText = findViewById(R.id.edit);
if (editText.getText().toString().equals("0")) {
editText.setEnabled(false);
button.setEnabled(false);
addText("- 通知: shrinker実行を起動しました");
addText("- 警告: デバイスには絶対に触れないでください。処理が終了するまでお待ち下さい。");
addText("- 警告: デバイスが再起動した場合は失敗です。起動後に再度実行してください。");
new Handler().postDelayed(() -> {
String result = shrinker();
if (result.contains("result 49")) {
addText("- 通知: 成功しました。");
addText("- 通知: frp.bin上書きを起動しました");
new Handler().postDelayed(this::overwriteFrp, 5000);
} else {
addText("- 通知: 失敗しました。再度実行します。");
new Handler().postDelayed(this::retry, 5000);
}
}, 5000);
} else {
addText("- 通知: この操作はキャンセルされました");
init();
}
editText.getEditableText().clear();
});
}

init();
String shrinker() {
stringBuilder = new StringBuilder();
addText("- 通知: " + getFilesDir() + "にファイルをコピーしています。");
copyAssetsFile(this);
sh();
addText("- 通知: 権限を設定しています。");
execute("chmod 770 " + new File(getFilesDir(), "shrinker").getAbsolutePath());
execute("/data/data/com.saradabar.easyblu/files/shrinker");
String text = getText().toString();

if (text.contains("result 49")) {
Log.e("TAG", text);
Log.e("TAG", "成功");
TextView textView = findViewById(R.id.text);
textView.setText("成功しました");
} else {
Log.e("TAG", text);
Log.e("TAG", "失敗");
b();
}
addText("- 結果:");
addText(text);
return text;
}

void b() {
void retry() {
execute("/data/data/com.saradabar.easyblu/files/shrinker");
String text = getText().toString();

addText("- 結果:");
addText(text);
if (text.contains("result 49")) {
Log.e("TAG", text);
Log.e("TAG", "成功");
TextView textView = findViewById(R.id.text);
textView.setText("成功しました");
addText("- 通知: 成功しました。");
addText("- 通知: frp.bin上書きを起動しました");
new Handler().postDelayed(this::overwriteFrp, 5000);
} else {
Log.e("TAG", text);
Log.e("TAG", "失敗");
b();
addText("- 通知: 失敗しました。再度実行します。");
new Handler().postDelayed(this::retry, 5000);
}
}

public static void copyAssetsFile(Context context) {
private void copyAssetsFile(Context context) {
try {
InputStream inputStream = context.getAssets().open("shrinker");
FileOutputStream fileOutputStream = new FileOutputStream(new File(context.getFilesDir(), "shrinker"), false);
Expand All @@ -85,7 +148,7 @@ public static void copyAssetsFile(Context context) {
}
}

public void init() {
private void sh() {
try {
Process process = Runtime.getRuntime().exec("sh");
dos = new DataOutputStream(process.getOutputStream());
Expand All @@ -101,9 +164,9 @@ public StringBuilder getText() {
stringBuilder.setLength(0);
while (i <= 500) {
if (bufferedReader.ready()) {
str = bufferedReader.readLine();
String str = bufferedReader.readLine();
stringBuilder.append(str);
stringBuilder.append(str2);
stringBuilder.append(System.lineSeparator());

if (str != null) {
i = 0;
Expand Down Expand Up @@ -132,4 +195,87 @@ public void execute(String str) {
} catch (Exception ignored) {
}
}

void overwriteFrp() {
addText("- 通知: DchaServiceにバインドしています。");
if (!bindService(new Intent("jp.co.benesse.dcha.dchaservice.DchaService").setPackage("jp.co.benesse.dcha.dchaservice"), new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
IDchaService mDchaService = IDchaService.Stub.asInterface(iBinder);
addText("- 通知: /dev/block/by-name/frpをコピーしています。");
try {
mDchaService.copyUpdateImage("/dev/block/by-name/frp", "/cache/../sdcard/frp.bin");
} catch (Exception e) {
addText("- 通知: エラーが発生しました。");
addText(e.toString());
init();
return;
}

try {
File file = new File(Environment.getExternalStorageDirectory(), "frp.bin");
DataInputStream dataInStream = new DataInputStream(new BufferedInputStream(new FileInputStream(new File(Environment.getExternalStorageDirectory(), "frp.bin"))));
DataOutputStream dataOutStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "tmp.bin"))));

int[] tmpHex = new int[(int) file.length()];
int i = 0;

addText("- 通知: frp.binファイルサイズ-> " + file.length());

while (true) {
int b = dataInStream.read();

if (b == -1) {
break;
}

tmpHex[i] = b;
i++;
}

tmpHex[tmpHex.length - 1] = 1;

for (int q : tmpHex) {
dataOutStream.write(q);
}

addText("- 通知: 読込データ-> " + Arrays.toString(tmpHex));

dataInStream.close();
dataOutStream.close();

addText("- 通知: frp.binの修正が完了しました。");
addText("- 通知: frp.binを/dev/block/by-name/frpに上書きしています。");
mDchaService.copyUpdateImage("/sdcard/tmp.bin", "/cache/../dev/block/by-name/frp");

addText("- 通知: すべての操作が終了しました。");
addText("- 通知: コンピュータでadb reboot bootloaderを実行してブートローダをアンロックしてください。");
} catch (IOException | RemoteException e) {
addText("- 通知: エラーが発生しました。");
addText(e.toString());
init();
}
}

@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}, Context.BIND_AUTO_CREATE)) {
addText("- 通知: DchaServiceへの接続に失敗しました。");
init();
}
}

void addText(String str) {
TextView textView = findViewById(R.id.text);
if (str.isEmpty()) {
textView.append(System.lineSeparator());
} else {
textView.append(str + System.lineSeparator());
}
ScrollView scrollView = findViewById(R.id.scroll);
scrollView.fullScroll(View.FOCUS_DOWN);
scrollView.post(() -> scrollView.fullScroll(ScrollView.FOCUS_DOWN));
}
}
39 changes: 31 additions & 8 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,38 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000">
android:layout_height="match_parent">

<TextView
android:id="@+id/text"
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#FFFFFF"
android:text="絶対にデバイスに触れないでください!\n画面が切り替わるまでお待ち下さい" />
android:layout_height="0dp"
android:layout_weight="1">

<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</ScrollView>

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
android:id="@+id/edit"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:inputType="number"
android:hint="コマンド入力" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="コマンド実行" />
</LinearLayout>
</LinearLayout>
Binary file removed docs/debug/app-debug.apk
Binary file not shown.
Binary file added docs/images/image-01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 5b20c7b

Please sign in to comment.