Code Obfuscation 小筆記

我先跳做 code obfuscation (程式模糊化) 的目的, 假設大家都知道 why (為何而戰), 這裡只筆記 what and how? 

根據 [1], 我們可以做三種模糊化:

  1. Data Obfuscation
  2. Layout Obfuscation
  3. Control Obfuscation

Data obfuscation 是我們最熟悉的模糊化方式, 它是指對於變數名稱, 或者資料型態做修改. 事實上, 只要把 binary 中的 symbol strip 掉, 基本上名稱就變得亂七八糟了. 做法有二:

(1) compiler option [2]. 最厲害是 gcc 下開到 --strip=all. For object modules, this option removes all debug, comments, notes and symbols from the ELF file. For executables, this option works the same as --no_linkview.

(2) 用 command line 程式 off line 做 strip [3]. 最厲害也是開到 strip --strip=all, 不過以我粗淺地觀察, command line 多了針對特定 section 的操作, 而不是只把 section 分為 debug, comment, localsymbol, note…這幾種而已, 例如:

-R sectionname--remove-section=sectionname

附帶一提, section 的用法可以參照 ELF (Executable and Linkable format or Extensible Linking format) [4].   一個 ELF (*.o, *.so) 理所當然有一個 ELF header, 底下又分成 program header table, section, section header table 三個部分. 在 section header table 裡面就會記錄每一筆 section 在 image 中的那個位置 (offset).

至於對 data 的混淆, 個人有一點經驗可以分享. 上個世紀我做過 reverse engineering, 有一次我看到 binary 中有一串數字

5FFD:07D7 46 17 5D 74 D1 45 C7 3F dd 3FC745D1745D1746h ; 2/11
5FFD:07DF 1C C7 71 1C C7 71 CC 3F dd 3FCC71C71C71C1Ch ; 2/9
5FFD:07E7 92 24 49 92 24 49 D2 3F dd 3FD2492492492492h ; 2/7
5FFD:07EF 9A 99 99 99 99 99 D9 3F dd 3FD999999999999Ah ; 2/5
5FFD:07F7 55 55 55 55 55 55 E5 3F dd 3FE5555555555555h ; 2/3
5FFD:07FF 00 00 00 00 00 00 00 40 dd 4000000000000000h ; 2

因為太有規律了, 所以可以看出是 2/(2N+1) 的序列, 也就是:

2 * (1+1/3+1/5+1/7...)

此時搭配引用這段數字的代碼, 就可以看出是在計算:

2 * (x + x^3/3 + x^5/5 + x^7/7 + ....)

= ln(1+x) - ln(1-x)

= ln ((1+x)/(1-x))

諸如此類. 如果當初原作者把參數打亂一下, 我想破頭也很難想出來. 


 

Layout Obfuscation 是指修改 source code 的長相, 例如調整排縮 (indentation), 亂加 comment, 對 symbol 取怪名, 隨意插入不影響執行的關鍵字 [5]. 這對於已經編成 ELF 的程式當然沒用, 但是對於程式碼可直接執行的 java script 就有幫助.

Control Obfuscation 是指修改 code 的 statement 表示方式. 例如加入執行不到的 dead code, 該 call function 時把它的內容整個貼上來, 只用一個 function 但是把整包 library 塞進去. 看來這個手法主要是在 binary 的狀況下適用.

基本上, 如果做 binary release 可以用手法 1 和 3. 做 source code release 可以用手法 2. 不過接手這種 source code 的人應該心中 OOXX 吧…

[Note]

  1. Introduction to Code Obfuscation
  2. http://www.keil.com/support/man/docs/armclang_ref/armclang_ref_pge1362128923577.htm
  3. https://sourceware.org/binutils/docs/binutils/strip.html
  4. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
  5. https://codeobfus.files.wordpress.com/2010/04/layout-obfuscations.pdf

我讀 «證券分析» 第六版 – 價格與價值的背離

