Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@ android {
path "CMakeLists.txt"
}
}
dataBinding {
addDefaultAdapters true
enabled true
enabledForTests true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {
Expand Down
227 changes: 98 additions & 129 deletions app/src/main/java/pers/turing/technician/fasthookapp/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,197 +1,137 @@
package pers.turing.technician.fasthookapp;

import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ObservableField;
import android.graphics.Color;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import pers.turing.technician.fasthook.FastHookManager;
import pers.turing.technician.fasthookapp.hook.Test;

public class MainActivity extends AppCompatActivity {

TextView mConstructorText;
TextView mDirectText;
TextView mVirtualText;
TextView mStaticText;
TextView mNativeDirectText;
TextView mNativeVirtualText;
TextView mNativeStaticText;
TextView mSystemText;
TextView mHiddenText;

String mConstructorTextString;
String mDirectTextString;
String mVirtualTextString;
String mStaticTextString;
String mNativeDirectTextString;
String mNativeVirtualTextString;
String mNativeStaticTextString;
String mSystemTextString;
String mHiddenTextString;

Button mRewriteMode;
Button mReplaceMode;

Context mContext;
private MainActivityBinding binding;
private final TestModel model = new TestModel();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mContext = this;

mConstructorText = findViewById(R.id.constructor_test);
mDirectText = findViewById(R.id.direct_test);
mVirtualText = findViewById(R.id.virtual_test);
mStaticText = findViewById(R.id.static_test);
mNativeDirectText = findViewById(R.id.native_direct_test);
mNativeVirtualText = findViewById(R.id.native_virtual_test);
mNativeStaticText = findViewById(R.id.native_static_test);
mSystemText = findViewById(R.id.system_test);
mHiddenText = findViewById(R.id.hidden_test);

mConstructorTextString = mConstructorText.getText().toString();
mDirectTextString = mDirectText.getText().toString();
mVirtualTextString = mVirtualText.getText().toString();
mStaticTextString = mStaticText.getText().toString();
mNativeDirectTextString = mNativeDirectText.getText().toString();
mNativeVirtualTextString = mNativeVirtualText.getText().toString();
mNativeStaticTextString = mNativeStaticText.getText().toString();
mSystemTextString = mSystemText.getText().toString();
mHiddenTextString = mHiddenText.getText().toString();
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setModel(model);

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
mHiddenText.setVisibility(View.VISIBLE);
binding.hiddenTest.setVisibility(View.VISIBLE);
}else {
mHiddenText.setVisibility(View.GONE);
binding.hiddenTest.setVisibility(View.GONE);
}

mRewriteMode = findViewById(R.id.button_rewrite);
mReplaceMode = findViewById(R.id.button_replace);

mRewriteMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!MainApplication.mTest) {
MainApplication.mTest = true;
FastHookManager.doHook("pers.turing.technician.fasthookapp.hook.HookInfo",null,null,null,null,false);
test("1:");
}else {
Toast toast = Toast.makeText(mContext,"already hook,please restart app to test!",Toast.LENGTH_SHORT);
toast.show();
}
binding.buttonRewrite.setOnClickListener(view -> {
if(!MainApplication.mTest) {
MainApplication.mTest = true;
FastHookManager.doHook("pers.turing.technician.fasthookapp.hook.HookInfo",
null,
null,
null,
null,
false);
test("1:");
}else {
Toast toast = Toast.makeText(getBaseContext(),"already hook,please restart app to test!",Toast.LENGTH_SHORT);
toast.show();
}
});

mReplaceMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!MainApplication.mTest) {
MainApplication.mTest = true;
FastHookManager.doHook("pers.turing.technician.fasthookapp.hook.HookInfo2",null,null,null,null,false);
test("2:");
}else {
Toast toast = Toast.makeText(mContext,"already hook,please restart app to test!",Toast.LENGTH_SHORT);
toast.show();
}
binding.buttonReplace.setOnClickListener(view -> {
if(!MainApplication.mTest) {
MainApplication.mTest = true;
FastHookManager.doHook("pers.turing.technician.fasthookapp.hook.HookInfo2",null,null,null,null,false);
test("2:");
}else {
Toast toast = Toast.makeText(getBaseContext(),"already hook,please restart app to test!",Toast.LENGTH_SHORT);
toast.show();
}
});
}

