├── .gitignore ├── README-zh.md ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── iternull │ │ └── secureif │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── iternull │ │ │ └── secureif │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ └── content_main.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values-zh │ │ └── strings.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── iternull │ └── secureif │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── susb /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | /.idea/workspace.xml 6 | /.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | /apk -------------------------------------------------------------------------------- /README-zh.md: -------------------------------------------------------------------------------- 1 | # Secure I/F 2 | 3 | Secure I/F 是一个用于控制 Android 手机 USB 接口的**电源连接**与**数据连接**关闭与打开的一款应用。 4 | 5 | 可以防止未授权的设备通过 USB 连接到你的手机进行恶意操作或者植入病毒,可以保护你在公共场所的充电安全。 6 | 7 | 本程序需要 **Root** 后才能正常使用。 8 | 9 | ## 原理 10 | 11 | 原理就是通过修改内核参数参数控制 USB 功能的开关。 12 | 13 | #### 控制 USB 充电连接 14 | 15 | ```bash 16 | su -c 'echo 0 > /sys/class/power_supply/battery/charging_enabled' // 关闭 USB 充电功能 17 | su -c 'echo 1 > /sys/class/power_supply/battery/charging_enabled' // 打开 USB 充电功能 18 | ``` 19 | 20 | 注: 并非所有 Android 手机都是这个路径,所以这个功能只支持部分手机。 21 | 22 | #### 控制 USB 数据连接 23 | 24 | ```bash 25 | su -c 'echo 0 > /sys/devices/virtual/android_usb/android0/enable' // 关闭 USB 数据通信功能 26 | su -c 'echo 1 > /sys/devices/virtual/android_usb/android0/enable' // 打开 USB 数据通信功能 27 | ``` 28 | 29 | ## 开发 30 | 31 | 本项目使用 [Android Studio](https://developer.android.com/studio/index.html) 开发,目前还存在不少的 bug 。 32 | 特别是控制电源连接的功能只支持部分安卓手机,以及会受其他程序的影响导致已经关闭的选项被其他程序调用时打开。 33 | 34 | 另外还提供了一个原始的 [Shell 脚本](susb),供命令行界面下使用。 35 | 36 | | 阶段 | 功能 | 实现 | 37 | |:---------|:-------------------------------------|:-----| 38 | | 第一阶段 | USB 充电功能开关 | Yes | 39 | | | USB 数据传输功能开关 | Yes | 40 | | 第二阶段 | 模拟一个假的的用户文件 | No | 41 | | | 关闭原始 USB 连接通知栏 | No | 42 | | | 模拟假的 USB 连接通知栏 | No | 43 | | 第三阶段 | 关闭 ADB 调试功能 | No | 44 | | | 模拟假的 ABD 调试通知框 | No | 45 | | 第四阶段 | 添加隐藏应用图标功能 | No | 46 | | | 模拟应用安装界面,弹出安装错误的提示 | No | 47 | 48 | ## 下载 49 | 50 | Download the [latest release](https://github.com/iternull/secure-if/releases). 51 | 52 | ## 许可 53 | 54 | 这是一个私人项目,作者保留最终解释权。 55 | 56 | > 弆珎媽白勺閞源滸坷 57 | 58 | ## 信仰 59 | 60 | <(゚´(。。)`゚)> 61 | 62 | 本项目代码以使用猪头猪血烧香做法,以保佑无 bug 出现。 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Secure I/F 2 | 3 | Secure I/F This application is used to control the **Charge Connection** and **Data Connection** of the Android USB interface. 4 | 5 | This application can prevent unauthorized devices from connecting to your phone via USB to implant malicious viruses, 6 | can protect the charging safety in public places. 7 | 8 | This application requires **Root**. 9 | 10 | [中文说明](README-zh.md) 11 | 12 | ## How is work 13 | 14 | Control the USB function switch by modifying the kernel parameter parameters. 15 | 16 | #### USB Charge 17 | 18 | ```bash 19 | su -c 'echo 0 > /sys/class/power_supply/battery/charging_enabled' // Disable USB Charge 20 | su -c 'echo 1 > /sys/class/power_supply/battery/charging_enabled' // Enable USB Charge 21 | ``` 22 | 23 | > Not all Android phones are this path, so this feature only supports some phones. 24 | 25 | #### USB Data Connections 26 | 27 | ```bash 28 | su -c 'echo 0 > /sys/devices/virtual/android_usb/android0/enable' // Disable USB Connections 29 | su -c 'echo 1 > /sys/devices/virtual/android_usb/android0/enable' // Enable USB Connections 30 | ``` 31 | 32 | ## Develop 33 | 34 | This project is developed using [Android Studio](https://developer.android.com/studio/index.html). 35 | 36 | Also provided a [Shell Script](susb), Used for command line interface. 37 | 38 | 51 | 52 | ## Download 53 | 54 | Download the [latest release](https://github.com/iternull/secure-if/releases). 55 | 56 | ## License 57 | 58 | This is a private project. 59 | 60 | > ℉ūck yōūr ōpéń $ōūrcé līcéń$é 61 | 62 | ---------- 63 | 64 | > [卍](https://en.wikipedia.org/wiki/Swastika) 65 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | defaultConfig { 7 | applicationId "com.iternull.secureif" 8 | minSdkVersion 21 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0.1" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.3.1' 28 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 29 | compile 'com.android.support:design:25.3.1' 30 | testCompile 'junit:junit:4.12' 31 | } 32 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\zero\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/iternull/secureif/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.iternull.secureif; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.iternull.secureif", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/iternull/secureif/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.iternull.secureif; 2 | 3 | /* 4 | * ___ 5 | * ',_`""\ .---, 6 | * \ :-""``/` | 7 | * `;' //`\ / 8 | * / __ | ('. 9 | * |_ ./O)\ \ `) \ 10 | * _/-. ` `"` |`-. 11 | * .-=; ` / `-. 12 | * /o o \ ,_, . '. 13 | * L._._;_.-' . `'-. 14 | * `'-.` ' `'-. 15 | * `. ' `-._ 16 | * '-._. -' '. 17 | * \ `\ 18 | * | \ 19 | * | | ; _. 20 | * \ | | |-.(( 21 | * ;. \ / / |-.`\) 22 | * | '. ; / | |(_) ) 23 | * | \ \ /` | ;'--' 24 | * \ '.\ /` | / 25 | * | /`| ; \ / 26 | * | | | |-._ '. .' 27 | * / | | |__.`'---"_;'-. .-' 28 | * //__/ / | .-'`` _.-'` 29 | * jgs //__/ //___.--''` 30 | */ 31 | 32 | import android.content.DialogInterface; 33 | import android.os.Bundle; 34 | import android.support.design.widget.FloatingActionButton; 35 | import android.support.design.widget.Snackbar; 36 | import android.support.v7.app.AlertDialog; 37 | import android.support.v7.app.AppCompatActivity; 38 | import android.support.v7.widget.Toolbar; 39 | import android.text.Html; 40 | import android.text.method.LinkMovementMethod; 41 | import android.view.View; 42 | import android.view.Menu; 43 | import android.view.MenuItem; 44 | import android.widget.Switch; 45 | import android.widget.TextView; 46 | import android.widget.Toast; 47 | 48 | import java.io.IOException; 49 | 50 | import static java.lang.Runtime.*; 51 | 52 | public class MainActivity extends AppCompatActivity { 53 | 54 | private Switch SwitchCharge, SwitchConnection; 55 | 56 | @Override 57 | protected void onCreate(Bundle savedInstanceState) { 58 | super.onCreate(savedInstanceState); 59 | setContentView(R.layout.activity_main); 60 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 61 | setSupportActionBar(toolbar); 62 | 63 | SwitchCharge = (Switch) findViewById(R.id.switch_usbcharge); 64 | SwitchConnection = (Switch) findViewById(R.id.switch_usbdata); 65 | 66 | SwitchCharge.setOnClickListener(new View.OnClickListener() { 67 | @Override 68 | public void onClick(View v) { 69 | boolean check = SwitchCharge.isChecked(); 70 | if(check) try { 71 | Process exec = getRuntime().exec(new String[]{"su", "-c", "echo 0 > /sys/class/power_supply/battery/charging_enabled"}); 72 | Toast.makeText(MainActivity.this, R.string.usb_charging_is_disabled, Toast.LENGTH_SHORT).show(); 73 | } catch (IOException e) { 74 | e.printStackTrace(); 75 | } 76 | else try { 77 | Process exec = getRuntime().exec(new String[]{"su", "-c", "echo 1 > /sys/class/power_supply/battery/charging_enabled"}); 78 | Toast.makeText(MainActivity.this, R.string.usb_charging_is_enabled, Toast.LENGTH_SHORT).show(); 79 | } catch (IOException e) { 80 | e.printStackTrace(); 81 | } 82 | } 83 | }); 84 | 85 | SwitchConnection.setOnClickListener(new View.OnClickListener() { 86 | @Override 87 | public void onClick(View v) { 88 | boolean check = SwitchConnection.isChecked(); 89 | if(check) try { 90 | Process exec = getRuntime().exec(new String[]{"su", "-c", "echo 0 > /sys/devices/virtual/android_usb/android0/enable"}); 91 | Toast.makeText(MainActivity.this, R.string.usb_port_is_disabled, Toast.LENGTH_SHORT).show(); 92 | } catch (IOException e) { 93 | e.printStackTrace(); 94 | } 95 | else try { 96 | Process exec = getRuntime().exec(new String[]{"su", "-c", "echo 1 > /sys/devices/virtual/android_usb/android0/enable"}); 97 | Toast.makeText(MainActivity.this, R.string.usb_port_is_enabled, Toast.LENGTH_SHORT).show(); 98 | } catch (IOException e) { 99 | e.printStackTrace(); 100 | } 101 | } 102 | }); 103 | } 104 | 105 | private void onShowHelpDialog() { 106 | CharSequence styledText = Html.fromHtml(getString(R.string.text_help)); 107 | AlertDialog ad = new AlertDialog.Builder(this) 108 | .setTitle(R.string.action_help) 109 | .setMessage(styledText) 110 | .setPositiveButton(R.string.action_ok, 111 | new DialogInterface.OnClickListener() { 112 | @Override 113 | public void onClick(DialogInterface dialog, int which) { 114 | // Do nothing. 115 | } 116 | }).create(); 117 | ad.show(); 118 | // Make links clickable. 119 | ((TextView)ad.findViewById(android.R.id.message)).setMovementMethod( 120 | LinkMovementMethod.getInstance()); 121 | } 122 | 123 | private void onShowAboutDialog() { 124 | CharSequence styledText = Html.fromHtml(getString(R.string.text_about)); 125 | AlertDialog ad = new AlertDialog.Builder(this) 126 | .setTitle(R.string.action_about) 127 | .setMessage(styledText) 128 | .setPositiveButton(R.string.action_ok, 129 | new DialogInterface.OnClickListener() { 130 | @Override 131 | public void onClick(DialogInterface dialog, int which) { 132 | // Do nothing. 133 | } 134 | }).create(); 135 | ad.show(); 136 | // Make links clickable. 137 | ((TextView)ad.findViewById(android.R.id.message)).setMovementMethod( 138 | LinkMovementMethod.getInstance()); 139 | } 140 | 141 | @Override 142 | public boolean onCreateOptionsMenu(Menu menu) { 143 | // Inflate the menu; this adds items to the action bar if it is present. 144 | getMenuInflater().inflate(R.menu.menu_main, menu); 145 | return true; 146 | } 147 | 148 | @Override 149 | public boolean onOptionsItemSelected(MenuItem item) { 150 | // Handle action bar item clicks here. The action bar will 151 | // automatically handle clicks on the Home/Up button, so long 152 | // as you specify a parent activity in AndroidManifest.xml. 153 | int id = item.getItemId(); 154 | 155 | //noinspection SimplifiableIfStatement 156 | if (id == R.id.action_help) { 157 | onShowHelpDialog(); 158 | return true; 159 | } else if (id == R.id.action_about) { 160 | onShowAboutDialog(); 161 | return true; 162 | } 163 | 164 | return super.onOptionsItemSelected(item); 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 31 | 32 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iternull/secure-if/a0a5bdbb02c7e2023b8fe1a3d49bba9e1af4bb1f/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Secure I/F 4 | 关于 5 | 添加 6 | 取消 7 | 关闭 8 | 捐赠 9 | 帮助 10 | 好的 11 | 打开 12 | 设置 13 | USB 充电 14 | USB 充电已禁用 15 | USB 充电已启用 16 | USB 数据连接 17 | USB 接口已禁用 18 | USB 接口已启用 19 | 20 |
22 | Version: 1.0.1
23 | GitHub: Secure I/F
24 | License: IterNull
25 | ]]> 26 |
27 | 28 | Paypal:
30 | Alipay:
31 | 谢谢你的捐赠
32 | ]]> 33 |
34 | 35 | 1. 本程序需要获取 Root 权限后才能正常使用。

37 | 2. USB 充电的开关功能只支持部分手机。

38 | 3. 当遇到禁用 USB 接口功能后从新插拔后却失效了,你需要在未连接 USB 的情况下禁用掉再插入。

39 | 4. 同时禁用充电功能和数据接口功能可以使 USB 口完全失效。

40 | 5. 由于是通过修改 /sys/ 文件实现的功能,重启后会还原设置。

41 | ]]> 42 |
43 |
-------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Secure I/F 3 | About 4 | Add 5 | Cancel 6 | Close 7 | Donate 8 | Help 9 | OK 10 | Open 11 | Settings 12 | USB Charging 13 | USB Charging is Disabled 14 | USB Charging is Enabled 15 | USB Connection 16 | USB Port is Disabled 17 | USB Port is Enabled 18 | 19 |
21 | Version: 1.0.1
22 | GitHub: Secure I/F
23 | License: IterNull
24 | ]]> 25 |
26 | 27 | Paypal:
29 | Alipay:
30 | Thank you for your donation.
31 | ]]> 32 |
33 | 34 | 1. The is Help.

36 | ]]> 37 |
38 |
39 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |