Static Reverse-Engineering Report · JARVIS

SheepNodeMiner 2.3.0
完整逆向工程報告

一個自稱「礦工」、實為分散式量化策略回測客戶端的 Windows 程式之完整靜態拆解。全程未執行 .exe,所有結論均來自 PyInstaller 解包、bytecode 反組譯與可複用模組實測。

版本 2.3.0 類型 PE32+ GUI x86-64 大小 173 MB 打包 PyInstaller / Python 3.13 日期 2026-06-08 風險評級:低

00執行摘要(TL;DR)

SheepNodeMiner 不是加密貨幣礦工。它是一個分散式量化交易策略回測客戶端:使用者貢獻 CPU 核心,幫中央伺服器 sheepnode.com 大規模回測交易策略參數組合(幣種 × 週期 × 多空 × 指標策略族),把通過績效門檻的策略上傳回伺服器。本質是群眾外包的 alpha 挖掘(crowd-sourced alpha mining)。

  • 運作:認領工作單 → 從 data.sheepnode.com 下載 BitMart 3 年 K 線(sha256 校驗)→ 用 seed 決定性產 N 組參數 → 逐一回測(強制 1 分鐘 intrabar 撮合,切 IS/OOS)→ 通過 gate 門檻就上傳 → 每 ~20 秒心跳 → 重複。
  • 技術:pywebview GUI、Numba JIT(可選 PyTorch/DirectML GPU)、pandas/numpy、約 40 個技術指標、進階策略含 OB_FVG / SMC / TEMA_RSI。
  • 安全:未發現惡意行為。無反調試/加殼/混淆、無 eval/exec/遠端 pickle、無資料外洩(只上傳回測結果)。Windows 端有可逆的開機自啟 + 看門狗(吃 CPU 常駐,UI 可關)。
  • 可複用:成本模型、WFE 政策、決定性參數生成、32 族參數空間 —— 反編譯出的 .pyc 已實測在乾淨 Python 3.13 直接 import 執行成功。

01樣本資訊

