Cleanup and GUI

This commit is contained in:
Michael Wain 2024-10-09 16:02:22 +03:00
parent 757fad0f33
commit 38a9fd010f
12 changed files with 106 additions and 63 deletions

View File

@ -58,14 +58,17 @@ task deleteLibs(type: Delete) {
preBuild.dependsOn downloadx86*/
dependencies {
implementation libs.okhttp
implementation libs.commons.codec
implementation libs.ktsh
implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
implementation libs.room.runtime
implementation "androidx.room:room-rxjava3:2.6.1"
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
compileOnly 'org.projectlombok:lombok:1.18.34'
annotationProcessor 'org.projectlombok:lombok:1.18.34'
annotationProcessor libs.room.compiler
testImplementation libs.junit
androidTestImplementation libs.ext.junit

View File

@ -21,7 +21,7 @@
tools:targetApi="34"
tools:replace="android:allowBackup">
<activity
android:name=".MainActivity"
android:name=".activity.MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true">

View File

@ -1,15 +1,17 @@
package com.alterdekim.fridaapp;
package com.alterdekim.fridaapp.activity;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.net.VpnService;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
@ -21,18 +23,26 @@ import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.room.Room;
import com.alterdekim.fridaapp.R;
import com.alterdekim.fridaapp.controller.ControllerId;
import com.alterdekim.fridaapp.controller.ControllerManager;
import com.alterdekim.fridaapp.controller.MainActivityController;
import com.alterdekim.fridaapp.util.Util;
import com.alterdekim.fridaapp.room.AppDatabase;
import com.alterdekim.fridaapp.room.Config;
import com.alterdekim.fridaapp.service.FridaService;
import com.google.android.material.switchmaterial.SwitchMaterial;
import org.apache.commons.codec.binary.Base32;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
private static final String TAG = MainActivity.class.getSimpleName();
private AppDatabase db;
private MainActivityController controller;
ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
@ -62,12 +72,18 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
this.db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "def-db").build();
ControllerManager.putController(new MainActivityController());
this.controller = (MainActivityController) ControllerManager.getController(ControllerId.MainActivityController);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
this.controller.onCreateGUI(this);
findViewById(R.id.addConfig).setOnClickListener(v -> {
PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(MainActivity.this);
@ -75,10 +91,25 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI
popup.show();
});
LayoutInflater inflater = getLayoutInflater();
for( Config config : db.userDao().getAll() ) {
View myLayout = inflater.inflate(R.layout.single_config, mainLayout, false);
LinearLayout cfg_list = (LinearLayout) findViewById(R.id.config_list);
LayoutInflater inflater = getLayoutInflater();
Iterator<Config> iter = db.userDao().getAll().iterator();
while( iter.hasNext() ) {
Config config = iter.next();
View cfg_instance = inflater.inflate(R.layout.single_config, cfg_list, false);
TextView view_name = (TextView) cfg_instance.findViewById(R.id.config_name);
SwitchMaterial view_switch = (SwitchMaterial) cfg_instance.findViewById(R.id.config_switch);
//view_switch.setUseMaterialThemeColors(true);
view_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Log.i(TAG, "onCheckedChanged " + b);
}
});
view_name.setText(config.title);
if( iter.hasNext() ) inflater.inflate(R.layout.single_divider, cfg_list, false);
}
}

View File

@ -0,0 +1,5 @@
package com.alterdekim.fridaapp.controller;
public enum ControllerId {
MainActivityController
}

View File

@ -0,0 +1,17 @@
package com.alterdekim.fridaapp.controller;
import java.util.HashMap;
import java.util.Map;
public class ControllerManager {
private static final Map<ControllerId, IController> map = new HashMap<>();
public static void putController(IController controller) {
if( !map.containsKey(controller.getControllerId()) ) map.put(controller.getControllerId(), controller);
}
public static IController getController(ControllerId id) {
return map.get(id);
}
}

View File

@ -0,0 +1,8 @@
package com.alterdekim.fridaapp.controller;
import androidx.appcompat.app.AppCompatActivity;
public interface IController {
ControllerId getControllerId();
void onCreateGUI(AppCompatActivity activity);
}

View File

@ -0,0 +1,21 @@
package com.alterdekim.fridaapp.controller;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import com.alterdekim.fridaapp.room.AppDatabase;
public class MainActivityController implements IController {
private AppDatabase db;
@Override
public ControllerId getControllerId() {
return ControllerId.MainActivityController;
}
@Override
public void onCreateGUI(AppCompatActivity activity) {
this.db = Room.databaseBuilder(activity.getApplicationContext(), AppDatabase.class, "def-db").build();
}
}

View File

@ -4,19 +4,21 @@ import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@Entity
@RequiredArgsConstructor
@Getter
@Setter
public class Config {
@PrimaryKey
public int uid;
@ColumnInfo(name = "title")
public String title;
public final String title;
@ColumnInfo(name = "data_b32")
public String data_b32;
public Config(String title, String data_b32) {
this.title = title;
this.data_b32 = data_b32;
}
public final String data_b32;
}

View File

@ -6,16 +6,6 @@ import android.net.VpnService;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import com.alterdekim.frida.FridaLib;
import com.alterdekim.fridaapp.R;
import java.io.IOException;
import java.util.Objects;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class FridaService extends VpnService {
private static final String TAG = FridaService.class.getSimpleName();
private static final String VPN_ADDRESS = "10.66.66.6"; // Only IPv4 support for now
@ -28,42 +18,16 @@ public class FridaService extends VpnService {
public void onCreate() {
setupVPN();
Log.i(TAG, "Started");
// .detachFd()
try {
Thread t = new Thread(new NativeBinaryConnection(vpnInterface.dup().detachFd(), getApplicationContext().getApplicationInfo().nativeLibraryDir));
t.start();
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://google.com")
.build();
try {
try (Response response = client.newCall(request).execute()) {
// Log.i(TAG, "Response code: " + response.code());
if (response.body() != null) {
// Log.i(TAG, "Response body: " + response.body().string());
} else {
// Log.i(TAG, "Response body: null");
}
}
} catch (IOException e) {
Log.e(TAG, Objects.requireNonNull(e.getMessage()));
}
}
}).start();
}
private void setupVPN() {
try {
//if (vpnInterface == null) {
Builder builder = new Builder();
builder.setMtu(1400);
builder.addAddress(VPN_ADDRESS, 24);
@ -71,10 +35,7 @@ public class FridaService extends VpnService {
builder.addDnsServer("8.8.8.8");
//builder.addAllowedApplication();
builder.addDisallowedApplication("com.alterdekim.fridaapp");
// .setSession(getString(R.string.app_name))
// .setConfigureIntent(pendingIntent)
vpnInterface = builder.establish();
// }
} catch (Exception e) {
Log.e(TAG, "error", e);
}

View File

@ -3,11 +3,6 @@ package com.alterdekim.fridaapp.service;
import android.util.Log;
import com.alterdekim.frida.FridaLib;
import com.jaredrummler.ktsh.Shell;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
public class NativeBinaryConnection implements Runnable {
private static final String TAG = NativeBinaryConnection.class.getSimpleName();

View File

@ -1,4 +1,4 @@
package com.alterdekim.fridaapp;
package com.alterdekim.fridaapp.util;
import android.content.Context;
import android.database.Cursor;

View File

@ -5,7 +5,7 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
tools:context=".activity.MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"