本書第 50 章講 “價格與價值的背離". 分析師一般不容易發現價格被低估的好標的 [1], 唯二的武器就是和同業比較以及分析公司的財務報表.

那麼分析師可以透過觀察股市週期性的波動 (包括過熱或是過分悲觀) 來盈利嗎? 作者說可以. 只要按照 SOP 就可以做到:

  1. 首先要建立一個清單, 內容要多樣化, 有領先地位 (例如道瓊成分股).
  2. 確定這些股票的正常股價. 例如 以 7~10 年間殖利率反推.
  3. 在正常值的 2/3 或 80% 時開始購買.
  4. 在高出正常值 1/3 或 20%~50% 時賣出.

這是羅傑巴柏森提出的方法, 幾乎跟小資女艾蜜莉講得一樣. 書上提到這個方法的缺點是對人類意志力的要求較高. 如果連續 13 年低迷 (1921-1933) 或是 3 年連漲 (1927-1929), 一般人會受不了 (p. 774).

當然, 作者也不贊同用槓桿來操作上面的 SOP. 他認為 “股票被低估" 跟 “股票一定會上漲" 是兩回事. 被低估是已經發生的事, 會上漲是預測未來 (p.775). 

至於買有名的股票好? 還是挖掘默默無名的股票好? 書上很明智地不做出結論, 而只是說市場的不理性可能沒有極限.  P. 777-P.778 提到許多被低估公司的清單: A 組公司 – 本益比小於 7,  B 組公司 – 股價低於流動資產的 2/3 且本益比小於 12. 勤奮的分析師不僅僅應該能從跟同業比較來判斷公司的價值是否被低估, 也應該要能看出公司是否真的很便宜. 上面這些公司都算是便宜.

然而, 如先前提到的公司要有領先地位才值得投資的話, 這些二等公司再怎麼便宜也不會被看上. 但 Graham 認為只要有一般的警覺性, 良好的判斷力, 又避免在市場過熱時投資, 買便宜的二等公司有很大的獲利機會 (P.779). 

有名公司因為收到大家的矚目, 一點風吹草動就會影響其股價. 二等公司的股價往往取決於是否有人去發掘它 (P. 780), 很容易就收到低估. 不論是股市過熱或是掉到谷底, 分析師都很難去推薦二等股票.

P.782 有一句話值得高光, “僅僅因為股息率從每年 5 美元增長到 6 美元就將股價提高 20 美元是很荒唐的, 這意味著以這個較高價格購買股票的人提前支付了未來 20 年中, 所有新股息率中獲得所有額外的股息." 翻譯成白話文就是如果股息增加, 股價還沒漲叫做便宜; 股價已經漲到位了, 多花的錢也只是再慢慢還給你而已 (順利的話).

P.783~P.785 講訴訟對股價的影響. 這裡並不是說 A 公司告 B 公司, B 公司股價跌了所以去撿便宜. 而是股東對於公司的訴訟, 例如股東不滿公司分割、併購等等. 本來股東對公司的訴訟就算失敗了也不過是 “as is", 若是成功了則股東的權益會上升, 但這邊舉的例子都是公司的股價受到訴訟而下跌到不合理的程度. 這種背離就是一個可以撿便宜的機會.

P.785~P.787 描述發行債券、優先股容易造成公司價格計算上的不直覺, 以至於算錯公司應有的價值. P. 788~790 說明併購、宣告破產的過程容易造成股價與價值背離. 

第 51 章持續講到高低知名度股票的差異.

  1. 高知名度的股票通常股價較穩定, 即使實際上變差了. 如果股價小幅下跌, 會有很多人願意進來撿便宜.
  2. 低知名度股票對壞消息非常敏感, 很容易跌到遠低於合理價之下.

