永希

生命永远充满希望

0%

Trojan简介

trojan是近两年兴起的网络工具,项目官网https://github.com/trojan-gfw ,文档官网是 https://trojan-gfw.github.io/trojan 。与强调加密和混淆的SS/SSR等工具不同,trojan将通信流量伪装成互联网上最常见的https流量,从而有效防止流量被检测和干扰。

安装Trojan

终端输入如下命令:

1
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"

该命令会下载最新版的trojan并安装。安装完毕后,trojan配置文件路径是 /usr/local/etc/trojan/config.json

重点关注以下属性:

  1. local_port:监听的端口,默认是443,下文中因为要将Trojan放在Nginx后,因此改为了别的端口;
  2. remote_addrremote_port:非trojan协议时,将请求转发处理的地址和端口。可以是任意有效的ip/域名和端口号,默认是本机和80端口。一般是伪装的web站点服务;
  3. password:密码。需要几个密码就填几行,最后一行结尾不能有逗号;
  4. certkey:域名的证书和密钥;
  5. key_password:默认没有密码(如果证书文件有密码就要填上)

根据自己的需求修改配置文件,保存,然后设置开机启动:systemctl enable trojan,并启动trojan: systemctl start trojan

配合nginx

Trojan 默认端口为443,接管了所有443端口的流量,其他请求则是通过Trojan转发到了其他服务,例如nginx。如果有需求是将Trojan放在nginx后面,由nginx统一接收流量再分发到Trojan和其他服务(web,v2ray),可以参考下面的配置。

要实现上面的需求,用到了nginx的stream_ssl_preread_module模块,具体资料可以参考 http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html
编译nginx时增加此模块。

1.将Trojan配置文件的local_port改为非443端口,例如9443。将nginx原有443端口的配置改为非443端口,例如8443
2.nginx.conf中添加如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stream {
map $ssl_preread_server_name $name {
your.trojan.domain.address trojan;
default nginx;
}
upstream trojan {
server 127.0.0.1:9443;
}
upstream nginx {
server 127.0.0.1:8443;
}
server {
listen 443;
listen [::]:443;
proxy_pass $name;
ssl_preread on;
}
}

执行nginx -t测试配置文件,若提示nginx: [emerg] unknown directive "stream" in XXX,则在nginx.conf中的events区块前增加下面的语句

1
load_module /usr/lib/nginx/modules/ngx_stream_module.so;

具体原因参考 https://serverfault.com/questions/858067/unknown-directive-stream-in-etc-nginx-nginx-conf86

