刻滑入门

一、滑行姿态

滑雪是下半身运动,对于初学者首先要保证上半身不动尽量使用下半身的力量去控制雪板。

这里有个小技巧可以将后手背于腰部这样既可以保证上半身不弯曲也可以保证手不会乱动影响重心。

总结一下几点:

  1. 身体站直与雪板平行

  2. 在滑行阶段视线指向板头前进方向

  3. 在换刃阶段视线指向板头方向+/-45度方向

二、寻找刃感

  1. 横向切坡顺着板刃的方向滑行,切勿对抗这股力量否则在滑行过程中会很累

  2. 过弯顺着这股力量做圆弯滑行,切勿使用后腿力量搓雪转弯

三、稳定滑行

  1. 在横切雪道时使用开放站姿同时尽量压低前脚重心

  2. 加入引申动作:前刃切坡(压)- 换刃(起)- 后刃切坡(压)

特斯拉-科技与狠活

灯光秀资源

手机屏幕串流至特斯拉|Tesla Mirror|Android screen stream to tesla

之前使用过各种投屏软件在特斯拉上均无法成功投屏,后来意外知道特斯拉有个限制就是不允许直接访问内网IP,知道这个特点后我们就可以轻松绕过~

前提条件:手机已root方法请自行查找

  1. 安装Termux终端应用和Termux:Boot插件

    1. 使用pkg install tsu命令安装提权包

    2. 执行命令将自动设置脚本添加至开机启动项方便以后使用

      1
      2
      3
      4
      5
      6
      mkdir -p ~/.termux/boot/
      cat <<EOT>> ~/.termux/boot/add-tesla-support
      #!/data/data/com.termux/files/usr/bin/sh
      sudo ip link add tesla type dummy
      sudo ifconfig tesla 11.11.11.11 netmask 255.255.255.0 up
      EOT

    3. 将Termux:Boot的“电池优化选项”关闭,并打开应用一次以允许开机自启动

    4. 执行脚本添加一块虚拟网卡并设置公网IP

      sudo sh ~/.termux/boot/add-tesla-support

  2. 开启手机5GHz热点并将特斯拉连接到这个热点

  3. 安装Screen steam over HTTP屏幕串流应用进行如下配置

    1. 勾选“设置”->“保持设备唤醒”和“自动开始/停止视频流”

    2. 取消勾选“设置”->”高级”->”只用WIFI”

  4. 在“视频流”页确认能否看到新加的虚拟网卡和IP

  5. 在特斯拉车机上访问http://11.11.11.11:8080即可串流屏幕内容至特斯拉车机上,首次访问需要在手机上允许投射内容,收藏一下这个网址方便下次使用。

ubuntu提升使用体验篇

Gnome自用插件

KDE配置相关

安装GSConnect插件后与其他设备配对

  • 远程锁定/解锁屏幕

    设置方式:Mobile Settings -> Connected Device -> Commands 增加以下两项

    1
    2
    /usr/bin/gnome-screensaver-command -l //锁定屏幕
    /usr/bin/gnome-screensaver-command -d //解锁屏幕

系统快捷键