public void reset() {
mConstructorText.setText(mConstructorTextString);
mDirectText.setText(mDirectTextString);
mVirtualText.setText(mVirtualTextString);
mStaticText.setText(mStaticTextString);
mNativeDirectText.setText(mNativeDirectTextString);
mNativeVirtualText.setText(mNativeVirtualTextString);
mNativeStaticText.setText(mNativeStaticTextString);
}

public void test(String mode) {
reset();
model.reset();
String systemMessage = model.systemMethod.get();
String hiddenText = model.hiddenApi.get();

Test test = new Test(mConstructorText.getText().toString());
mConstructorText.setText(mode + test.mMessage);
Test test = new Test(binding.constructorTest.getText().toString());
binding.constructorTest.setText(mode + test.mMessage);

if(test.mMessage.contains("hook param")) {
mConstructorText.setTextColor(Color.GREEN);
binding.constructorTest.setTextColor(Color.GREEN);
}else {
mConstructorText.setTextColor(Color.RED);
binding.constructorTest.setTextColor(Color.RED);
}

String directMessage = mDirectText.getText().toString();
String directMessage = binding.directTest.getText().toString();
directMessage = test.testDirectMethod(directMessage);
mDirectText.setText(mode + directMessage);
binding.directTest.setText(mode + directMessage);
if(directMessage.contains("hook param") && directMessage.contains("hook result")) {
mDirectText.setTextColor(Color.GREEN);
binding.directTest.setTextColor(Color.GREEN);
}else {
mDirectText.setTextColor(Color.RED);
binding.directTest.setTextColor(Color.RED);
}

String virtualMessage = mVirtualText.getText().toString();
String virtualMessage = binding.virtualTest.getText().toString();
virtualMessage = test.testVirtual(virtualMessage);
mVirtualText.setText(mode + virtualMessage);
binding.virtualTest.setText(mode + virtualMessage);
if(virtualMessage.contains("hook param") && virtualMessage.contains("hook result")) {
mVirtualText.setTextColor(Color.GREEN);
binding.virtualTest.setTextColor(Color.GREEN);
}else {
mVirtualText.setTextColor(Color.RED);
binding.virtualTest.setTextColor(Color.RED);
}

String staticMessage = mStaticText.getText().toString();
String staticMessage = binding.staticTest.getText().toString();
staticMessage = Test.testStatic(staticMessage);
mStaticText.setText(mode + staticMessage);
binding.staticTest.setText(mode + staticMessage);
if(staticMessage.contains("hook param") && staticMessage.contains("hook result")) {
mStaticText.setTextColor(Color.GREEN);
binding.staticTest.setTextColor(Color.GREEN);
}else {
mStaticText.setTextColor(Color.RED);
binding.staticTest.setTextColor(Color.RED);
}

String nativeDirectMessage = mNativeDirectText.getText().toString();
String nativeDirectMessage = binding.nativeDirectTest.getText().toString();
nativeDirectMessage = test.testNativeDirectMethod(nativeDirectMessage);
mNativeDirectText.setText(mode + nativeDirectMessage);
binding.nativeDirectTest.setText(mode + nativeDirectMessage);
if(nativeDirectMessage.contains("hook param") && nativeDirectMessage.contains("hook result")) {
mNativeDirectText.setTextColor(Color.GREEN);
binding.nativeDirectTest.setTextColor(Color.GREEN);
}else {
mNativeDirectText.setTextColor(Color.RED);
binding.nativeDirectTest.setTextColor(Color.RED);
}

String nativeVirtualMessage = mNativeVirtualText.getText().toString();
String nativeVirtualMessage = binding.nativeVirtualTest.getText().toString();
nativeVirtualMessage = test.testNativeVirtualMethod(nativeVirtualMessage);
mNativeVirtualText.setText(mode + nativeVirtualMessage);
binding.nativeVirtualTest.setText(mode + nativeVirtualMessage);
if(nativeVirtualMessage.contains("hook param") && nativeVirtualMessage.contains("hook result")) {
mNativeVirtualText.setTextColor(Color.GREEN);
binding.nativeVirtualTest.setTextColor(Color.GREEN);
}else {
mNativeVirtualText.setTextColor(Color.RED);
binding.nativeVirtualTest.setTextColor(Color.RED);
}

String nativeStaticMessage = mNativeStaticText.getText().toString();
String nativeStaticMessage = binding.nativeStaticTest.getText().toString();
nativeStaticMessage = test.testNativeStaticMethod(nativeStaticMessage);
mNativeStaticText.setText(mode + nativeStaticMessage);
binding.nativeStaticTest.setText(mode + nativeStaticMessage);
if(nativeStaticMessage.contains("hook param") && nativeStaticMessage.contains("hook result")) {
mNativeStaticText.setTextColor(Color.GREEN);
binding.nativeStaticTest.setTextColor(Color.GREEN);
}else {
mNativeStaticText.setTextColor(Color.RED);
binding.nativeStaticTest.setTextColor(Color.RED);
}

String systemMessage = mSystemTextString;
mSystemText.setText(systemMessage);
mSystemText.setText(mode + mSystemText.getText());
if(mSystemText.getText().toString().contains("hook param")) {
mSystemText.setTextColor(Color.GREEN);
model.systemMethod.set(mode + systemMessage);
if(binding.systemTest.getText().toString().contains("hook param")) {
binding.systemTest.setTextColor(Color.GREEN);
}else {
mSystemText.setTextColor(Color.RED);
binding.systemTest.setTextColor(Color.RED);
}

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
Expand All @@ -200,16 +140,45 @@ public void test(String mode) {
Class<?> activityClass = Class.forName("dalvik.system.VMRuntime");
Method setHiddenApiExemptions = activityClass.getDeclaredMethod("setHiddenApiExemptions", String[].class);
setHiddenApiExemptions.setAccessible(true);
mHiddenText.setText(setHiddenApiExemptions.getName());
binding.hiddenTest.setText(setHiddenApiExemptions.getName());
}catch (Exception e) {
e.printStackTrace();
}

if(!mHiddenText.getText().equals(mHiddenTextString)) {
mHiddenText.setTextColor(Color.GREEN);
if(!binding.hiddenTest.getText().equals(hiddenText)) {
binding.hiddenTest.setTextColor(Color.GREEN);
}else {
mHiddenText.setTextColor(Color.RED);
binding.hiddenTest.setTextColor(Color.RED);
}
}
}

public static class TestModel {

public ObservableField<String> constructorMethod = new ObservableField<>();
public ObservableField<String> directMethod = new ObservableField<>();
public ObservableField<String> virtualMethod = new ObservableField<>();
public ObservableField<String> staticMethod = new ObservableField<>();
public ObservableField<String> nativeDirectMethod = new ObservableField<>();
public ObservableField<String> nativeVirtualMethod = new ObservableField<>();
public ObservableField<String> nativeStaticMethod = new ObservableField<>();
public ObservableField<String> systemMethod = new ObservableField<>();
public ObservableField<String> hiddenApi = new ObservableField<>();

public TestModel() {
reset();
}

void reset() {
constructorMethod.set("Test ConstructorMethod");
directMethod.set("Test DirectMethod");
virtualMethod.set("Test VirtualMethod");
staticMethod.set("Test StaticMethod");
nativeDirectMethod.set("Test NativeDirectMethod");
nativeVirtualMethod.set("Test NativeVirtualMethod");
nativeStaticMethod.set("Test NativeStaticMethod");
systemMethod.set("Test SystemMethod");
hiddenApi.set("Test HiddenApi");
}
}
}
Loading