以上就是Trojan放在Nginx后面的配置流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env bash
ARGS=($*)
ADB="adb"
ANDROID_DEVICES=(`adb devices | sed '1d' | awk '{print $1}'`)
if [[ ${#ANDROID_DEVICES[@]} -gt 1 ]];then
for((j=0;j<${#ANDROID_DEVICES[@]};j++))
do
echo $(expr ${j} + 1).${ANDROID_DEVICES[$j]}
done
while [[ $REPLY == "" || $REPLY == "0" ]];do
read -p "输入序号选择设备:"
done
ADB="adb -s "${ANDROID_DEVICES[$REPLY-1]}
fi
${ADB} ${ARGS[@]}

db.system.profile.find({"op" : "query","ns" : "poetries", millis : { $gt : 100 },ts : { $gt : new ISODate("2018-06-07T00:00:00.000Z"),$lt : new ISODate("2018-06-07T10:00:00.000Z")}}).pretty()


db.getProfilingLevel()   1为开启

为了方便填写git commit message,写了一个脚本用于读取jira上的issues,并列出选择作为commit message。 用到了git hook中的prepare-commit-msg 下面提供bash shell和python3两个版本 1.bash shell 此版本需要安装jq。

#!/bin/bash
USERNAME=`git config --get user.name`
if [ "$2" = "message" -o "$2" = "commit" ]
then
    exit 0
fi
exec 2> /dev/null
ISSUS=`curl -u jira:jira "http://localhost:8081/rest/api/2/search?jql=status+in+(Reopened,%20%22To%20Do%22,%20%22In%20Progress%22)%20AND%20assignee%20in%20($USERNAME)%20ORDER%20BY%20updated%20DESC" | jq '.issues[]|{summary: .fields.summary, key: .key}'`
KEYS=(`echo $ISSUS | jq '.key'`)
SUMMARYS_TMP=("`echo $ISSUS | jq '.summary'`")
IFS_old=$IFS
IFS=$'\n'
SUMMARYS=($SUMMARYS_TMP)
IFS='"'
number=${#KEYS[@]}
declare -a ISSUSES='()'
for((i=0;i<$number;i++))
do
    ISSUSES[$i]="${KEYS[$i]}${SUMMARYS[$i]}"
done
for((j=0;j<${#ISSUSES[@]};j++))
do
    let k=$j+1
    echo $k.${ISSUSES[$j]}
done
exec < /dev/tty
exec 2>&1
read -p "请输入编号:"
let answer=$REPLY-1
echo ${ISSUSES[$answer]} > $1
IFS=$IFS_old

2.python3

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys, os, re
from subprocess import check_output
import requests
import json

def query_report(user):
    s = requests.Session()
    s.post('http://localhost:8081/rest/auth/1/session', json={"username":"jira","password":"jira"})
    url = 'http://localhost:8081/rest/api/2/search?jql=status+in+(Reopened,%20%22To%20Do%22,%20%22In%20Progress%22)%20AND%20assignee%20in%20(' + user +')%20ORDER%20BY%20updated%20DESC'
    reports = s.get(url)
    return reports.json()

sys.stdin = open('/dev/tty')
# 收集参数
commit_msg_filepath = sys.argv[1]
if len(sys.argv) > 2:
    commit_type = sys.argv[2]
else:
    commit_type = ''
if len(sys.argv) > 3:
    commit_hash = sys.argv[3]
else:
    commit_hash = ''

if commit_type == "message":
    sys.exit(0)
# 检测我们所在的分支
branch = check_output(['git', 'symbolic-ref', '--short', 'HEAD']).strip()
branch = str(branch, 'utf-8')
print("On branch '%s'" % branch)
username = check_output(['git', 'config', '--get', 'user.name']).strip()
username = str(username, 'utf-8')
messages = []
if branch.startswith('master'):
    j = query_report(username)
    if j["total"] > 0:
        issues = j["issues"]
        for i in range(len(issues)):
            print(str(i+1) + ':' + issues[i]["key"] + " " + issues[i]["fields"]["summary"])
            messages.append(issues[i]["key"] + " " + issues[i]["fields"]["summary"]);
    number = input("请输入编号: ")
    message = messages[int(number) - 1]
    with open(commit_msg_filepath, 'w') as f:
        f.seek(0, 0)
        f.write(message)

1.先安装编译环境需要的软件

sudo apt-get install openjdk-7-jdk git-core gnupg flex bison gperf build-essential \

zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \

lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \

libgl1-mesa-dev libxml2-utils xsltproc unzip

2.同步代码

#新建目录
mkdir workspace
cd workspace
#链接为清华镜像,--repo-url是repo工具的地址,--no-repo-verify关闭repo工具验证
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r79 --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --no-repo-verify
#-d用清单文件里的版本;-c当前分支;--no-tags不拉取tag
repo sync -d -c --no-tags

3.开始编译

#初始化环境
source build/envsetup.sh
#选择产品
lunch
#用16线程编译
make -j16

有一个不在.gitmodule文件中的submodule在更新,解决办法就是

git ls-files --stage | grep 160000

这可以看到所有的Submodule文件,然后

git rm --cached PATH

Android开发中,不可避免的可能会引用到外部so文件,设置一个项目中可能需要引用多个不同的外部so文件。因为不同的引入库中so文件的目录可能不同,导致打包后生成的项目lib目录中的目录结构是不同的外部so文件目录的合集。可能会出现armeabi/armeabi-v7a/arm64-v8a/x86/mips等,一般情况下,armeabi应该是有的,当此三个目录下的文件可能不同时,在某些特定机型下很可能会出现UnsatisfiedLinkError

原因在于不同的机型CPU结构不同导致搜寻不同的目录下面的包,而由于外部库不同的so文件目录可能armeabi下还有a、b so文件,而x86下可能只含有a。例如一个应用armeabi下有liba.solibb.so,arm64-v8a下有liba.so这样的应用装在arm64的设备上,当代码掉到加载libb.so时就会有上面的异常出现,即便是armeabi下有此so,系统也不会去寻找,原因是这个apk中已经有arm64的目录了。

此时解决方案如下:

在build.gradle中添加如下内容

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi'
        }
    }
}

这样生成的apk中就只包含armeabi下的so文件,而不包含其他架构的目录,这样系统会采取兼容模式,加载armeabi下的so文件。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.1'
    }
}
apply plugin: 'com.android.application'

allprojects {
    repositories {

    }
}

dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
}

repositories{
    flatDir {
        dirs 'libs'
    }
}

android {
    compileSdkVersion 23
    buildToolsVersion "24.0.0"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

一、 在github上下载工具 https://github.com/getfatday/keytool-importkeypair 将工具在Linux环境下解压或者解压后Copy到Linux下,运行如下命令

keytool-importkeypair -k android/debug.keystore -p android -pk8 android/platform.pk8 -cert android/platform.x509.pem -alias androiddebugkey

二、 1 把pk8转换成pk12格式

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt

2 生成pk12的密钥问文件

openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name androiddebugkey

3 生成keystore

keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey

所有需要传递或接收的 Activity 不允许设置singleInstance,或只能设为标准模式,否则在部分手机上系统将在 startActivityForResult()后直接返回Activity.RESULT_CANCELED,但在某些手机是正常的。