Release 1.7.0: reduce AV false positives (no bat updater, no silent core download, app manifest).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Navis
2026-07-28 09:09:56 +03:00
co-authored by Cursor
parent 740517dbfb
commit 29643e2157
22 changed files with 212 additions and 87 deletions
+4
View File
@@ -10,3 +10,7 @@ cmd/vpnapp/resource.syso
.navis-webview/ .navis-webview/
navis-update.bat navis-update.bat
Navis.exe.new Navis.exe.new
Navis-pending.exe
*.bak
Navis.exe.bak
+13
View File
@@ -205,3 +205,16 @@ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o dist/navis-release/darwin-amd
## Купить доступ ## Купить доступ
https://evilfox.win/ https://evilfox.win/
## Антивирусы (ложные срабатывания)
Некоторые AV (Kaspersky, Microsoft Wacatac.B!ml, Ikarus Trojan.WinGo.Agent и др.) часто помечают **любые** Go-бинарники с сетью и сменой системного прокси.
В 1.7.0 уменьшили «подозрительные» паттерны:
- нет скрытой загрузки cores при старте;
- нет `.bat`-самозамены с `del /f` + hidden detached `cmd`;
- обновление через `Navis-pending.exe` + явный флаг;
- Windows application manifest (`asInvoker`);
- metadata компании EvilFox / Product Navis.
Если Defender/KAV ругается: добавьте `Navis.exe` в исключения или отправьте файл как False Positive вендору. Надёжнее всего — подпись Authenticode (code signing certificate).
+32
View File
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.7.0.0"
processorArchitecture="*"
name="EvilFox.Navis"
type="win32"/>
<description>Navis — official NaiveProxy / Hysteria 2 client</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
</application>
</compatibility>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
</assembly>
+3 -3
View File
@@ -11,14 +11,14 @@ if errorlevel 1 (
go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest
) )
goversioninfo -icon assets\navis.ico -o cmd\vpnapp\resource.syso versioninfo.json goversioninfo -64 -icon assets\navis.ico -manifest assets\app.manifest -o cmd\vpnapp\resource.syso versioninfo.json
if errorlevel 1 exit /b 1 if errorlevel 1 exit /b 1
echo Building Navis GUI and CLI... echo Building Navis GUI and CLI...
go build -ldflags="-H windowsgui -s -w" -o Navis.exe ./cmd/vpnapp go build -ldflags="-H windowsgui -s -w" -trimpath -o Navis.exe ./cmd/vpnapp
if errorlevel 1 exit /b 1 if errorlevel 1 exit /b 1
go build -ldflags="-s -w" -o vpnclient.exe ./cmd/vpnclient go build -ldflags="-s -w" -trimpath -o vpnclient.exe ./cmd/vpnclient
if errorlevel 1 exit /b 1 if errorlevel 1 exit /b 1
echo. echo.
+6 -17
View File
@@ -8,11 +8,9 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"os/exec"
"path/filepath" "path/filepath"
"strings" "strings"
"sync" "sync"
"syscall"
"time" "time"
"unsafe" "unsafe"
@@ -59,6 +57,10 @@ type uiState struct {
} }
func main() { func main() {
if update.MaybeFinishUpdate(os.Args[1:]) {
return
}
log.SetFlags(log.LstdFlags | log.Lshortfile) log.SetFlags(log.LstdFlags | log.Lshortfile)
cfgPath, err := config.LocateConfig() cfgPath, err := config.LocateConfig()
@@ -95,9 +97,7 @@ func main() {
dataPath := filepath.Join(filepath.Dir(cfgPath), ".navis-webview") dataPath := filepath.Join(filepath.Dir(cfgPath), ".navis-webview")
_ = os.MkdirAll(dataPath, 0o755) _ = os.MkdirAll(dataPath, 0o755)
go func() { // Do NOT auto-download cores on startup — silent network+write looks like malware to AV.
_, _ = mgr.EnsureAllCores()
}()
w := webview2.NewWithOptions(webview2.WebViewOptions{ w := webview2.NewWithOptions(webview2.WebViewOptions{
Debug: false, Debug: false,
@@ -373,18 +373,7 @@ func openURL(raw string) error {
default: default:
return fmt.Errorf("разрешена только ссылка evilfox.win") return fmt.Errorf("разрешена только ссылка evilfox.win")
} }
if err := shellOpen(raw); err == nil { return shellOpen(raw)
return nil
}
// Fallbacks when ShellExecute is blocked by policy.
cmd := exec.Command("cmd", "/c", "start", "", raw)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
if err := cmd.Start(); err == nil {
return nil
}
cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", raw)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
return cmd.Start()
} }
func shellOpen(raw string) error { func shellOpen(raw string) error {
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+10 -10
View File
@@ -1,38 +1,38 @@
{ {
"version": "1.6.1", "version": "1.7.0",
"notes": "Фикс URL подписки: кнопка ↻ снова работает, сообщения об ошибке/успехе видны, лучше парсинг base64/Clash", "notes": "Меньше ложных срабатываний AV: без bat-апдейтера и тихой загрузки cores; Windows manifest; metadata EvilFox",
"platform": "windows-amd64", "platform": "windows-amd64",
"os": "windows", "os": "windows",
"arch": "amd64", "arch": "amd64",
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe",
"sha256": "b836310af1b946c98d5d84787266d79978cb6d2a45e360c9fc5cb3a0a89059e4", "sha256": "8bb8bab990292be66f169dc0a23f0aaff45cf349b6c6b5cfbef763f55cfe0d4d",
"mandatory": false, "mandatory": false,
"platforms": { "platforms": {
"windows-amd64": { "windows-amd64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe",
"sha256": "b836310af1b946c98d5d84787266d79978cb6d2a45e360c9fc5cb3a0a89059e4", "sha256": "8bb8bab990292be66f169dc0a23f0aaff45cf349b6c6b5cfbef763f55cfe0d4d",
"os": "windows", "os": "windows",
"arch": "amd64" "arch": "amd64"
}, },
"darwin-arm64": { "darwin-arm64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis",
"sha256": "94a39a127073ee299902026fe0be6f35506663fb20b9d9dde73f8f7732b1c079", "sha256": "3e544461c1ce8ec3b508639cb549a759b773da38517c98c9ca634faaf09a601c",
"os": "darwin", "os": "darwin",
"arch": "arm64", "arch": "arm64",
"dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg",
"dmg_sha256": "1880a4bac8f52e5ea0ed4f5ed6a6d796f492347a7bb1b0565b6766859839d04a", "dmg_sha256": "39e88c985867ce6ef37deb00d87e1c6669cfbc8b9f8f0589d11a3f32036a5258",
"zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.app.zip", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.app.zip",
"zip_sha256": "16711d3c0544806eefa0ca29b0d2c78b9f159c44e4e526cf05ce9ec1aaf82af9" "zip_sha256": "213fd7563e068f60a1ae2504c6e48171b9f9e3f2fe3c14ecad75ed809fa05d06"
}, },
"darwin-amd64": { "darwin-amd64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis",
"sha256": "580005bbdaeef92ae6384be7946cef103c45b1150473185bdf70538d77e3b545", "sha256": "f40a711108e78bfa1a944a1d4946549aba32cb5e00ef9035be352810c700807c",
"os": "darwin", "os": "darwin",
"arch": "amd64", "arch": "amd64",
"dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg",
"dmg_sha256": "d80bd24e467886db6fd8486f5e209cb835531b2665bac953267d0fee959dd9c0", "dmg_sha256": "c70fe7feb000eec34c0fe4ef2d05565dd0285c0c4f18a264ecad540d2c0878db",
"zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.app.zip", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.app.zip",
"zip_sha256": "d6e9876ce1a7331f9fd9f8bece86a6bce55a48d874c6e40d22292653029dc486" "zip_sha256": "5b3e3fea5aef4ac962c18a190c1943c7cfd5357ea233abbdec1d26007e1e6eb4"
} }
} }
} }
+10 -10
View File
@@ -1,38 +1,38 @@
{ {
"version": "1.6.1", "version": "1.7.0",
"notes": "Фикс URL подписки: кнопка ↻ снова работает, сообщения об ошибке/успехе видны, лучше парсинг base64/Clash", "notes": "Меньше ложных срабатываний AV: без bat-апдейтера и тихой загрузки cores; Windows manifest; metadata EvilFox",
"platform": "windows-amd64", "platform": "windows-amd64",
"os": "windows", "os": "windows",
"arch": "amd64", "arch": "amd64",
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe",
"sha256": "b836310af1b946c98d5d84787266d79978cb6d2a45e360c9fc5cb3a0a89059e4", "sha256": "8bb8bab990292be66f169dc0a23f0aaff45cf349b6c6b5cfbef763f55cfe0d4d",
"mandatory": false, "mandatory": false,
"platforms": { "platforms": {
"windows-amd64": { "windows-amd64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe",
"sha256": "b836310af1b946c98d5d84787266d79978cb6d2a45e360c9fc5cb3a0a89059e4", "sha256": "8bb8bab990292be66f169dc0a23f0aaff45cf349b6c6b5cfbef763f55cfe0d4d",
"os": "windows", "os": "windows",
"arch": "amd64" "arch": "amd64"
}, },
"darwin-arm64": { "darwin-arm64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis",
"sha256": "94a39a127073ee299902026fe0be6f35506663fb20b9d9dde73f8f7732b1c079", "sha256": "3e544461c1ce8ec3b508639cb549a759b773da38517c98c9ca634faaf09a601c",
"os": "darwin", "os": "darwin",
"arch": "arm64", "arch": "arm64",
"dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg",
"dmg_sha256": "1880a4bac8f52e5ea0ed4f5ed6a6d796f492347a7bb1b0565b6766859839d04a", "dmg_sha256": "39e88c985867ce6ef37deb00d87e1c6669cfbc8b9f8f0589d11a3f32036a5258",
"zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.app.zip", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.app.zip",
"zip_sha256": "16711d3c0544806eefa0ca29b0d2c78b9f159c44e4e526cf05ce9ec1aaf82af9" "zip_sha256": "213fd7563e068f60a1ae2504c6e48171b9f9e3f2fe3c14ecad75ed809fa05d06"
}, },
"darwin-amd64": { "darwin-amd64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis",
"sha256": "580005bbdaeef92ae6384be7946cef103c45b1150473185bdf70538d77e3b545", "sha256": "f40a711108e78bfa1a944a1d4946549aba32cb5e00ef9035be352810c700807c",
"os": "darwin", "os": "darwin",
"arch": "amd64", "arch": "amd64",
"dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg",
"dmg_sha256": "d80bd24e467886db6fd8486f5e209cb835531b2665bac953267d0fee959dd9c0", "dmg_sha256": "c70fe7feb000eec34c0fe4ef2d05565dd0285c0c4f18a264ecad540d2c0878db",
"zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.app.zip", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.app.zip",
"zip_sha256": "d6e9876ce1a7331f9fd9f8bece86a6bce55a48d874c6e40d22292653029dc486" "zip_sha256": "5b3e3fea5aef4ac962c18a190c1943c7cfd5357ea233abbdec1d26007e1e6eb4"
} }
} }
} }
+2 -1
View File
@@ -8,5 +8,6 @@ import (
) )
func applySysProcAttr(cmd *exec.Cmd) { func applySysProcAttr(cmd *exec.Cmd) {
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} const createNoWindow = 0x08000000
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: createNoWindow}
} }
+3 -1
View File
@@ -8,5 +8,7 @@ import (
) )
func applySysProcAttr(cmd *exec.Cmd) { func applySysProcAttr(cmd *exec.Cmd) {
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} // CREATE_NO_WINDOW — quieter than HideWindow for console child processes.
const createNoWindow = 0x08000000
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: createNoWindow}
} }
+4 -2
View File
@@ -143,12 +143,14 @@ func notifyInternetSettingsChanged() error {
func setWinHTTPProxy(httpHostPort string) error { func setWinHTTPProxy(httpHostPort string) error {
cmd := exec.Command("netsh", "winhttp", "set", "proxy", httpHostPort, cmd := exec.Command("netsh", "winhttp", "set", "proxy", httpHostPort,
"bypass-list=localhost;127.*;10.*;192.168.*;<local>") "bypass-list=localhost;127.*;10.*;192.168.*;<local>")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} const createNoWindow = 0x08000000
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: createNoWindow}
return cmd.Run() return cmd.Run()
} }
func resetWinHTTPProxy() error { func resetWinHTTPProxy() error {
cmd := exec.Command("netsh", "winhttp", "reset", "proxy") cmd := exec.Command("netsh", "winhttp", "reset", "proxy")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} const createNoWindow = 0x08000000
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: createNoWindow}
return cmd.Run() return cmd.Run()
} }
+1 -1
View File
@@ -17,7 +17,7 @@ import (
) )
// CurrentVersion is the shipped client version. // CurrentVersion is the shipped client version.
const CurrentVersion = "1.6.1" const CurrentVersion = "1.7.0"
// DefaultManifestURL is the update feed (hosted in the project git repo). // DefaultManifestURL is the update feed (hosted in the project git repo).
const DefaultManifestURL = "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/update.json" const DefaultManifestURL = "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/update.json"
+9
View File
@@ -0,0 +1,9 @@
//go:build !windows
package update
// MaybeFinishUpdate is Windows-only.
func MaybeFinishUpdate(args []string) bool {
_ = args
return false
}
+95 -25
View File
@@ -5,46 +5,116 @@ package update
import ( import (
"context" "context"
"fmt" "fmt"
"io"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"strconv"
"syscall" "syscall"
"time"
"golang.org/x/sys/windows"
) )
// Apply downloads the new exe and schedules replacement after exit (Windows). const finishUpdateFlag = "--navis-finish-update"
// Apply downloads the new exe and starts it to replace the running binary after exit.
// Avoids writing .bat self-replacer scripts (common AV false-positive pattern).
func Apply(ctx context.Context, manifestURL string) (string, error) { func Apply(ctx context.Context, manifestURL string) (string, error) {
latest, _, _, exe, tmp, err := prepareDownload(ctx, manifestURL) latest, _, _, exe, tmp, err := prepareDownload(ctx, manifestURL)
if err != nil { if err != nil {
return "", err return "", err
} }
dir := filepath.Dir(exe) pending := filepath.Join(filepath.Dir(exe), "Navis-pending.exe")
bat := filepath.Join(dir, "navis-update.bat") _ = os.Remove(pending)
if err := os.Rename(tmp, pending); err != nil {
script := "@echo off\r\n" + if err2 := copyFile(tmp, pending); err2 != nil {
"setlocal EnableExtensions\r\n" + _ = os.Remove(tmp)
"cd /d \"" + dir + "\"\r\n" + return "", err2
"set \"EXE=" + exe + "\"\r\n" +
"set \"NEW=" + tmp + "\"\r\n" +
":wait\r\n" +
"ping -n 2 127.0.0.1 >nul\r\n" +
"del /f /q \"%EXE%\" >nul 2>&1\r\n" +
"if exist \"%EXE%\" goto wait\r\n" +
"move /y \"%NEW%\" \"%EXE%\" >nul\r\n" +
"if not exist \"%EXE%\" exit /b 1\r\n" +
"start \"\" \"%EXE%\"\r\n" +
"exit /b 0\r\n"
if err := os.WriteFile(bat, []byte(script), 0o755); err != nil {
return "", err
} }
_ = os.Remove(tmp)
cmd := exec.Command("cmd.exe", "/C", bat)
cmd.Dir = dir
cmd.SysProcAttr = &syscall.SysProcAttr{
HideWindow: true,
CreationFlags: 0x00000008 | 0x00000200, // DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP
} }
_ = os.Chmod(pending, 0o755)
cmd := exec.Command(pending, finishUpdateFlag, strconv.Itoa(os.Getpid()), exe)
cmd.Dir = filepath.Dir(exe)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: false}
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
return "", fmt.Errorf("start updater: %w", err) return "", fmt.Errorf("start updater: %w", err)
} }
return latest, nil return latest, nil
} }
// MaybeFinishUpdate handles: Navis-pending.exe --navis-finish-update <pid> <targetExe>
// Returns true if this process was the updater and should exit.
func MaybeFinishUpdate(args []string) bool {
if len(args) < 3 || args[0] != finishUpdateFlag {
return false
}
pid, err := strconv.Atoi(args[1])
if err != nil || pid <= 0 {
return true
}
target := args[2]
self, err := os.Executable()
if err != nil {
return true
}
self, _ = filepath.Abs(self)
target, _ = filepath.Abs(target)
waitPIDExit(uint32(pid), 90*time.Second)
time.Sleep(500 * time.Millisecond)
backup := target + ".bak"
_ = os.Remove(backup)
if err := os.Rename(target, backup); err != nil {
// Still locked — wait a bit more.
time.Sleep(2 * time.Second)
_ = os.Rename(target, backup)
}
if err := copyFile(self, target); err != nil {
_ = os.Rename(backup, target)
return true
}
_ = os.Chmod(target, 0o755)
_ = os.Remove(backup)
_ = os.Remove(self)
cmd := exec.Command(target)
cmd.Dir = filepath.Dir(target)
_ = cmd.Start()
return true
}
func waitPIDExit(pid uint32, timeout time.Duration) {
const synchronize = 0x00100000
h, err := windows.OpenProcess(synchronize, false, pid)
if err != nil {
time.Sleep(1500 * time.Millisecond)
return
}
defer windows.CloseHandle(h)
ms := uint32(timeout / time.Millisecond)
if ms == 0 {
ms = 1000
}
_, _ = windows.WaitForSingleObject(h, ms)
}
func copyFile(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o755)
if err != nil {
return err
}
defer out.Close()
if _, err := io.Copy(out, in); err != nil {
return err
}
return out.Close()
}
+10 -10
View File
@@ -1,38 +1,38 @@
{ {
"version": "1.6.1", "version": "1.7.0",
"notes": "Фикс URL подписки: кнопка ↻ снова работает, сообщения об ошибке/успехе видны, лучше парсинг base64/Clash", "notes": "Меньше ложных срабатываний AV: без bat-апдейтера и тихой загрузки cores; Windows manifest; metadata EvilFox",
"platform": "windows-amd64", "platform": "windows-amd64",
"os": "windows", "os": "windows",
"arch": "amd64", "arch": "amd64",
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe",
"sha256": "b836310af1b946c98d5d84787266d79978cb6d2a45e360c9fc5cb3a0a89059e4", "sha256": "8bb8bab990292be66f169dc0a23f0aaff45cf349b6c6b5cfbef763f55cfe0d4d",
"mandatory": false, "mandatory": false,
"platforms": { "platforms": {
"windows-amd64": { "windows-amd64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe",
"sha256": "b836310af1b946c98d5d84787266d79978cb6d2a45e360c9fc5cb3a0a89059e4", "sha256": "8bb8bab990292be66f169dc0a23f0aaff45cf349b6c6b5cfbef763f55cfe0d4d",
"os": "windows", "os": "windows",
"arch": "amd64" "arch": "amd64"
}, },
"darwin-arm64": { "darwin-arm64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis",
"sha256": "94a39a127073ee299902026fe0be6f35506663fb20b9d9dde73f8f7732b1c079", "sha256": "3e544461c1ce8ec3b508639cb549a759b773da38517c98c9ca634faaf09a601c",
"os": "darwin", "os": "darwin",
"arch": "arm64", "arch": "arm64",
"dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg",
"dmg_sha256": "1880a4bac8f52e5ea0ed4f5ed6a6d796f492347a7bb1b0565b6766859839d04a", "dmg_sha256": "39e88c985867ce6ef37deb00d87e1c6669cfbc8b9f8f0589d11a3f32036a5258",
"zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.app.zip", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.app.zip",
"zip_sha256": "16711d3c0544806eefa0ca29b0d2c78b9f159c44e4e526cf05ce9ec1aaf82af9" "zip_sha256": "213fd7563e068f60a1ae2504c6e48171b9f9e3f2fe3c14ecad75ed809fa05d06"
}, },
"darwin-amd64": { "darwin-amd64": {
"url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis",
"sha256": "580005bbdaeef92ae6384be7946cef103c45b1150473185bdf70538d77e3b545", "sha256": "f40a711108e78bfa1a944a1d4946549aba32cb5e00ef9035be352810c700807c",
"os": "darwin", "os": "darwin",
"arch": "amd64", "arch": "amd64",
"dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg",
"dmg_sha256": "d80bd24e467886db6fd8486f5e209cb835531b2665bac953267d0fee959dd9c0", "dmg_sha256": "c70fe7feb000eec34c0fe4ef2d05565dd0285c0c4f18a264ecad540d2c0878db",
"zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.app.zip", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.app.zip",
"zip_sha256": "d6e9876ce1a7331f9fd9f8bece86a6bce55a48d874c6e40d22292653029dc486" "zip_sha256": "5b3e3fea5aef4ac962c18a190c1943c7cfd5357ea233abbdec1d26007e1e6eb4"
} }
} }
} }
+10 -7
View File
@@ -1,7 +1,7 @@
{ {
"FixedFileInfo": { "FixedFileInfo": {
"FileVersion": { "Major": 1, "Minor": 6, "Patch": 1, "Build": 0 }, "FileVersion": { "Major": 1, "Minor": 7, "Patch": 0, "Build": 0 },
"ProductVersion": { "Major": 1, "Minor": 6, "Patch": 1, "Build": 0 }, "ProductVersion": { "Major": 1, "Minor": 7, "Patch": 0, "Build": 0 },
"FileFlagsMask": "3f", "FileFlagsMask": "3f",
"FileFlags": "00", "FileFlags": "00",
"FileOS": "40004", "FileOS": "40004",
@@ -9,13 +9,15 @@
"FileSubType": "00" "FileSubType": "00"
}, },
"StringFileInfo": { "StringFileInfo": {
"CompanyName": "Navis", "CompanyName": "EvilFox",
"FileDescription": "Navis NaiveProxy / Hysteria 2 client for Windows and macOS", "FileDescription": "Navis VPN client (NaiveProxy / Hysteria 2)",
"FileVersion": "1.6.1.0", "FileVersion": "1.7.0.0",
"InternalName": "Navis", "InternalName": "Navis",
"LegalCopyright": "Copyright (c) EvilFox",
"OriginalFilename": "Navis.exe", "OriginalFilename": "Navis.exe",
"ProductName": "Navis", "ProductName": "Navis",
"ProductVersion": "1.6.1.0" "ProductVersion": "1.7.0.0",
"Comments": "Open-source VPN/proxy client. https://evilfox.win/"
}, },
"VarFileInfo": { "VarFileInfo": {
"Translation": { "Translation": {
@@ -23,5 +25,6 @@
"CharsetID": "04B0" "CharsetID": "04B0"
} }
}, },
"IconPath": "assets/navis.ico" "IconPath": "assets/navis.ico",
"ManifestPath": "assets/app.manifest"
} }