低知名度股票雖然有這些劣勢, 但是假如一家低知名度公司發行一個利息保障倍數高達 12.6 倍的債券時, 看起來就具有一定的吸引力了. 因為公司只要不倒, 就會獲得強力的回報. 當然這是跟鼎鼎有名但利息保障倍數只有 2.1 倍的公司的債券相比. P. 794 舉了一家沒名氣的烘焙公司和一家有名的鋼鐵公司比較, 6 年後 (1925~1931) 小公司的利息保障倍數降到 8.1 倍, 當然是風險高了點, 但大公司的利息保障倍數更只剩一倍. P. 795 則是拿利息保障倍數 4.3 倍的小公司來舉例, 同樣 6 年後 (1922~1928), 利息倍數掉到 2.4 倍. 這種小便宜就不值得貪.

本章 P. 796~P. 799 講的是同一家公司的優先股、普通股、債券之間的價格背離. 先講結論: 如果公司發展愈來愈好, 那麼它每一種證券的價格都較容易正確估算, 普通股相對的會比較有利. 但如果公司前景變差, 優先股就會比較有利. 假設武漢肺炎變得更嚴重, 那優先股 ETF 比普通股容易領得到股息. 債券又比優先股更有保障. 如果我們能清楚分析出其中價值的背離, 我們可以在同一家公司的不同證券中做對沖 (P.796). 例如放空普通股買入債券之類的.

[Note]

  1. 連最近巴菲特都開始買 S&P500 了, 可見得現在的環境又比 Graham 的時代更困難.

AOP 小註解

此處 AOP 指 acoustics overload point, 是指麥克風可以收到的最大聲音. 大廠開的規格大約要求 AOP 在 120~130 分貝這個水準.

有人可能舉一反二, 問到最小聲可以量到多少有定義嗎? 這個值叫做 EIN (equivalent inout noise), 在 EIN 到 AOP 之間就是 dynamic range [1].

AOP_EIN-768x887

上圖可以看到 input 的分貝數 (dB) 後面寫了 SPL, output 又寫了 dBV, 這是什麼意思呢? SPL (sound pressure level) 顧名思義是聲壓的單位 [2]. 基準點是 P0.  

p0 = 20 μPa = × 10−5 Pa 

而這個 Pa 就是大氣壓力的巴 (Pa or Pascal), 一巴等於每平方米一牛頓[3], 大氣壓力是 101.325 kPa. 而基本聲壓 P0 只有 20 μPa, 可以想像這是一個很小的壓力.

SPL = Lp = 20 log10(P/P0)

這意思是說, 光是喊得很大聲沒用, 也要考量距離多遠. 比一個鞭炮在耳朵裡爆炸更大聲的是兩個鞭炮, 而不是遠處的雷聲. 現在統一用 dB SPL 來換算, 就可以得到公平的比較標準.

接著麥克風要把聲壓換成電壓來輸出, 我們才知道相對的大小聲. 這個輸出值就改用 dBV 來衡量 [4]. 這邊 V0 的基礎就是 1 伏特 (volt). 1 Volt 就是 0 dBV. 在一塊電路板上, 1 Volt 就是很大的值, 因此喊一聲的 dBV 都是負值.

例如圖中有一個 reference SPL = 94 dB SPL, 它換算的輸出電壓就是 -38 dBV. 這個輸出也稱之為 sensitivity. 根據 [1], The sensitivity of a microphone is the electrical response at its output to a given standard acoustic input.

Sensitivity 對應到 EIN 所對應的 dBV 中間的差異就是 SNR (signal to noise ratio).

[REF]

  1. https://www.invensense.com/wp-content/uploads/2015/02/AN-1112-v1.1.pdf
  2. http://www.sengpielaudio.com/TableOfSoundPressureLevels.htm
  3. https://zh.wikipedia.org/wiki/%E5%B8%95%E6%96%AF%E5%8D%A1
  4. http://www.sengpielaudio.com/calculator-db-volt.htm

升級 PHP, Debug 中

