Skip to content

Commit

Permalink
Update V3
Browse files Browse the repository at this point in the history
  • Loading branch information
abcz316 committed Nov 11, 2021
1 parent fd07dbe commit af1c6c5
Show file tree
Hide file tree
Showing 17 changed files with 281 additions and 74 deletions.
48 changes: 40 additions & 8 deletions PermissionManager/app/src/main/cpp/root.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ Java_com_linux_permissionmanager_MainActivity_installSuTools(
jobject /* this */,
jlong rootKey,
jstring basePath,
jstring suToolsFilePath) {
jstring suToolsFilePath,
jstring suToolsFileFolderHeadFlags) {

const char *str1 = env->GetStringUTFChars(basePath, 0);
string strBasePath= str1;
Expand All @@ -154,11 +155,15 @@ Java_com_linux_permissionmanager_MainActivity_installSuTools(
string strSuFilePath= str1;
env->ReleaseStringUTFChars(suToolsFilePath, str1);

str1 = env->GetStringUTFChars(suToolsFileFolderHeadFlags, 0);
string strSuToolsFileFolderHeadFlags= str1;
env->ReleaseStringUTFChars(suToolsFileFolderHeadFlags, str1);

stringstream sstr;

//安装su工具套件
std::string su_hidden_path;
int install_su_tools_ret = safe_install_su_tools(rootKey, strBasePath.c_str(), su_hidden_path);
int install_su_tools_ret = safe_install_su_tools(rootKey, strBasePath.c_str(), su_hidden_path, strSuToolsFileFolderHeadFlags.c_str());
sstr << "install_su_tools ret val:" << install_su_tools_ret<<", su_hidden_path:" << su_hidden_path << std::endl;

if (install_su_tools_ret == -504) {
Expand All @@ -169,7 +174,7 @@ Java_com_linux_permissionmanager_MainActivity_installSuTools(
sstr << "safe_run_normal_cmd cp_ret val:" <<cp_ret;
return env->NewStringUTF(sstr.str().c_str());
}
install_su_tools_ret = safe_install_su_tools(rootKey, strBasePath.c_str(), su_hidden_path);
install_su_tools_ret = safe_install_su_tools(rootKey, strBasePath.c_str(), su_hidden_path, strSuToolsFileFolderHeadFlags.c_str());
sstr << "install_su_tools ret val:" << install_su_tools_ret<<", su_hidden_path:" << su_hidden_path << std::endl;
}
if (install_su_tools_ret != 0) {
Expand All @@ -183,15 +188,20 @@ Java_com_linux_permissionmanager_MainActivity_uninstallSuTools(
JNIEnv* env,
jobject /* this */,
jlong rootKey,
jstring basePath) {
jstring basePath,
jstring suToolsFileFolderHeadFlags) {

const char *str1 = env->GetStringUTFChars(basePath, 0);
string strBasePath= str1;
env->ReleaseStringUTFChars(basePath, str1);

str1 = env->GetStringUTFChars(suToolsFileFolderHeadFlags, 0);
string strSuToolsFileFolderHeadFlags= str1;
env->ReleaseStringUTFChars(suToolsFileFolderHeadFlags, str1);

stringstream sstr;

int uninstall_su_tools_ret = safe_uninstall_su_tools(rootKey, strBasePath.c_str());
int uninstall_su_tools_ret = safe_uninstall_su_tools(rootKey, strBasePath.c_str(), strSuToolsFileFolderHeadFlags.c_str());
sstr << "uninstallSuTools ret val:" << uninstall_su_tools_ret << std::endl;

if (uninstall_su_tools_ret != 0) {
Expand All @@ -201,12 +211,28 @@ Java_com_linux_permissionmanager_MainActivity_uninstallSuTools(
return env->NewStringUTF(sstr.str().c_str());
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_linux_permissionmanager_MainActivity_killAdbdProcess(
JNIEnv* env,
jobject /* this */,
jlong rootKey) {

stringstream sstr;
int kill_adbd = safe_kill_adbd_process(rootKey);
sstr << "kill_adbd ret val:" << kill_adbd << std::endl;
if (kill_adbd != 0) {
return env->NewStringUTF(sstr.str().c_str());
}
sstr << "killAdbdProcess done.";
return env->NewStringUTF(sstr.str().c_str());
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_linux_permissionmanager_MainActivity_autoSuEnvInject(
JNIEnv* env,
jobject /* this */,
jlong rootKey,
jstring targetProcessCmdline,
jstring basePath) {
jstring basePath,
jstring suToolsFileFolderHeadFlags) {

const char *str1 = env->GetStringUTFChars(targetProcessCmdline, 0);
string strTargetProcessCmdline= str1;
Expand All @@ -216,6 +242,12 @@ Java_com_linux_permissionmanager_MainActivity_autoSuEnvInject(
string strBasePath= str1;
env->ReleaseStringUTFChars(basePath, str1);


str1 = env->GetStringUTFChars(suToolsFileFolderHeadFlags, 0);
string strSuToolsFileFolderHeadFlags= str1;
env->ReleaseStringUTFChars(suToolsFileFolderHeadFlags, str1);


stringstream sstr;

//杀光所有历史进程
Expand All @@ -231,15 +263,15 @@ Java_com_linux_permissionmanager_MainActivity_autoSuEnvInject(
kill_cmd += std::to_string(t);
kill_cmd += ";";
}
int kill_ret = run_normal_cmd(rootKey, kill_cmd.c_str());
int kill_ret = safe_run_normal_cmd(rootKey, kill_cmd.c_str());
sstr << "kill_ret ret val:"<< kill_ret << std::endl;
if (kill_ret != 0) {
return env->NewStringUTF(sstr.str().c_str());
}

//注入su环境变量到指定进程
std::string su_hidden_path;
int install_su_tools_ret = safe_install_su_tools(rootKey, strBasePath.c_str(), su_hidden_path);
int install_su_tools_ret = safe_install_su_tools(rootKey, strBasePath.c_str(), su_hidden_path, strSuToolsFileFolderHeadFlags.c_str());
sstr << "install_su_tools ret val:" << install_su_tools_ret<<", su_hidden_path:" << su_hidden_path << std::endl;
if (install_su_tools_ret != 0) {
return env->NewStringUTF(sstr.str().c_str());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
public class MainActivity extends AppCompatActivity {

private long rootKey = 0x7F6766F8;

private String suBasePath = "/data/local/tmp";

//保存的本地配置信息
Expand Down Expand Up @@ -193,26 +192,51 @@ public void onClick(View v) {
}
});

Button su_env_inject_btn = findViewById(R.id.su_env_inject_btn);
su_env_inject_btn.setOnClickListener(new View.OnClickListener() {
Button su_env_inject_btn1 = findViewById(R.id.su_env_inject_btn1);
su_env_inject_btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!guideOpenUsbDebugSwitch()) {
return;
}
//1.获取su工具文件路径
String suToolsFilePath = WirteSuToolsFilePath("simple_su", MainActivity.this);
showConsoleMsg(suToolsFilePath);

//2.安装su工具
String suFolderHeadFlag = "su_ver1";
String insRet = installSuTools(rootKey, suBasePath, suToolsFilePath, suFolderHeadFlag);
showConsoleMsg(insRet);
if(insRet.indexOf("installSuTools done.") == -1) {
return;
}

//3.选择APP进程
showSelectAppWindow(suFolderHeadFlag);

}
});
Button su_env_inject_btn2 = findViewById(R.id.su_env_inject_btn2);
su_env_inject_btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!guideOpenUsbDebugSwitch()) {
return;
}
//1.获取su工具文件路径
String suToolsFilePath = WirteSuToolsFilePath(MainActivity.this);
String suToolsFilePath = WirteSuToolsFilePath("su", MainActivity.this);
showConsoleMsg(suToolsFilePath);

//2.安装su工具
String insRet = installSuTools(rootKey, suBasePath, suToolsFilePath);
String suFolderHeadFlag = "su_ver2";
String insRet = installSuTools(rootKey, suBasePath, suToolsFilePath,suFolderHeadFlag);
showConsoleMsg(insRet);
if(insRet.indexOf("installSuTools done.") == -1) {
return;
}

//3.选择APP进程
showSelectAppWindow();
showSelectAppWindow(suFolderHeadFlag);

}
});
Expand All @@ -221,7 +245,9 @@ public void onClick(View v) {
clean_su_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showConsoleMsg(uninstallSuTools(rootKey,suBasePath));
//让adbd自我重启
showConsoleMsg(killAdbdProcess(rootKey));
showConsoleMsg(uninstallSuTools(rootKey,suBasePath, "su"));
}
});

Expand Down Expand Up @@ -279,7 +305,7 @@ public boolean guideOpenUsbDebugSwitch() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
.setTitle("提示")
.setCancelable(false)
.setMessage("请先到开发者选项页面里打开【USB调试】开关(提示:在手机关于页面里连续点击系统版本号可启用开发者选项页面)")
.setMessage("请先到开发者选项页面里【打开USB调试】开关(提示:在手机关于页面里连续点击系统版本号可启用开发者选项页面)")
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
Expand Down Expand Up @@ -311,7 +337,7 @@ public boolean guideCloseUsbDebugSwitch() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
.setTitle("提示")
.setCancelable(false)
.setMessage("请先到开发者选项页面里关闭【USB调试】开关")
.setMessage("请先到开发者选项页面里【关闭USB调试】开关")
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
Expand Down Expand Up @@ -352,7 +378,7 @@ public void handleMessage(@NonNull Message msg) {

new Thread() {
public void run() {
String ret = autoSuEnvInject(rootKey, appItem.getPackageName(), suBasePath);
String ret = autoSuEnvInject(rootKey, appItem.getPackageName(), suBasePath, appItem.getSuFolderHeadFlag());
runOnUiThread(new Runnable() {
public void run() {
showConsoleMsg(ret);
Expand Down Expand Up @@ -388,7 +414,7 @@ public void onClick(DialogInterface dialog, int which) {
};

//显示选择应用程序窗口
public void showSelectAppWindow() {
public void showSelectAppWindow(String suFolderHeadFlag) {
final PopupWindow popupWindow = new PopupWindow(this);

View view = View.inflate(this, R.layout.select_app_wnd, null);
Expand Down Expand Up @@ -456,7 +482,8 @@ public void onDismiss() { //窗口即将关闭
appList.add(new SelectAppRecyclerItem(
icon,
showName,
packageName));
packageName,
suFolderHeadFlag));
}
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
Expand All @@ -476,7 +503,8 @@ public void onDismiss() { //窗口即将关闭
appList.add(new SelectAppRecyclerItem(
icon,
showName,
packageName));
packageName,
suFolderHeadFlag));
}

SelectAppRecyclerAdapter adapter = new SelectAppRecyclerAdapter(
Expand All @@ -491,18 +519,17 @@ public void onDismiss() { //窗口即将关闭

}

public static String WirteSuToolsFilePath(Context context) {
String suFileName = "su";
public static String WirteSuToolsFilePath(String suName, Context context) {
String suFilePath = "";
try {
suFilePath = context.getFilesDir().getPath() + "/" + suFileName;
suFilePath = context.getFilesDir().getPath() + "/" + suName;
File file = new File(suFilePath);
if (!file.exists()) {
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
file.createNewFile();
}
if (file.exists()) {
InputStream inputStream = context.getAssets().open(suFileName);
InputStream inputStream = context.getAssets().open(suName);
FileOutputStream outputStream = new FileOutputStream(file);
byte[] content = new byte[1024];
while (inputStream.read(content) > 0) {
Expand Down Expand Up @@ -532,9 +559,11 @@ public static String WirteSuToolsFilePath(Context context) {

public native String adbRoot(long rootKey);

public native String installSuTools(long rootKey, String basePath, String suToolsFilePath);
public native String installSuTools(long rootKey, String basePath, String suToolsFilePath, String suToolsFileFolderHeadFlags);

public native String uninstallSuTools(long rootKey, String basePath, String suToolsFileFolderHeadFlags);

public native String uninstallSuTools(long rootKey, String basePath);
public native String killAdbdProcess(long rootKey);

public native String autoSuEnvInject(long rootKey, String targetProcessCmdline, String basePath);
public native String autoSuEnvInject(long rootKey, String targetProcessCmdline, String basePath, String suToolsFileFolderHeadFlags);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ public class SelectAppRecyclerItem {
private Drawable icon=null;
private String showName;
private String packageName;
private String suFolderHeadFlag;

public SelectAppRecyclerItem(Drawable icon, String showName, String packageName){
public SelectAppRecyclerItem(Drawable icon, String showName, String packageName, String suFolderHeadFlag){
this.icon=icon;
this.showName = showName;
this.packageName = packageName;
this.suFolderHeadFlag = suFolderHeadFlag;
}

public Drawable getIcon() {
Expand All @@ -33,6 +35,14 @@ public String getPackageName() {
return packageName;
}

public void setSuFolderHeadFlag(String suFolderHeadFlag) {
this.showName = showName;
}

public String getSuFolderHeadFlag() {
return suFolderHeadFlag;
}

public void setPackageName(String packageName) {
this.packageName = packageName;
}
Expand Down
12 changes: 10 additions & 2 deletions PermissionManager/app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,18 @@

<Button
android:layout_marginTop="5dp"
android:id="@+id/su_env_inject_btn"
android:id="@+id/su_env_inject_btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8.授权ROOT到其他APP"
android:text="8.授权ROOT到其他APP-[1]"
/>

<Button
android:layout_marginTop="5dp"
android:id="@+id/su_env_inject_btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8.授权ROOT到其他APP-[2]"
/>

<Button
Expand Down
2 changes: 2 additions & 0 deletions su/jni/Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true
LOCAL_MODULE := su
LOCAL_SRC_FILES := ../su.cpp ../base64.cpp ../../testRoot/adb64_helper.cpp ../../testRoot/process64_inject.cpp ../../testRoot/ptrace_arm64_utils.cpp
include $(BUILD_EXECUTABLE)

include $(LOCAL_PATH)/simple_su/Android.mk
11 changes: 11 additions & 0 deletions su/jni/simple_su/Android.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_CPPFLAGS += -std=c++17
LOCAL_CFLAGS += -fPIE
LOCAL_CFLAGS += -fvisibility=hidden
LOCAL_LDFLAGS += -fPIE -pie
LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true
LOCAL_MODULE := simple_su
LOCAL_SRC_FILES := ../../simple_su.cpp ../../base64.cpp ../../../testRoot/adb64_helper.cpp ../../../testRoot/process64_inject.cpp ../../../testRoot/ptrace_arm64_utils.cpp
include $(BUILD_EXECUTABLE)
6 changes: 2 additions & 4 deletions su/root_key_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@ static inline unsigned int get_tmp_root_key(const char* myself_path) {

//1.取路径尾巴
unsigned int key = 0;
const char* head_flag = "/su_";
size_t len = strlen(head_flag);
char *pstart = strstr((char*)myself_path, head_flag);
char *pstart = strrchr((char*)myself_path, '_');
if (!pstart) {
return 0;
}
pstart += len;
pstart ++;

size_t copy_len;
char *pend = strstr(pstart, "/");
Expand Down
Loading

0 comments on commit af1c6c5

Please sign in to comment.