设置方式:Settings -> Keyboard -> View and Customize Shortcuts -> Custom Shortcuts

  • 快速打开scrcpy

    1. 添加自动检测快捷键

      Name: Scrcpy#~

      Command: /usr/bin/scrcpy-auto-detect

      Shortcut: Ctrl + ~

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      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
      #!/bin/bash

      # 获取所有设备及其状态(排除标题行和空行)
      devices_info=$(adb devices | sed 1d | grep -v '^$')

      # 如果没有设备,提示并退出
      if [ -z "$devices_info" ]; then
      notify-send -i "dialog-error" "设备未连接" "没有找到任何 Android 设备!"
      exit 1
      fi

      # 获取设备总数
      device_count=$(echo "$devices_info" | wc -l)

      if [ "$device_count" -eq 1 ]; then
      # 只有一个设备,直接连接
      device_id=$(echo "$devices_info" | awk '{print $1}')
      scrcpy -s "$device_id"
      else
      # 多个设备,显示选择界面
      device_list=()
      while IFS= read -r line; do
      id=$(echo "$line" | awk '{print $1}')
      status=$(echo "$line" | awk '{print $2}')
      device_list+=("$id" "$status")
      done <<< "$devices_info"

      selected_device=$(zenity --list \
      --title="选择 Android 设备" \
      --text="检测到多个设备,请选择要连接的设备:" \
      --column="设备 ID" --column="状态" \
      "${device_list[@]}")

      # 提取选择的设备 ID(选中的整行内容是"设备ID|状态")
      if [ -n "$selected_device" ]; then
      selected_id=$(echo "$selected_device" | awk -F'|' '{print $1}')
      scrcpy -s "$selected_id"
      fi
      fi

      将以上脚本内容保存到/usr/bin/scrcpy-auto-detect 记得将文件设置为可执行权限

  • 将最近使用的terminal显示在前台(避免打开过多的窗口导致桌面混乱)

    1. 执行sudo apt install xdotool安装软件包

    2. 将以下脚本保存到~/bin/call-recent-terminal下并追加执行可执行权限

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      #!/bin/bash
      if ! which xdotool > /dev/null 2>&1; then
      echo "You need to install xdotool package first."
      echo "sudo apt-get install xdotool"
      exit 1
      fi
      if [[ $(pgrep -x x-terminal-emul) ]]; then
      xdotool windowactivate `xdotool search --pid $(pgrep -x x-terminal-emul) | tail -1`
      else
      x-terminal-emulator
      fi
    3. 添加自定义快捷键

      Name: Launch recent terminal

      Command: ~/bin/call-recent-terminal

      Shortcut:Ctrl + Alt + R

  • 交互式截屏(类似于微信)

    1. 安装软件包sudo apt install flameshot

    2. 添加自定义快捷键

      Name: Take a screenshot interactively plus

      Command: /usr/bin/flameshot gui

      Shortcut:Shift + Ctrl + Alt + T

  • 扫描屏幕二维码

    1. 安装软件包sudo apt install flameshot

    2. 添加自定义快捷键

      Name: Scan QR Code

      Command: bash -c 'qrcode_content=$(flameshot gui -r | zbarimg -1q --raw - 2>/dev/null); if [ -n "$qrcode_content" ]; then echo "$qrcode_content" | xclip -selection clipboard && notify-send -i "dialog-information" "二维码识别成功" "已复制到剪贴板:\n$qrcode_content"; else notify-send -i "dialog-error" "二维码识别失败" "未检测到二维码!"; fi'

      Shortcut: Ctrl + Alt + Q

      1
      2
      3
      4
      5
      6
      7
      8
      #!/bin/bash
      qrcode_content=$(flameshot gui -r | zbarimg -1q --raw - 2>/dev/null)
      if [ -n "$qrcode_content" ]; then
      echo "$qrcode_content" | xclip -selection clipboard
      notify-send -i "dialog-information" "二维码识别成功" "已复制到剪贴板:\n$qrcode_content"
      else
      notify-send -i "dialog-error" "二维码识别失败" "未检测到二维码!"
      fi

      或者保存以上内容到/usr/bin/qrscan然后替换快捷键命令路径

adb shell一些实用的命令

重要文件位置

用户数据(壁纸/系统属性settings命令存储相关的)

1
/data/system/users/0

Window相关

获取当前界面的ui信息

1
uiautomator # 可用于自动化操作

获取当前window的view元素

1
wm dump-visible-window-views # 获取更详细的控件数据可以研究android.view.View#encode源码进行手动解析实现类似于uiautomator功能

Activity相关

启动Activity前停止app

1
adb shell am start-activity -S -n com.example.app/.MainActivity

启动activity并等待打开

1
adb shell am start-activity -W -n com.example.app/.MainActivity

系统属性

列出存在的属性

1
2
3
4
adb shell settings list system
adb shell settings list global
adb shell settings list secure
adb shell getprop

网络相关

WIFI相关

开启WIFI

1
adb shell cmd -w wifi set-wifi-enabled enabled

扫描WIFI

1
adb shell cmd -w wifi start-scan

列出WIFI扫描结果

1
adb shell cmd -w wifi list-scan-results

列出当前保存的WIFI列表

1
adb shell cmd -w wifi list-networks

连接指定的WIFI

1
adb shell cmd -w wifi connect-network home-wifi wpa2 password

nc命令

1
2
adb shell nc -l -p 8888 # 监听客户端连接
adb shell nc 127.0.0.1 8888 # 连接服务端

代理

设置代理

1
2
3
4
5
adb shell settings put global http_proxy 192.168.225.100:3128
adb shell settings put global global_http_proxy_host 192.168.225.100
adb shell settings put global global_http_proxy_port 3128
adb shell settings put global global_http_proxy_username foo
adb shell settings put global global_http_proxy_password bar

移除代理

1
2
3
4
5
6
7
8
adb shell settings delete global http_proxy
adb shell settings delete global global_http_proxy_host
adb shell settings delete global global_http_proxy_port
adb shell settings delete global global_http_proxy_username
adb shell settings delete global global_http_proxy_password
adb shell settings delete global global_http_proxy_exclusion_list
adb shell settings delete global global_proxy_pac_url
adb shell reboot