Debug 中. 已知 bug 包括格式亂掉. 有時文章最後會出現 ]]>, 這是因為 HTML 格式轉換多出來的東西

目前想到的解法就是到後台 phpmyadmin 去修改, 包括會讓第一句話字變小, 甚至不能編輯的

<![CDATA[

以及文章最後多出來的

]]>

替換掉. 

最神奇的是很多文章的圖不見了! 例如本來叫做 ABC-1.jpg, 升級 XAMPP, PHP 之後, 莫名被改成 ABC-1-1.jpg, 所以就沒有圖了. 這個要靠人工去改, 可能頭髮都白了 (呃, 已經有不少白頭髮了), 但是直接用 phpmyadmin 去改, 一下字就可以完成!

還有就是右邊的小工具不見了, 這個雖然救得回來, 但是有些相容性的問題. 本來彩券選號程式寫得好好的, 現在 JavaScript 的關鍵字居然只能全部用小寫!? 哇, 不升級一下還不知道自己落伍了.

2020 年投資計畫

訂好 2020 年的年度五大目標之後, 接下來就是認真執行了. 可控的是自己的健康, 申請專利這兩種; 一半可控的把專利實現和大客戶量產 – 包括"右邊"公司、"中間"公司和它的子公司"旁邊"公司; 幾乎不可控的是發大財這件事. 其實在這武漢肺炎肆虐的新年, 能不虧錢可能都不錯囉, 但還是要往最好的方向規劃.

首先看圖片:

如果買美國政府公債 ETF 的 GOVT[4], 那麼股價幾乎不會漲, 十年左右總共變動了5.98%. 相對的, 這至少不會虧本, 放進這裡都可以安心.

如果買全球股票 VT[1] 或是全球低波動股票 ACWV[2], 那麼股價漲幅各為 81.12% 和 93.38%. 這可以視為很不貪心的投資組合. 差別在於 VT 裡面一大堆美股, ACWV 權重最高的則是歐洲的雀巢(NESTLE SA). 如果買一堆美股 ETF 了, 再搭 VT 不如搭 ACWV. 兩者的殖利率大概是 VT = 1.8775/81.19=2.3%, ACWV = 2.436142/97.83=2.5% (按 2020/1/28 收盤價). ACWV 的缺點是規模小很多. VT 的規模有 18,500 M USD,  ACWV 只有 5,645.08 M USD.

再往上一級是 SPY 和 DIA, SPY 比 DIA 厲害一點點. 至少這十年從來沒輸過. 所以有 SPY 基本上就不需要 DIA. 除非要賭 BA 翻身. 更上面就是 QQQ 了, 股價就翻了一倍, 實在是不能不買一點, 就看何時買最好? 在美國券商開戶可以下 90 天的單子, 所以只要看好價錢, 下好單若三個月都沒成交, 再調整目標重下一次就好.

陸股 ETF 02801.HK 今天開市迄今跌 3~4% 而已, 有人堅持 26.7 港幣賣 5 萬股, 也有人堅持 26.05 港幣買 5.12 萬股. 看起來開市第一天還是有支撐. 若是有超跌再來買好了. 大陸政府應該也會搞護盤這一套. 

今年的投資我想把 ACWV 納入投資組合, 再買一點 QQQ. 新持股打算買這兩檔, 畢竟我已經有 BRK.B, KO, VDC, VIG, VPU, SPY, NOBL, 種類有點多. 最近看到 [3] 另一位廖維苡 (國泰泰享退的基金經理人之一)只以 VOO (~= SPY), QQQ, ACWV 為核心 ETF 持股, 我相當認同. 但我想我不太可能換 ETF 操作, 就用新資金慢慢買成有幾個核心 ETF 吧! 

[REF]

  1. VT
  2. ACWV
  3. Money 錢雜誌 2020 一月號, 封面故事
  4. https://rich01.com/bond-etf-treasuries-5/