webdav服务器搭建

原由: 由于想省力, 使用了国内免费的坚果云webdav服务, 虽然是免费, 但对请求并发数有一定限制, 使用joplin进行同步笔记的时候, 如果并发数过高,会导致请求返回403,服务器拒绝服务,从而引发同步异常,笔记丢失事件!!

  • 即使是官方也不推荐, https://github.com/laurent22/joplin/blob/5214da0a4475fb84bf1f11b419f5f7f35592c43a/readme/faq.md
    463841f9a09e49ee12738404e9408fd2.png

所以为此自行搭建webdav服务器,以免再发生笔记丢失事件!

  • 方案一: ubuntu + nginx搭建
    1. 下载安装nginx
      sudo apt install -y nginx-full
      sudo mkdir -p /home/dav
      sudo chown -R www-data:www-data /home/dav
    2. 安装密码管理工具
      apt install apache2-utils
      htpasswd -bc /etc/nginx/htpasswd {user} {password}
    3. 编辑配置文件
      sudo vim /etc/nginx/sites-enabled/webdav.conf
 server {
    listen 80;

    server_name {公网IP}
    # 设置使用utf-8编码,防止中文文件名乱码
    charset utf-8;
       # 打开目录浏览功能, 允许在浏览器直接浏览文件目录
    # autoindex on;
    # 默认存放文件的路径
    root /home/dav;
    auth_basic              realm_mame;
    # 用户密码文件存放位置
    auth_basic_user_file  /etc/nginx/htpasswd;
    # dav 允许的操作
    dav_methods     PUT  DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;
    # 创建文件的默认权限
    dav_access      user:rw group:rw all:r;
    # 临时文件位置
    client_body_temp_path   /tmp;
    # 最大上传文件限制, 0表示无限制
    client_max_body_size    0;
    # 允许自动创建文件夹(如果有需要的话)
    create_full_put_path    on;
}
  1. 重启nginx
    sudo nginx -s reload
  2. 测试
    5.1) 下载 https://www.raidrive.com/测试

f0f0147a326c44e51824f517113bb15c.png

5.2)去除注释autoindex on;打开目录浏览功能
5.2.1) curl -u user:passwd http://ip/

  • 成功
    56c1664c0e635caf603a85f7295b69bb.png
  • 失败
    816e78b2e2d45b8b9f0beeb5455f4334.png

    5.2.2) 浏览器 ip访问输入账号密码

  • 成功
    ef61ac26346a67c3fc3dd9ea14c59779.png

  • 失败

  1. 错误的账号密码
    51c5caaf0a4c4c4959f314a405508789.png
  • joplin测试成功
    3387bf8ace54134bef04f9d604e6caf5.png

  • 方案二: windows server 2016 + apache搭建

    1. 下载Apache https://httpd.apache.org/
    2. 创建认证文件
      C:\xampp\apache\bin\htpasswd.exe -bc "C:/xampp/webdav/basic.passwd" {admin} {passwd}
    3. 编辑文件 C:\xampp\apache\conf\httpd.conf, 去除下列#号,保存
      LoadModule dav_module modules/mod_dav.so
      LoadModule dav_fs_module modules/mod_dav_fs.so
      LoadModule dav_lock_module modules/mod_dav_lock.so
      Include conf/extra/httpd-dav.conf
    4. 编辑文件C:\xampp\apache\conf\extra\httpd-dav.conf
Alias /joplin "C:/xampp/webdav/joplin"

<Directory "C:/xampp/webdav/joplin">
        Dav On
        Order Allow,Deny
        Allow from all
        # 认证方式为 Basic, joplin只支持此种方式
        AuthType Basic
        AuthName DAV-upload
        # 打开目录浏览功能
        Options Indexes
        # 设置用户帐户密码文件
        AuthUserFile "C:/xampp/webdav/basic.passwd"
        AuthDigestProvider file
        Require user admin
</Directory>
  1. 重启apache
    C:\xampp\apache\bin httpd –k restart

  2. 测试

  • 成功
    5b7ad752bdadfc5e3b531b97d01769c7.png

  • 采坑记录

    只支持Basic方式认证, 当使用auth_digest时,认证不成功,
    查看 C:\xampp\apache\logs\error.log, 提示
    client used wrong authentication scheme Basic

1fc3cd8d58438db81a1ac9740251d411.png

显然遭遇同样问题的,还有不少使用该软件的人