时间相关

设置时区

1
adb shell service call alarm 3 s16 America/Phoenix

设置时间

1
adb shell "su -c date $(date +%m%d%H%M%Y.%S)"

[!NOTE]

需要root权限

设备安全

设置不锁屏

1
adb shell locksettings set-disabled true

恢复出厂设置

1
am broadcast -a android.intent.action.FACTORY_RESET -n android/com.android.server.MasterClearReceiver

移动安全相关

监控目录下文件事件

1
2
inotifywait -r -m /path/to/directory # 监控所有事件
inotifywait -r -m -e create /path/to/directory # 监控特定事件

另辟蹊径检测app是否安装

1
stat -c %u /data/data/com.example # 测试在Android11上可用

使用Magisk root允许所有进程调试

参考:https://danylokos.github.io/0x02/

1
2
magisk resetprop ro.debuggable 1
stop; start

系统启动状态

1
2
adb shell getprop sys.boot_completed # 等于1时启动完成
adb shell getprop init.svc.bootanim # 等于stopped时开机动画完成

重启zygote进程

1
adb shell setprop ctl.restart zygote

屏幕相关

检查是否亮屏

1
adb shell dumpsys deviceidle | grep mScreenOn
1
adb shell dumpsys power | grep "Display Power"

显示触摸点

1
adb shell settings put system show_touches 1

显示触摸位置

1
adb shell settings put system pointer_location 1

录制触屏轨迹

1
2
3
adb shell getevent | grep --line-buffered ^/ | tee /tmp/android-touch-events.log # 录制

awk '{printf "%s %d %d %d\n", substr($1, 1, length($1) -1), strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4)}' /tmp/android-touch-events.log | xargs -l adb shell sendevent # 重放

语言相关

设置系统语言

1
2
3
4
5
6
7
adb shell content query --uri content://settings/system --where "name=\'system_locales\'"

adb shell content delete --uri content://settings/system --where "name=\'system_locales\'"

adb shell content insert --uri content://settings/system --bind name:s:system_locales --bind value:s:en-US
adb shell content insert --uri content://settings/system --bind name:s:system_locales --bind value:s:zh-Hant-TW
adb shell content insert --uri content://settings/system --bind name:s:system_locales --bind value:s:zh-Hant-TW,en-US,ja-JP

显示相关

字体缩放

1
2
3
4
5
adb shell settings put system font_scale 0.85 # (small)
adb shell settings put system font_scale 1.0 # (default)
adb shell settings put system font_scale 1.15 # (large)
adb shell settings put system font_scale 1.30 # (largest)
adb shell settings put system font_scale 2.0 # (sizes like this can only be achieved with custom adb setting, not from ui)

窗口管理

分屏模式Split screen

1
2
adb shell am start-activity -n com.whatsapp/.Main --windowingMode 3
adb shell am start-activity -n org.telegram.messenger/.DefaultIcon --windowingMode 4

悬浮窗模式Flating window

1
2
adb shell am start-activity -n com.whatsapp/.Main --windowingMode 5
adb shell am start-activity -n org.telegram.messenger/.DefaultIcon --windowingMode 5

账户相关

请求同步

1
requestsync

输入相关

keyevent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
0 -->  "KEYCODE_UNKNOWN" 
1 --> "KEYCODE_MENU"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME"
4 --> "KEYCODE_BACK"
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0"
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP"
25 --> "KEYCODE_VOLUME_DOWN"
26 --> "KEYCODE_POWER"
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A"
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 --> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER"
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
85 --> "TAG_LAST_KEYCODE"

进程相关

打印进程中的所有线程

1
ps -Twwww -p {pid}

命令行转义

解决多层嵌套转义

1
2
3
adb shell su <<-EOF
sed -i 's/hello" world/hello world/g' /sdcard/abc
EOF

使用here-doc的机制来避免复杂的命令增加多层转义,EOF前加-号可以确保文本内容使用tab来对齐代码

将aar文件转换成dex文件

1
~/Android/Sdk/build-tools/35.0.0/d8 --release demo.aar

查询WebView相关信息

1
adb shell dumpsys webviewupdate

电量相关

1
2
3
4
adb shell dumpsys battery set [ac|usb|wireless|status|level|temp|present|invalid]
adb shell dumpsys battery unplug # 模拟未插电
adb shell dumpsys battery reset # 恢复实际状态
adb shell dumpsys battery -h # 查看更多用法

adb shell加载termux环境

Let adb shell use termux command

