黑苹果折腾记

一. 硬件参数

  • 联想Y7000 1060
  • 硬盘 三星PM981

二. 参考资料

烂俗的平凡 博客

b站视频 av80803038

三. 主要工具

四. 过程

基本就是按照b站视频来的

补丁:从网盘里面下了PM981补丁

EFI:在github找的Y7000对应的EFI Y7000 EFI

系统:网盘里面的10.14应该可以,但12G 1kB/s的某网盘让我绝望,就用旁边10.15.2最新系统的白果进入恢复模式 (关机后Command + R不松手,开机一直到出现logo),然后重新安装到U盘上(用AFPS格式),再用Paragon Hard Disk Manager Copy Volomn到PM981上一块差不多大的空间即可

后续即是检查驱动是否正常,如声卡驱动等

WIFI/蓝牙需要特定的网卡型号, Intel闭源基本无解

Gradle使用说明

Gradle

1. gradle

Gradle是一个基于Apache AntApache Maven概念的项目自动化建构工具。它使用一种基于Groovy特定领域语言来声明项目设置,而不是传统的XML[2]

当前其支持的语言限于JavaGroovyScala[3],计划未来将支持更多的语言。[^1]

2. 优势

  • 自动处理包相依关系 - 取自 Maven Repos 的概念
  • 自动处理布署问题 - 取自 Ant 的概念
  • 条件判断写法直觉 - 使用 Groovy 语言

3. 使用

  • gradle daemon

    gradle daemon在后台和OS交互,提供一个JVM实例,可加快gradle build速度

  • gradle wrapper

    可直接使用gradle但建议使用gradle wrapper,这样可确保团队工作使用的是用一个版本的gradle

  • 位置

    • Windows: c://User/$USER/.gradle/
    • Linux: /home/$USER/.gradle/

    可以看到有x.x表示已经安装的版本

    或者在./wrapper/dists/x.x下的wrapper版本

    如图,我下载的gradle版本有2.3 4.10.3 5.6.3

    (Hint 如果你不用gradle用于其他生产开发,只用Android Studio,应该只有wrapper中的文件)

4. build.gradle/Groovy

下面我们结合Android Studio来说明一下gradle的使用

最核心的当然就是build.gradle文件,下面从一个简单的build.gradle[^2]为例开始说明

1
2
3
4
5
6
7
task hello {
description "Hey student! Run this one :D"
group "Our demo"
doLast {
println "Hello World!"
}
}

gradle是采用groovy语言的,所以和Java兼容,你在build.gradle里面甚至可以写class来定义类,下面是一个关于更复杂的build.gradle[^3]例子(仅用于说明groovy部分语法)

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
task groovy << {}

println "Hello Groovy!"

class JavaGreeter {
public void sayHello() {
System.out.println("Hello Java!");
}
}

JavaGreeter greeter = new JavaGreeter()
greeter.sayHello()

def foo = 6.5

println "foo has value: $foo"

println "Let's do some math. 5 + 6 = ${5 + 6}"

println "foo is of type: ${foo.class} and has value: $foo"
foo = "a string"
println "foo is now of type: ${foo.class} and has value: $foo"

def doubleIt(n) {
n + n // Note we don't need a return statement
}

foo = 5
println "doubleIt($foo) = ${doubleIt(foo)}"

foo = "foobar"
println "doubleIt($foo) = ${doubleIt(foo)}"

def noArgs() {
println "Called the no args function"
}

def oneArg(x) {
println "Called the 1 arg function with $x"
x
}

def twoArgs(x, y) {
println "Called the 2 arg function with $x and $y"
x + y
}

oneArg 500 // Look, Ma! No parentheses!
twoArgs 200, 300
noArgs()
//noArgs // Doesn't work
//twoArgs oneArg 500, 200 // Also doesn't work as it's ambiguous
twoArgs oneArg(500), 200 // Fixed the ambiguity
  • Groovy

  • 在Groovy中你可以使用Java风格的代码

    • Groovy中 ;为可选项
    • 字符串中用 $ 包裹来执行简单的Groovy代码
  • 当函数参数数量大于等于1时,可以不用加()来调用函数

    • 可以像Java一样创建类,会自动创建getter和setter方法
    • 闭包 : 有点类似C语言中的函数指针,可直接被传递,然后正常用()调用
    • 注意这里println其实就是我们熟悉的System.out.println的缩写,还有注意在groovy里面我们很多情况下是不用加括号来代表函数调用的.

