Android
Android

MysqlEd 外网连接数据库

版本要求:≥ 1.0.8 

1、运行语句

update user set host='%' where user ='root'

1562033169(1).png

这里可能会出现错误:Duplicate entry '%-root' for key 'PRIMARY' 可不必理会。

2、退出程序

3、重新打开

4、运行语句

select host,user from user

5、显示如下(存在 即代表成功)

1562033153(1).png

6、测试连接

1562033198(1).png


主机名或IP地址:请查看手机信息里的IP地址

端口:3306

用户名:root

密码:空


注:如果您的网络是局域网则仅可在局域网内访问外网无法连接。


AndroPHP App 逆向分析

AndroPHP 运行于安卓系统的服务器软件。

博客:http://hex.ro/wp/blog/php-and-lighttpd-for-android/

原贴:http://forum.xda-developers.com/showthread.php?t=1242144


images20141225135052066_info320X570.jpg


从网络上查找来看,这个软件已经不再更新,分析的版本也是现今为止能下载到的最新版本即:1.2


App运行流程如下:

屏幕快照 2018-10-27 上午12.24.11.png


大致:软件运行 -> 是否存在默认配置 -> 进行相应配置变量填充 -> 解压软件包(files)-> 效验版本 -> 设置文件权限 -> 判断是否Root -> 启动软件服务


是否存在默认配置

        setContentView(C0037R.layout.activity_main);
        setRequestedOrientation(1);
        Bundle extras = getIntent().getExtras();
        Intent intent = new Intent(this, DisplayNotification.class);
        intent.putExtra("NotifID", 1);
        startActivity(intent);
        SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        this.port = defaultSharedPreferences.getString("updates_port", "8080");
        this.wwwroot = defaultSharedPreferences.getString("updates_path", "/mnt/sdcard/www");
        this.isRoot = defaultSharedPreferences.getBoolean("enable_root", false);
        this.mServer = new Server(this, this.port, this.wwwroot, this.isRoot);
        if (extras != null && extras.getBoolean("changes")) {
            this.mServer.stopServer();
            SystemClock.sleep(500);
            startServer();
        }
        this.startButton = (ToggleButton) findViewById(C0037R.id.toggleButton1);
        this.exitButton = (Button) findViewById(C0037R.id.exitButton);
        this.exitButton.setOnClickListener(new C00122());
        this.hideButton = (Button) findViewById(C0037R.id.hideButton);
        this.hideButton.setOnClickListener(new C00183());
        ((Button) findViewById(C0037R.id.setting)).setOnClickListener(new C00354());
        this.startButton.setOnClickListener(new C00325());
        this.ip = getLocalIpAddress();
        this.portt = this.port;
        if (this.ip == null) {
            this.ip = "localhost";
        }
        if (this.portt.equals("80")) {
            this.portt = "";
        }
        if (!this.portt.equals("")) {
            this.portt = ":" + this.portt;
        }
        TextView textView = (TextView) findViewById(C0037R.id.textLink);
        textView.setText("http://" + this.ip + this.portt);
        textView.setOnClickListener(new C00426());
        TextView textView2 = (TextView) findViewById(C0037R.id.TextLinkmyadmin);
        textView2.setText("http://" + this.ip + this.portt + "/phpmyadmin");
        textView2.setOnClickListener(new C00157());
        controlServer(true, 999999999);

解压软件包(files)

    public void checkVersion() {
        Object obj = null;
        File file = new File(this.serverPath + "/version");
        String readTextFile = readTextFile(this.serverPath + "/version");
        if (file.exists()) {
            if (readTextFile == null) {
                obj = 1;
            }
            if (!readTextFile.trim().equals(this.version)) {
                obj = 1;
            }
        } else {
            obj = 1;
        }
        if (obj != null) {
            deleteFolder(this.serverPath + "/phpmyadmin");
            deleteFolder(this.serverPath + "/php");
            deleteFolder(this.serverPath + "/mysql");
            deleteFolder(this.serverPath + "/lighttpd");
            deleteFolder(this.serverPath + "/lib");
            deleteFolder(this.serverPath + "/binary");
            extractZipFile();
            copyFileFromAssets("conf/version", this.serverPath + "/version");
        }
    }

置文件权限

public void setPermissions() {
        Exception e;
        try {
            File file = new File(this.serverPath + "/lighttpd/lighttpd");
            try {
                FileUtils.chmod(file, 511);
                FileUtils.chmod(new File(this.serverPath + "/lighttpd/killall"), 511);
                FileUtils.chmod(new File(this.serverPath + "/mysql/mysqld"), 511);
                FileUtils.chmod(new File(this.serverPath + "/php/php"), 511);
                FileUtils.chmod(new File(this.serverPath + "/mysql/data").getParentFile(), 511);
                FileUtils.chmod(new File(this.serverPath + "/mysql/data/mysql").getParentFile(), 511);
            } catch (Exception e2) {
                e = e2;
                File file2 = file;
                e.printStackTrace();
            }
        } catch (Exception e3) {
            e = e3;
            e.printStackTrace();
        }
    }