facf36c18369057bf9e4326e1acd5f81.png
30d08fa22d6a68c703e656938fe6f72f.png

安卓6.0Bitmap创建流程

1. Bitmap静态方法nativeCreate

1414ec258a0a02455d7a7c00e2f0e1ce.png

2.frameworks/base/core/jni/android/graphics/Bitmap.cpp中

2.1
动态注册JNI函数
dab0799d646eaf60eedce2e3a3a4db10.png
2.2
java层Bitmap.nativeCreate对应native层Bitmap.Bitmap_creator
a3af37982f83a4b0576a76fc837e7239.png
2.3 在Bitmap_creator函数中,完成:
1)用于存储pixel的数组,在java堆中内存分配
2)native层Bitmap创建,持有该数组的弱引用
3)创建java层Bitmap,并持有native层bitmap引用

66c0ebd9be7b7aa7f0d6b7d152d52737.png

文件位于frameworks/base/core/jni/android/graphics/Graphics.cpp
2.4 GraphicsJNI::allocateJavaPixelRef中

  1. env->CallObjectMethod 完成数组内存分配
  2. new android::Bitmap 创建Native层Bitmap
    4b569f4b54720aa3eaba0ecddab0e62d.png
    1.1) 调用参数来源,env->CallObjectMethod(gVMRuntime,
    gVMRuntime_newNonMovableArray,
    gByte_class, size)
    c3ddd20483bab1dab4c78f59281c903a.png
    gVMRuntime: dalvik.system.VMRuntime
    gVMRuntime_newNonMovableArray
    此函数调用,会在java heap申请内存
    930c1964cf98b77edf0ecf0e00385f56.png
    2.1)创建native的bitmap
    new android::Bitmap(addr, fd, info, rowBytes, ctable)
    ad4545b98eaf4b1a5e3da2b2ccced917.png
    addr: env->CallLongMethod(gVMRuntime, gVMRuntime_addressOf, arrayObj)拿到分配对象的地址
    2.5 GraphicsJNI::createBitmap
    cffcca1df71f3dc2b577c60761cf406a.png
    env->NewObject
    关键参数
    08c731f03faba2cebba9e9c23e362edf.png
    调用java层,Bitmap构造函数, 完成对象创建,持有Native层Bitmap引用, 对mBuffer赋值
    882c70ebc47adcb66ba5859506e15538.png

参考文章 :https://zhuanlan.zhihu.com/p/31450987

SSL单双向认证测试

测试环境

雷电模拟器安卓系统5.1.1
客户端: demo.apk使用的网络请求框架okGo
服务端: 使用golang server
根证书:ca.crt, r2-ca.crt
r2-ca.key颁发的证书:test.crt放在服务端, client.crt放在客户端

单向认证 ssl-pining

golang 服务端开启单向认证

使用根证书r2-ca.crt检验test.crt证书

openssl验证通过

使用根证书ca.crt检验test.crt证书

openssl验证失败

进行一次https请求,服务端返回test.crt证书

使用ca.crt作为校验根证书,https请求失败

使用r2-ca.crt作为校验根证书,https请求成功

使用相同证书test.crt进行校验,https请求成功

双向认证

服务端开启双向认证,并加入根证书ra-ca.crt校验客户端提供的证书

由证书client.crt和私钥client.key生成client.bks,进行一次https请求,提示握手失败

服务器日志打印,未提供证书

使用openssl测试双向认证, wireshark抓包信息,显示证书有数据


使用wireshark抓包模拟器请求信息,证书长度为0

修改证书类型为PKCS12

访问成功

为何同样的证书,BKS不行,PKCS12可以呢?

以下代码为win10使用openssl生成的证书,进行转换为bks格式证书
- 1.生成.p12文件 可选-CAfile ca.crt:
- openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12
- 2.生成.bks证书:
- keytool -importkeystore -srckeystore client.p12 -srcstoretype pkcs12 -destkeystore client2.bks -deststoretype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath H:\Android_Studio\lib\bcprov-jdk15on-1.60.jar -storepass 111111

进一步测试,将openssl生成的 client.crt 证书转为 client.pem

  • openssl x509 -inform der -in xxx.crt -out xxx.pem

访问依然成功, 等待后续继续测试为何bks不行.

UDP打洞

腾讯云,一台服务器, 两台客户端(放通所有端口)


打洞成功,收发信息正常