通常我们调试应用的时候喜欢使用debug版rom不仅拥有root权限而且附带许多调试工具如curl、sqlite等,但是某些情况下我们可能不得不选择release版rom来调试由于该版本的特性会缺少很多调试工具使得用起来十分不顺手,因此本文介绍一下如何通过Magisk和termux来增强adb shell的使用体验。

1. Unlock root/解锁Root权限

本篇文章以Magisk Root为例,但该部分不是本文重点请自行搜索对应机型的安装方法。

另外提一下其他root软件没有经过测试也许有用。

2. Install termux terminal/安装Termux终端

https://f-droid.org/en/packages/com.termux/

3. Let’s work/adb shell加载termux环境

1
2
3
adb shell
su -c "sed -i 's/\\(com\\.termux [0-9][0-9]* \\)0/\\11/' /data/system/packages.list"
run-as com.termux files/usr/bin/bash -c 'export PATH=/data/data/com.termux/files/usr/bin:$PATH; export LD_PRELOAD=/data/data/com.termux/files/usr/lib/libtermux-exec.so; bash -i'

image-20240206144911168

4. Let’s be lazy/再懒一些使用tsh脚本

这样一个好处就是在同一个shell会话中可以直接使用tsh进入termux环境

1
2
3
adb shell
curl -L -o /data/local/tmp/tsh https://kaisar.kozow.com/2023/02/27/adb-shell%E5%8A%A0%E8%BD%BDtermux%E7%8E%AF%E5%A2%83/tsh
. /data/local/tmp/tsh

Reference|引用资料

1.https://gist.github.com/rewida17/f8564bee5a196a8f51b98cd2e53813e4

2.https://android.stackexchange.com/questions/225260/termux-running-termux-via-adb-without-any-direct-interaction-with-the-device

3.https://github.com/termux/termux-app/issues/77

解决Ubuntu 20.04无法导入Charles证书

之前在Ubuntu 16.04中使用Charles进行抓https的包一切都正常,但是最近在家里那台Ubuntu 20.04却始终装不上证书,会出现下面提示

Screenshot from 2021-12-15 15-10-52

每次导入证书右下角Import都不可点击,在Google找了很多资料都认为是一个Bug,毕竟在16.04上这么导入是没有问题的.

下面记录一下解决方案:

  1. 用命令行安装证书,首先导出Charles证书: Help->SSL Proxying->Save Charles Root Certificate, 再执行以下命令将证书导入系统

    1
    2
    mv charles.pem /usr/local/share/ca-certificates/charles.crt
    sudo update-ca-certificates
  2. 在Charles中开启SSL Proxying: Proxy->SSL Proxying Settings->SSL Proxying->Enable SSL Proxying, 点击Include下的Add按钮HostPort设置为*, 点击确定即可.

Screenshot from 2021-12-15 15-29-57

Frida开发手册

前言

以下是在使用python开发frida脚本过程中收集到的一些用法, 这里将学习的知识点做个归纳总结

Hook函数

Java普通函数

1
2
3
4
5
6
const Context = Java.use('android.content.Context');
Context.checkCallingOrSelfPermission.implementation = function (permission: string) {
// 以下两种写法都可以
// return Context.checkCallingOrSelfPermission.call(this, permission)
return this.checkCallingOrSelfPermission(permission);
}

如果没有同名的重载函数则直接调用函数的implementation来重写即可

阅读更多...

TypeScript回调函数this指向问题

最近在使用TypeScript开发frida hook时遇到一个问题,当把一个类的函数传给另一个方法作为回调函数时,this指针指向的不是原始类的示例,经过一番搜索发现有很多人也碰到同样的问题所以在此记录一下:
出问题的代码:

1
2
3
4
5
6
7
8
9
10
11
export class SetIntervalTest {
private someNumber: number = 1;

trigger() {
setInterval(this.setIntervalCallback, 400);
}

private setIntervalCallback() {
console.log(this.someNumber);
}
}

改成这样就可以了

1
2
3
private setIntervalCallback = () => {
console.log(this.someNumber);
};

因为只是为了临时解决业务问题所以暂不深究日后有空再来研究研究

相关链接:https://github.com/microsoft/TypeScript/issues/10285

解决gradle无法同步的问题

1
Could not install Gradle distribution from 'http://services.gradle.org/distributions/gradle-6.5-bin.zip'.

就在刚刚为了观摩一下libgdx引擎创建了一个工程虽然挂了梯子但是死活同步不了 不用说了肯定还是我们的万里长城防火墙搞的鬼了,感谢方校长让我们离西方的”邪恶势力”又远了一步!

好了 不吐槽了解决办法也很简单打开项目下的gradle/wrapper/gradle-wrapper.properties文件将下载地址改为https就好了

  • Copyrights © 2015-2025 Kaisar
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信