最后一个例子是一个简单Android项目的例子

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
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()
jcenter()

}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.1'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter()

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}
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
apply plugin: 'com.android.application'

android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.kyle.gradletest"
minSdkVersion 28
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

5. gradle命令

1
2
3
gradle // 默认执行当前路径下的build.gradle
gradle -b test.gradle //手动指定执行文件
gradle tasks //查看当前执行文件的task,比如Java常用的task有compileJava/jar/javadoc等

6. gradle wrapper

运行任一x.gradle,附加tasks参数可发现gradle默认提供了wrapper任务

1
2
3
4
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Generates scripts (for Unix and windows) which allow you to build your project with Gradle, without having to install Gradle.

When a user executes a wrapper script the first time, the script downloads and installs the appropriate Gradle distribution and runs the build against this downloaded distribution. Any installed Gradle distribution is ignored when using the wrapper scripts.

The scripts generated by this task are intended to be committed to your version control system. This task also generates a small gradle-wrapper.jar bootstrap JAR file and properties file which should also be committed to your VCS. The scripts delegates to this JAR.

它会生成一系列脚本(分别用于Unix和Windows)gradlew和gradlew.bat,使我们可以无需安装Gradle即可使用Gradle构建项目

当我们执行包装脚本时,如果没有对应的Gradle发行版,它会自动地下载该版本 (与gradle无关) 并使用它构建,使用包装器脚本时,将忽略所有已安装的Gradle发行版。

7. 坑

1.代理

使用Android Studio你会经常浏览第三方代码,如果你的国际网速不是太好或者gradle使用代理出现问题,很大几率会导致gradle下载失败,可以手动尝试在$ProjectDir/gradle/wrapper/gradle-wrapper.properties更改gradle版本(不建议)

或者手动去官网下载,然后放置在*/dists/文件夹下面

2.版本问题
  • app/build.gradle 中的com.android.tools.build:gradle 指的是Android使用gradle的工具版本

  • $ProjectDir/gradle/wrapper/gradle-wrapper.properties 指的是gradle wraaper使用gradle的版本(有all和bin之分)

  • java版本

​ 以上三个版本都有对应关系,比如以下(实测)

​ gradle 5.6.3 暂不支持openjdk13,支持Java 8 - 11

​ gradle 2.3 不支持openjdk11,13,支持openjdk 7,8

gradle版本 Java支持版本 Java不支持版本
5.6.3 ?-8-9-10-11-? 13
2.3 ?-7-8-? 11,13

不过Android的话其实Java只能使用Java 7-8 所以目前还没有什么太大问题

3.参数选择顺序

全局property < local property < CLI < (file.gradle) in ext < (file.gradle) in task

4.在Arch中无权限执行

如果你使用Win/Linux双系统,在Linux上发现gradlew,却发现无论怎么都无法加入可执行权限

  • 原因:ntfs分区不支持linux权限系统,所以添加x权限无效
  • 解决:sh ./gradlew或者切换项目所在分区到其他分区

8. Fin

最后推荐一个系统学习Gradle的网课https://classroom.udacity.com/courses/ud867

[^1]: 参考链接 Gradle中文维基https://zh.wikipedia.org/wiki/Gradle
[^2]: 该代码来源于ud867-Gradle/1.01-Exercise-RunYourFirstTask
[^3]: 该代码来源于ud867-Gradle/1.03-Demo-GroovyFundamentals

原文作者: Kyle-Ye

原文链接: https://kyle-ye.github.io/2019/12/01/GradleIntro/

许可协议: License: CC BY 4.0本文采用 CC-BY 协议进行授权

Cheating Engine

Cheating Engine

1. Download

https://www.cheatengine.org/index.php

2. Tutorial

Step1

Step2

Exact value
    • Value = v
      • Scan Type = Exact value
      • Value Type = 4/2 Bytes (1 Byte probably won’t work)
      • First Scan
    • Change the value v
      • Choose proper Scan Type and Next Scan
      • Until there’s few left
      • Choose the best suit (Or test them one by one)

Step3

Unknown initial value
    • Scan Type = Unknown initial value
      • Value Type = 4 Bytes (For most windows app, it will use 4-byte int as the value)
    • Change the value v
      • Choose proper Scan Type and Next Scan
      • Until there’s few left
      • Choose the best suit (Or test them one by one)