檔名
SheepNodeMiner-2.3.0.exe
檔案大小
173,195,161 bytes(約 173 MB)
檔案類型
PE32+ executable (GUI) x86-64, MS Windows
MD5
082ac4208d34905b0b4fbecc39c4bebc
SHA-256
973d06d19ef0ebbbb90c3441dc64b9700a17fe8b34cabc0bd51bb82e288aae12
打包器
PyInstaller(onefile),Python 3.13(bytecode magic f30d0d0a
GUI 入口
miner_gui.pyc(pywebview)
內含檔案
CArchive 4,337 個;PYZ 內 4,965 個模組

大檔來自一整套科學運算依賴:numba / llvmlite(JIT)、pandas / numpy / polars、pywebview、requests / aiohttp、plotly、以及連帶打包但未使用的 boto3 / google.auth / GitPython / pythonnet / pefile。

02分析方法與工具鏈

  1. 解包pyinstxtractor(以 Python 3.13 執行,確保 PYZ 正確 unmarshal)→ 取出 4,965 個模組與資源(含 miner_ui.html挖掘範圍.json)。
  2. 反編譯嘗試pycdc(Decompyle++)對 Python 3.13 的新 opcode CALL_KW 不完全支援,僅能還原 import 與 docstring。
  3. 全 bytecode 反組譯:改用 pycdas 產出 7 個自訂模組共約 78,000 行完整反組譯(含所有常數、名稱、控制流)。
  4. 常數抽取:自寫 Python 3.13 marshal 遞迴抽取器,列出每個模組的字串常數、函式簽名、全域名稱。
  5. 並行深度分析:5 個分析代理分頭還原(網路協定 / GUI 系統整合 / 回測引擎 / 挖礦核心 / 安全 IOC),結果交叉驗證一致。
  6. 可複用實測:將純邏輯 .pyc 放入乾淨 Python 3.13.12 環境直接 import 並呼叫,驗證可用性(見第 11 節)。

全程未執行任何 .exe。所有結論基於靜態反組譯與可獨立執行的純函式模組實測,不含動態行為觀測。

03架構總覽

除函式庫外,共 7 個自訂核心模組,分工如下:

模組角色職責
miner_gui進入點pywebview API bridge、開機自啟、看門狗、單一視窗鎖、自動更新、心跳、狀態快照
miner_client客戶端伺服器通訊協定、主迴圈、資料管理(DataMgr)、設定載入
mining_core計算核心seed 決定性參數生成、單筆回測封裝、IS/OOS 指標切分(礦工端與伺服器防作弊端共用)
backtest_runtime_core回測引擎約 40 指標、訊號生成、1m 撮合模擬、KPI、BitMart 抓取、Numba/GPU 加速
backtest_costs成本模型手續費 / 滑點唯一真實來源
sheep_backtest_policy政策canonical 回測政策常數、Walk-Forward 窗、可重現雜湊
sheep_runtime_paths路徑檔案落地路徑解析;揭露另有一套「實盤交易 GUI」
# 資料流(高層)
sheepnode.com  ──claim──▶  miner_client.run()
       ▲                         │  work_unit{symbol,tf,direction,family,n_samples,seed,gate}
       │                         ▼
     submit ◀── passed ── mining_core.gen_param_samples(family,seed,n)  ──每組──▶ backtest_runtime_core.run_backtest()
       ▲                                                                                │ (1m intrabar 撮合)
       │                                                                                ▼
   miner_gui (pywebview UI) ◀── get_state/heartbeat ──  IS/OOS metrics ── gate 過濾
       │
   data.sheepnode.com ──gz+sha256──▶ DataMgr.ensure()  (BitMart 3y K線快取)

04GUI 與系統整合(miner_gui)

pywebview 暴露給前端的 API

方法行為
ui_ready()UI_BRIDGE_OK 確認橋接,回 {ok:true}
get_state()回傳完整狀態快照(見下)
connect(token)strip token、寫入狀態、_save_config() 持久化、補一拍心跳
start() / stop()start 清暫停閘門續跑;stop 是「暫停」(保留進度、不殺進程)
set_workers(n)clamp 至 [1, MAX_WORKERS]、持久化、即時增減 worker 進程
set_autostart(on)寫/刪 HKCU Run 鍵(見持久化)
set_recover(on)建/刪 schtasks 排程(見持久化)
open_url(url)webbrowser.open() 用系統瀏覽器開連結

持久化與系統修改(僅 Windows,皆可逆、user-level)

行為位置 / 內容控制
開機自啟HKCU\Software\Microsoft\Windows\CurrentVersion\RunSheepNodeMiner"<EXE>" --autostartUI set_autostart,DeleteValue 移除
當機自復工作排程 SheepNodeMinerRecover,每 5 分鐘 "<EXE>" --watchdogUI set_recover,schtasks /delete 移除
單一視窗鎖%LOCALAPPDATA%\SheepNodeMiner\instance.lock(寫 PID)、stopped.flag啟動時自動
設定檔miner_config.json(EXE 同層)— token 明文連線時
日誌miner_error.log / miner_log.txt / miner_worker.log執行時

看門狗邏輯 _watchdog_run()

  1. stopped.flag 存在(使用者乾淨關閉)→ 不動。
  2. instance.lock 的 PID,用 OpenProcess+GetExitCodeProcess(259=STILL_ACTIVE)判存活。
  3. PID 存活 → 不動;PID 已死/無鎖(崩潰)→ Popen(_self_cmd(), DETACHED) 重開一個全新實例。

單一視窗保護 _instance_guard()

背景執行緒每 1.5 秒讀 instance.lock;若 owner PID ≠ 自己(有更晚開的視窗覆寫了鎖)→ 顯示覆蓋層、5 秒後 _terminate_all() + os._exit(0)。機制本質是「後開者贏」

自動更新 _check_update()

啟動時 GET {server}/api/mining/version(timeout 10s),解析 {version, url, notes},逐段比版本號;有新版只顯示橫幅,不自動下載、不自動執行。「前往下載」用系統瀏覽器開伺服器回傳的 url。

get_state() 狀態結構

{ status, token_set, token_mask:'', paused, running, workers_desired,
  cpu_max, cpu_recommend, active_workers,
  worker_list:[{wid,symbol,tf,direction,family,done,total}],
  session:{variants_done, passed, runtime_sec},
  log:[最近60條{t,msg}], superseded, app_version:'2.3.0',
  update:{available,latest,url,notes}, autostart, recover, platform_win }

05通訊協定與主迴圈(miner_client)

HTTP 統一封裝

所有請求經 _http_json(url, payload, timeout):有 payload 則 POST(json.dumps body),否則 GET。Header Content-Type: application/jsonUser-Agent: miner/1.0。回應 json.loads,例外吞為 None。

端點一覽

用途端點方法送出 / 收到
認領工作單{server}/api/mining/claimPOST{token} → 收 {ok, error, work_unit}
上傳結果{server}/api/mining/submitPOST送 6 欄 payload(見下)
心跳{server}/api/mining/heartbeatPOST{token, status, tasks},每 ~20s
版本檢查{server}/api/mining/versionGET{version, url, notes}
資料清單{data}/manifest.jsonGET{files:[{name, sha256_gz}]}
資料下載{data}/{csv}.gzGET收 gzip bytes(timeout 300s)

work_unit 結構

work_unit_id · symbol · tf · direction · family · n_samples · seed · data_base_url(預設 https://data.sheepnode.com) · gate{...}

submit payload(6 欄)

{ token, work_unit_id,
  results:   [通過 gate 的 sample + 回測指標],
  n_ran:     len(samples),
  client_version: 'miner/1.0',
  runtime_sec:    round(dt,1) }

每筆 result 含 IS/OOS 雙組指標:n_trades, sharpe, total_return_pct, max_drawdown_pct, win_rate_pct, profit_factor + is_n/is_ret/is_win/is_sharpe/is_dd + oos_n/oos_ret/oos_win/oos_sharpe/oos_dd

gate 門檻(欄位與預設)

gate 欄預設判定
min_oos_sharpecfg.min_sharpe(0.5)oos_sharpe ≥ 門檻
min_oos_win35oos_win ≥ 35(%)
oos_n_min / oos_n_max10 / 20010 ≤ oos_n ≤ 200
oos_ret_min / is_ret_min0 / 0oos_ret > 0 且 is_ret > 0

miner_config.json 預設

{ "server_url": "https://sheepnode.com", "token": "",
  "data_dir": "miner_data", "min_trades": 10, "min_sharpe": 0.5 }

資料管理 DataMgr

ensure(symbol, tf) 檢查 {symbol}_{tf}_3y.csv{symbol}_1m_3y.csv(主週期+1m 撮合基準),缺則下載。_download:抓 .gz → sha256 比對 manifest(校驗壓縮檔)→ gzip.decompress 落地。manifest 取不到則降級為不校驗。

06挖礦核心(mining_core)

模組自述「不依賴面板/DB/網路,純計算」——可單獨打包進礦工,也可被伺服器 import 抽樣重跑(防作弊)。不含並行、不含工作分配、不含上傳、不含 GUI 回報,這些在上層。

決定性參數生成 gen_param_samples(family, seed, n)

# 決定性的關鍵:字串化 seed 建 RNG
rng = random.Random(f"sheepnode-mine:{family}:{seed}")
# 同 (family, seed, n) → 完全相同輸出 → 伺服器可重算驗證

26 個可挖家族(MINEABLE_FAMILIES):SMA/EMA/HMA/DEMA/TEMA/WMA/KAMA_Cross、RSI、Bollinger_Touch、BB_PercentB_Revert、Stoch/CCI/WillR/MFI_Oversold、Donchian_Breakout、ADX_DI/Aroon_Cross、Aroon_Osc/ROC/CMF/EFI_Threshold、TRIX_Cross、DPO_Revert、Vortex_Cross、ATR_Band_Break、Volatility_Squeeze。

Backtester.run() → 標準化指標

呼叫引擎 run_backtest(..., require_1m_fill=True, reverse_mode=(direction=='short')) → 以切點 2025-05-27T00:00:00+00:00 把交易分 IS/OOS → 各跑 _seg_metrics(n, 複利報酬%, 勝率%, sharpe, 最大回撤%)。status 僅 ok / no_data / ERR:<類別>不做 pass 判定(門檻在 miner_client 的 gate)。

07回測引擎(backtest_runtime_core)

純後端核心,UI 入口為 Streamlit 的 backtest_panel2.py。同時是礦工的回測肌肉。

支援範圍

標的
任意 BitMart 幣種(預設 BTC_USDT),現貨/合約由 SHEEP_BITMART_KLINE_MARKET 切換
週期
1m / 5m / 15m / 30m / 1h / 2h / 4h / 1d(底層步長含 1w、1mo)
方向
多 / 空(空走 reverse_mode)
固定政策
3 年窗、強制 1 分鐘 intrabar 撮合、執行模型 main_signal_1m_microfill

進出場與撮合

績效指標公式

# Sharpe(逐K淨值,非逐筆)
bpy        = 31557600 / bar_seconds        # Julian year
rf_per_bar = (1+rf_annual)**(1/bpy) - 1
sharpe     = (mean(returns)-rf_per_bar) / std(returns,ddof=1) * sqrt(bpy)
# 另有 Sortino(下行差)、Calmar(cagr/maxdd)、CAGR、最大回撤、勝率、payoff、profit_factor、expectancy

BitMart K 線抓取

加速

Numba JIT@njit/prange,約 68 處):撮合核心、指標批次、OB_FVG/SMC/Laguerre/TEMA_RSI 模擬皆有 _nb 版本與 _py fallback。GPU 路徑(PyTorch/DirectML,run_grid_gpu、TF32)用於快速格點掃描;啟用 1m 精準撮合或動態風控策略時自動改走 CPU/Numba 逐筆。

08成本模型與回測政策

backtest_costs(成本模型)

DEFAULT_FEE_SIDE = 0.00055   # 單邊 0.055%
DEFAULT_SLIPPAGE = 0.0003    # 單邊 0.03%
來回成本 = 2*fee + 2*slip = 0.17%
# 做多淨報酬
exec_entry = entry*(1+slip)
exec_exit  = exit *(1-slip)
net = exec_exit*(1-fee)/(exec_entry*(1+fee)) - 1

sheep_backtest_policy(政策)

POLICY_VERSIONbacktest_policy_v1
BACKTEST_YEARS3
INTRABAR_MIN1(強制)
EXECUTION_MODELmain_signal_1m_microfill
WFE 總月 / IS / OOS / step36 / 18 / 6 / 6
min_positive_oos_folds2
min_wfe_ratio0.5

Walk-Forward 三折:fold1 IS[0,18)→OOS[18,24)、fold2 IS[6,24)→OOS[24,30)、fold3 IS[12,30)→OOS[30,36)。canonical_backtest_policy_payload() 把全部常數 + release 以 sha256 取前 24 字元當防作弊政策指紋validate_backtest_policy_fields() 強制 years=3、intrabar=1,否則 raise。

09網路與 IOC 清單

類型
控制伺服器https://sheepnode.com
API 端點/api/mining/claim · /submit · /heartbeat · /version
資料 CDNhttps://data.sheepnode.com(/manifest.json · /{csv}.gz)
行情來源api-cloud.bitmart.com(現貨)· api-cloud-v2.bitmart.com(合約)
本機測試(docstring)http://127.0.0.1:8093
Token 格式mtok_…(明文存 miner_config.json)
User-Agentminer/1.0(client)· miner-gui/2.3.0(GUI)
系統修改HKCU\…\Run\SheepNodeMiner · schtasks SheepNodeMinerRecover
本機落地%LOCALAPPDATA%\SheepNodeMiner\{instance.lock,stopped.flag} · miner_config.json · miner_data\

IP / .onion / webhook / pastebin / t.me / 硬編碼憑證 / API key。

10安全稽核

結論:風險低。行為與宣稱(分散式回測)完全一致,未發現惡意、隱藏外洩或程式碼執行後門。
稽核面向結果
反調試 / 反 VM / 反沙箱
加殼 / 字串混淆 / 加密 payload
eval / exec / compile
遠端 pickle / marshal 反序列化無(網路全走 json.loads)
動態下載並執行程式碼無(更新僅顯示橫幅)
subprocess僅重啟自身 + schtasks/winreg,無 shell=True
資料外洩面僅回測結果 + 進度;未碰 hostname/MAC/憑證/剪貼簿/檔案
boto3/google.auth/git/.NET/pefile連帶打包,自訂碼 0 引用(grep 確認)
持久化HKCU Run + schtasks(可逆、UI 可關、user-level)
token 儲存明文於 miner_config.json

無法排除的疑點(誠實標註)

  1. 伺服器端不可見:work_unit 由 sheepnode.com 派發,後端能否派惡意參數觸發引擎異常無法純靜態排除(未見明顯注入面,風險低)。
  2. 打包的二進位 .pyd/.dll 未做位元級逆向(皆為標準 CPython 元件)。
  3. 未做動態行為/封包側錄(依要求不執行)。

11實測證據(可複用模組)

將反編譯出的純邏輯 .pyc 放入乾淨 Python 3.13.12 環境,直接 import 即執行成功

[magic] 本機 magic = f30d0d0a              # 與打包相符
[costs] FEE_SIDE=0.00055  SLIPPAGE=0.0003  resolve_costs(None)=(0.00055, 0.0003)
[policy] backtest_policy_v1  years=3  exec=main_signal_1m_microfill
[policy] WFE folds=3  reproducible hash=570cf971303035f7abfc0aa5
[gen] mineable_families=26  deterministic=True
[gen] SMA_Cross seed=42 first={'params':{'fast':46,'slow':225},'tp_pct':0.033,'sl_pct':0.038,'max_hold':35}
[space] families=32  trade_management_combos=153600
OK — 全部可複用模組驗證通過。

12可複用價值(對自有 alpha 平台)

資產狀態價值
backtest_costs實測可用現成真實成本公式
sheep_backtest_policy實測可用IS/OOS + Walk-Forward 防過擬合框架 + 可重現雜湊
mining_core.gen_param_samples實測可用決定性參數掃描,26 族
挖掘範圍.json純資料32 族完整搜尋空間(交易管理就 153,600 組合)
backtest_runtime_core機制可行(依賴較重)完整回測引擎

最值錢的是方法論

數據策略:不必依賴它。data.sheepnode.com 需 token,且只是 BitMart 公開數據的快取。引擎內 BitMartRestClient(端點/分頁/限流)已完整還原,自己直接抓 BitMart 即可,數據主權握在自己手上。
IP 註記:本報告為第三方軟體之反編譯分析,供內部研究與方法論借鏡。若產品化對外,建議走 clean-room 重寫(用還原的方法論自己實作),IP 才乾淨且可維護(.pyc 黑箱、綁死 3.13、無原始碼難改)。

13附錄:進階策略族

策略族核心參數 / 邏輯
OB_FVG
訂單塊+公允價值缺口
連續 N 根 (C-O)/O>r 且量>均量*g 定義趨勢;OB=趨勢前紅K、FVG=綠K 缺口;W 根內「漲至 OB_High*rise_thr→跌回 OB_Low*a→漲回」開單;RSI 濾網。走 per_entry。
SMC
Smart Money Concept
對照 Pine Script:Pivot(Len,Len)、3 連同色K、突破 PH/PL 形成 OB、突破 Bearish OB 做多。
LaguerreRSI_TEMAgamma、tema_len,ATR 動態 SL/TP/Trailing(sl/tp/ts_dist/ts_act coef)。
TEMA_RSIfast/slow_len、rsi_len/thr、activation_pct、trail_ticks、mintick、tp/sl_pct、stake_pct(對應另一套實盤 GUI)。
MULTI2–8 族合成,邏輯 AND / OR / EACH_OR。

sheep_runtime_paths 揭露除「礦工」外另有實盤交易 GUI實盤程式/tema_rsi_gui_config.jsontema_rsi_state.jsonexecution_logs/)與 Streamlit 回測面板 backtest_panel2.py。SheepNode 是一套完整量化系統:研究面板 + 群眾算力礦工 + 實盤 TEMA_RSI 執行,這個 .exe 只是「群眾算力」那條手臂。