修改配置文档

    public void setupConfigs() {
        File file = new File(this.wwwroot);
        if (!file.exists()) {
            file.mkdir();
        }
        String str = "";
        saveTextFile(this.serverPath + "/lighttpd/lighttpd.conf", readTextFileFromAssets("conf/lighttpd.conf").replace("${wwwroot}", this.wwwroot).replace("${port}", this.port).replace("${serverpath}", this.serverPath).replace("${logpath}", this.serverPath + "/lighttpd/tmp"));
        str = "";
        saveTextFile(this.serverPath + "/mysql/my.cnf", readTextFileFromAssets("conf/my.cnf").replace("${serverpath}", this.serverPath));
        str = "";
        saveTextFile(this.serverPath + "/php/php.ini", readTextFileFromAssets("conf/php.ini").replace("${serverpath}", this.serverPath));
        saveTextFile(this.wwwroot + "/phpinfo.php", "<?php \n   echo phpinfo();  \n?>");
        if (!file.exists()) {
            file.mkdir();
            try {
                FileUtils.chmod(file, 509);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

判断系统权限

    public static void runCommand(String str) {
        try {
            OutputStream outputStream = Runtime.getRuntime().exec("sh").getOutputStream();
            Log.d("", "runCommand() cmd=" + str);
            writeLine(outputStream, str);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void runSuCommand(String str) {
        try {
            OutputStream outputStream = Runtime.getRuntime().exec("su -c sh").getOutputStream();
            Log.d("", "runSuCommand() cmd=" + str);
            writeLine(outputStream, str);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

启动软件服务

 public void reloadServer() {
        checkVersion();
        stopServer();
        setupConfigs();
        setPermissions();
        String str = "-D -f " + this.serverPath + "/lighttpd/lighttpd.conf";
        String str2 = "--defaults-file=" + this.serverPath + "/mysql/my.cnf";
        String stringBuilder = new StringBuilder(String.valueOf(String.valueOf(this.serverPath + "/php/php -a -b 127.0.0.1:9009"))).append(" ").append("-c " + this.serverPath + "/php/php.ini").toString();
        String stringBuilder2 = new StringBuilder(String.valueOf(String.valueOf(this.serverPath + "/mysql/mysqld"))).append(" ").append(str2).toString();
        String stringBuilder3 = new StringBuilder(String.valueOf(String.valueOf(this.serverPath + "/lighttpd/lighttpd"))).append(" ").append(str).toString();
        execCommand(stringBuilder);
        execCommand(stringBuilder3);
        execCommand(stringBuilder2);
        if (this.isRoot) {
            runSuCommand(stringBuilder);
            runSuCommand(stringBuilder3);
            runSuCommand(stringBuilder2);
            return;
        }
        runCommand(stringBuilder);
        runCommand(stringBuilder3);
        runCommand(stringBuilder2);
    }

MySql配置文档

[client]
port=3306
socket=${serverpath}/mysql/tmp/mysql.sock
character-sets-dir=${serverpath}/mysql/share/charsets/
[mysqld_safe]
socket = ${serverpath}/mysql/tmp/mysql.sock
nice  = 0
[mysql]
default-character-set=utf8
[mysqld]
port=3306
socket=${serverpath}/mysql/tmp/mysql.sock
character-sets-dir=${serverpath}/mysql/share/charsets/
basedir="${serverpath}/mysql/"
datadir="${serverpath}/mysql/data/"
tmpdir ="${serverpath}/mysql/tmp/"
character-set-server=utf8
default-storage-engine=MYISAM
max_connections=255
query_cache_size=0
table_cache=256
tmp_table_size=18M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=35M
key_buffer_size=25M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

流程大致如上所示,当然还有一些其他的零碎操作,不一一赘述。总体来看这款软件看着只是一个“指令集和”将你安装的步骤省略罢了。由于这款软件不再更新,在一些较新的机器上运行会出现服务开启错误的问题,可以更换一个类似的软件KsWeb。其原理跟这款软件大同小异,只是一直在更新,所以界面效果会好一些。



实现:

一个简单的本地Mysql

Android 计算标准差

public static float StandardDiviation(float[] x) {
    int m = x.length;
    float sum = 0;
    for (int i = 0; i < m; i++) {//求和
        sum += x[i];
    }
    float dAve = sum / m;//求平均值
    //修约平均值为2位小数  规范要求
    float dAve1 = RoundLib.rFloat(dAve, 2);
    dAve=dAve1;
    float dVar = 0;
    for (int i = 0; i < m; i++) {//求方差
        dVar += (x[i] - dAve) * (x[i] - dAve);
    }
    dVar/=m-1;
    double ret_sd = Math.sqrt(dVar);
    Log.e("b",String.valueOf(ret_sd).toString());
    BigDecimal b = new BigDecimal(String.valueOf(ret_sd));
    float fl = b.floatValue();
    b = null;
    return fl;
}