Step4

Other

如果搜索不出来,表明可能不是用int/整数存储,将Value Type改为Double/Float重试

Hint: It is recommended to disable “Fast Scan” for type double

Step5 Code finder

查找代码

需求:锁定某个值,使其不能更改

  • 按照 2.1 找到地址

  • 右键Find out what writes to this address

  • 改变该值,窗口中会出现汇编代码 (改变了该值的汇编代码)

  • Step4:Replace it with nothing (n个nob)

Step6 Pointers

  • 首先找到value的地址
  • 再根据该地址找到存储该地址的指针
  • Add Address Manually

Step7 Code Injection

??

Step8 Multilevel pointers

方法一 pointer scanner
  • 找到该值,右键generate pointermap,保存为step8.scandata

  • 重新开始tutorial (记得使用相同的PW)

  • 找到该值,右键Pointer scan for this address

    Compare results with other,选择之前保存的,选择Address

    Note:对于实际游戏而言,Max level一般为8/9

    最后确认,保存结果

  • 得到一个或多个结果,多个继续change value,直到只剩下一个

  • 双击以添加到Address list中,change value to 5000,freeze it (选中地址左边的框),over

方法二 manual method
  • 找到该值,Find out what assesses to this address

  • 改变该值,发现mov [rsi+18],eax,表示偏移量为18

  • 搜索0xvalue的地址-0x18,找到该指针,循环进行以上操作,直到找到基址 (绿色)

  • 可打开Table Extra辅助记录信息,如

    1
    2
    3
    4
    5
    6
    Info about this table:
    a+18->value
    b+0->a
    c+18->b
    d+10->c
    Tutorial-x86_64.exe+306B00->d
  • 最后Add address manually,输入基址Tutorial-x86_64.exe+306B00Add offset,依次填入10 18 0 18,即可得到和上面一样的结果

Note:同样一个数据可能有多条访问到达它的路径

Step 9: Shared code

背景:Player和Monster都继承自Entity,如果让health的value不变,Monster的health也会不变

9-1

9-2

  • 首先找到Player3的health

  • 点击Find out what writes to this address,改变health值,show disassembler,stop and close unnecessary window

  • 右键选择Find out what addresses this instruction accesses

  • 依次Attack所有玩家

    依次会出现四个地址,注意右下角选择Float显示

  • 同时选择两个,右键Find xx->Mark as xx,把前两个编为group1,后两个编为group2

    • 选择任意一个Find xx->Scan for commonalities

      Double click to launch structure compare,勾选Only find matching groups

    • 或者Open dissect xx,每个都来一遍

  • 最后发现+8 是Float的health值,+14是队伍编号

  • Memory Viewer中选择Auto Assemble添加脚本

    选择Template,先添加Cheat Table framework code,再添加Code injection

    1
    2
    3
    ;注入核心代码
    cmp [rbx+14],1
    je short exit

    最后File -> Assign to current cheat table

  • 最后Active激活即可

3. Tutorial Game

4. Anti-cheating

对于上面的Tutotial如果直接修改,exe文件会改变,导致触发反作弊系统

Arch使用指南

Kyle-Arch使用指南

yay/pacman下载后不知道怎么打开,可到archlinux/package里面看file list

一、系统维护

1. 关闭端口

1
2
# fuser -k port/tcp
fuser -k 8888/tcp

2. 网络连接

更换intel-ax200后,wifi默认不保存密码(NetworkManager)

解决方案:

将Wi-Fi Security Password下面改为Store password for all users(not encrypted)

3. pacman镜像选择

1
2
3
4
5
#!/bin/bash
time=$(date "+%Y-%m-%d_%H:%M:%S")
mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup.${time}

reflector --verbose -l 200 -p http --sort rate --save /etc/pacman.d/mirrorlist

4. pacman和yay的缓存问题

1
pacman -Ss xx //模糊查找

5. N卡与图形桌面

1
rm /etc/X11/xorg.conf

先安装了nvidia nvidia-lts

然后运行了nvidia-xconfig

6. 系统修复

找到一个Live

1
2
3
4
5
6
umount /dev/xx
mount /dev/xx /mnt
chroot /mnt

// 删除相关错误驱动/配置
// 或者回滚

7. 中文输入法

fcitx / fcitx-im

fcitx-gtk2

fcitx-gtk3