腾讯云,一台服务器, 一台电脑两个客户端(放通所有端口)


打洞成功,收发信息正常

腾讯云,一台服务器, 一台客户端((放通所有端口)和一台本地客户端(关闭防火墙)

  • 打洞失败,本地可发送信息, 接收不到控制端的信息,
    > 猜测可能为路由配置问题

使用手机热点再次尝试,同样失败

Xposed修改特征编译

注意make缓存问题, 修改了文件内容,没有及时生效!!!!

69a1a630dd07beb750433d2dadf24d18.png

de.robv.android.xposed
在outdir目录中新建java目录移入XposedBridge.jar

参考链接

https://blog.csdn.net/qq_35834055/article/details/103256122

1 XposedInstaller.apk

负责安装Xp环境 其实就是下载与手机cpu架构SDK对应的zip 然后刷入手机和管理模块
环境 androidstudio 网络对应的资料都有我就随便写写
包名 随便改一个 AS直接改就行
名称 随便改一个

XposedApp.java修改
BASE_DIR_LEGACY/data/data/ 修改后的包名
BASE_DIRdata/user_de/0/ 修改后的包名
XPOSED_PROP_FILES/su/xposed/XP的配置文件.prop 随便改个名字

2 XposedBridge-art.jar

给开发者提供对应的API支持 底层实现 jni调用libxposed-art.so 的native方法
环境 androidstudio 网络也有资料随便写写
原始包名:de.robv.android.xposed 随便改一个
原始名称:XposedBridge.jar 随便改一个

XposedInit.java修改
INSTALLER_PACKAGE_NAME改成你上面修改的APK包名

3 Xposed

给Xpbridge提供API支持和调用了很多android-art的方法以及最重要的替换android zygote(app_process)

libxposed_common.h改成你修改后的XposedBridge包名
CLASS_XPOSED_BRIDGE更改前:de/robv/android/xposed/XposedBridge
CLASS_ZYGOTE_SERVICE更改前:de/robv/android/xposed /services/ZygoteService
CLASS_FILE_RESULT更改前:de/robv/android/xposed /services/FileResult
xposed.h修改
XPOSED_PROP_FILE/system/Xp的配置文件.prop 改成你之前APK时候改的
XPOSED_JAR/system/framework/开发者jar包名称.jar
XPOSED_LIB_ARTlibxposed_art.so 随便改个名字如 libtest_art.so
XPOSED_CLASS_DOTS_ZYGOTEde.robv.android.xposed .XposedBridge 改成你之前定义的包名
XPOSED_CLASS_DOTS_TOOLSde.robv.android.xposed. XposedBridge$ToolEntryPoint
xposed_service.cpp改成你修改后的XposedBridge包名
IMPLEMENT_META_INTERFACE更改前: de.robv.android.xposed .IXposedService
xposed_shared.h改成你修改后的APK包名
XPOSED_DIR更改前: /data/user_de/0/de.robv.android.xposed.installer
XPOSED_DIR更改前: /data/user_de/0/de.robv.android.xposed.installer
ART.mk修改成你定义的AS右键直接改名称 记得把.mk文件里的也改了
libxposed_artlibtest_art.so

4 Xposed-Tools

Xp框架的编译器 打包出可以刷机的zip 以下两个是打包脚本和刷机包脚本文件内容改成你对应的就好了 这点网上根本没有资料 全靠自己一个文件一个文件看巨坑
如果有源码不准备刷机安装Xp单独改buid.pl就好了
flash-script.sh不改刷机就会报错 缺少xpsoed.prop

build.pl flash-script.sh改成你修改后的XposedBridge包名
xposed.prop修改成你定义的XP配置文件
XPOSED_JAR修改成你定义的开发者jar文件名称
XposedBridge.jarlibxposed_art.so 随便改个名字如 libtest_art.so
libxposed_art修改成你定义的so名称 libtest_art
1d04fa96a836f58d3d4302d914f3695f.png

5 编译与运行

把Xposed项目复制到android源码/frameworks/base/cmds 下
在去下载与你编译的android源码对应的xpsoed版ART 进行替换

如想将XposedInstaller.apk内置到系统,进行以下操作

XposedInstaller_3.1.5.apk文件放到/out/target/product/hammerhead/system/app/

f050732d9413506e947af08006990c80.png
7ac4cfcdf6397fc7ea462d9d3d5f0203.png