1
2
3
4
## in /etc/profile
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
[email protected]=fcitx

8. yay/pacman软件安装失败

上次安装时Ctrl + C强制退出

重新安装时提示,无法安装

1
2
An error occured while extracting files
Lzma library error: No progress is possible
  • 解决方案
    • clean cache

9. 鼠标滚动速度设置

1
2
xinput list
xinput list-props <device-id>
1
2
xset q
xset mouse 3

10. 触摸板问题

1
2
libinput-gestures-setup start
// 配置文件在 ./.config/libinput-gestures.conf

参见 https://segmentfault.com/a/1190000011327776

二、软件安装

1. 建议列表

  • yay
  • zsh + oh-my-zsh
  • google-chrome (aur)
  • v2ray

三、应用说明

1. 运行QQ/Wechat

对于非 GNOME 桌面(KDE, XFCE等),需要安装 gnome-settings-daemon

1
2
/usr/lib/gsd-xsettings
#之后在快捷方式中启动QQ/Wechat即可

或者直接在 /opt/deepinwine/apps/Deepin-WeChat/run.sh 中加入如下几行:

1
2
3
4
5
6
7
8
9
 RunApp()
{
+ if [[ -z "$(ps -e | grep -o gsd-xsettings)" ]]
+ then
+ /usr/lib/gsd-xsettings &
+ fi
if [ -d "$WINEPREFIX" ]; then
UpdateApp
else

注意:启动gsd后会影响web-theme,导致Chrome主题变为白色

2. 翻译

1
trans --shell

3. Java jdk切换

1
2
archlinux-java status
sudo archlinux-java set java-13-openjdk

4. gradle

1
2
3
4
5
#version 5.6.3
gradle

#version 4.3.1
gradle4

5. sdkman

manage different sdks for you

1
2
# For help
sdk help

6. groovy

1
2
3
4
5
# shell
groovysh

# GUI
groovyConsole

7. v2ray

推荐使用官方源,会自动开机启动,如果配置文件(/etc/v2ray/)错误->找不到geosite.dat之类的,用yay v2ray把geo那几个全部下载并ln -s到和v2ray一起(/usr/bin/)

也可以使用gui客户端qv2ray

记得sudo systemctl enable v2ray

8. JetBrain

通过yay/pacman安装的JetBrain全家桶,一般默认在/opt/xx,升级时会提示非root用户,没有向该目录写入的权限,推荐

1
2
3
sudo chown -R $USER:$USER /opt/android-studio
sudo chown -R $USER:$USER /opt/pycharm-professional
sudo chown -R $USER:$USER /opt/intellij-idea-ultimate-edition

9. google-chrome

在Arch下突然就不会自动补全密码了,但选项是打开的

解决方法: 退出账户,删除所有数据,重新登录同步即可

10. KDE autostart

位置

1
2
~/.config/autostart/
~/.config/autostart-scripts/

GUI

搜索autostart即可

VPN教程

一、购买一个服务器

二、搭建Shadowsocks

  • 方法一:搬瓦工后台一键安装Shadowsocks(小白适用)
  • 方法二:SSH脚本方式安装Shadowsocks
  1. 获取SSH地址、端口和Root密码

image

  1. 下载putty开始连接

image

  • 如果这里有对话框弹出,选择是,然后在全黑的屏幕上输入 root ,回车。等五秒,按提示输入root的密码,密码就是前面刚刚重置的root密码。

  • copy你的密码,粘贴至putty(粘贴方式为单击鼠标右键,只需要右键单击一次,这里不会显示任何内容,其实是已经输入了),回车。

image

  1. SSR脚本安装正式开始

wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh

(备注:国外服务器运行脚本时容易出错,如出现错误提示 bash: wget: command not found,可以请在先执行 yum -y install wget 命令。成功后,再执行上面的命令。如果没有出现提示错误,请略过)

image
等出现了上图显示后,输入下面的脚本命令,回车:

chmod +x shadowsocks-all.sh
./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log

image
之后出现以上画面,根据需要选择,不懂的话直接选1,或者默认回车

三、如何多平台使用

  • Android:
    SS
    SSR

  • Windows:
    SS
    SSR

    四、写在最后的话

  • 理性上网,外国的月亮不一定是圆的

  • 未满18岁或没有思考能力、分辨是非能力的人请勿阅读并模仿本文章
    若使用SSR/SS并由此带来的法律问题,本人概不负责