首頁

2013年7月9日 星期二

**>Bootstrap/的精要及懶人包包))~!!*

**>Bootstrap/的精要及懶人包包))~!!**
**近來紅透半邊天的網頁設計無敵懶人包,
號稱是網頁攻城獅的救星**只要下載 
安裝CSS及JS檔,照著範例三兩下--
--就可以打造出質感頗佳的網頁**
**說化腐朽為神奇,莫此為甚**)/>.*
))**(還沒見識過Bootstrap的朋友,可以看這篇介紹Bootstrap網站上有--
--頗為詳細的示範與教學**
**好消息是MVP Bruce已將全站翻成正體中文版,要入手的同學切勿錯過。
另外Bootstrap網站也有人翻成簡體中文版,例如: Bootstrap中文網)
在NuGet搜尋一下bootstrap,由下載項目及次數不難想像其熱門程度!
*.
****
**讓我把Bootstrap當成"緊急又重要需立即學會"項目**
**未來ASP.NET專案範本將會以Bootstrap為基底 ~!**>
*>.
  • Visual Studio 2013 Preview - ASP.NET,
  •  MVC 5, Web API 2新功能搶先看
  • [Visual Studio] Visual Studio 2013 ASP.NET
  • 開發預覽
  • 既然Bootstrap跟jQuery一樣被採納成為ASP.NET
    的標準配備*>.**
    **套件組—Kendo UI的相容性,查了文章發現擔心是多餘的,2013.1.319版裡已經有個kendo.bootstrap.min.css,換裝之後,Kendo UI就跟Bootstrap融為一體囉! (見最下方的數字欄位及日期選擇器)
    ))
    )可以放心向Bootstrap邁進^>
    完整程式碼:  
    * (請使用NuGet下載Bootstrap及KendoUIWeb)/*
    **
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Kendo UI + Bootstrap</title>
        <link href="Content/kendo/2013.1.319/kendo.common.min.css" rel="stylesheet" />
        <link href="Content/kendo/2013.1.319/kendo.bootstrap.min.css" rel="stylesheet" />
        <link href="Content/bootstrap.min.css" rel="stylesheet" />
        <script src="Scripts/jquery-1.9.1.min.js"></script>
        <script src="Scripts/bootstrap.min.js"></script>
        <script src="Scripts/kendo/2013.1.319/kendo.web.min.js"></script>
    </head>
    <body>
        <div class="navbar">
            <div class="navbar-inner">
                <div class="container">
                    <!-- brand class is from bootstrap.css -->
                    <a class="brand" href="#">My Brand</a>
                    <div class="nav-collapse">
                        <ul class="nav">
                            <li class="active"><a href="#">Home</a></li>
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                                    Dropdown <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    <li><a href="#">Action 1</a></li>
                                    <li><a href="#">Action 2</a></li>
                                    <li class="divider"></li>
                                    <li class="nav-header">Header</li>
                                    <li><a href="#">Separated action</a></li>
                                </ul>
                            </li>
                        </ul>
                        <form class="navbar-search pull-left">
                            <input type="text" class="search-query" placeholder="Search">
                        </form>
     
                    </div>
                    <!-- /.nav-collapse -->
                </div>
            </div>
            <!-- /navbar-inner -->
        </div>
        <!-- /navbar -->
     
     
        <div style="width: 500px; margin-top: 10px;">
            <table id="kGrid">
                <thead>
                    <tr>
                        <th data-field="make">Car Make</th>
                        <th data-field="model">Car Model</th>
                        <th data-field="year">Year</th>
                        <th data-field="category">Category</th>
                        <th data-field="airconditioner">Air Conditioner</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>Volvo</td>
                        <td>S60</td>
                        <td>2010</td>
                        <td>Saloon</td>
                        <td>Yes</td>
                    </tr>
                    <tr>
                        <td>Audi</td>
                        <td>A4</td>
                        <td>2002</td>
                        <td>Saloon</td>
                        <td>Yes</td>
                    </tr>
                    <tr>
                        <td>BMW</td>
                        <td>535d</td>
                        <td>2006</td>
                        <td>Saloon</td>
                        <td>Yes</td>
                    </tr>
                    <tr>
                        <td>BMW</td>
                        <td>320d</td>
                        <td>2006</td>
                        <td>Saloon</td>
                        <td>No</td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div class="btn-group" style="margin: 9px 0;">
            <button class="btn">Left</button>
            <button class="btn">Middle</button>
            <button class="btn">Right</button>
        </div>
        <input type="text" id="kNumText" />
        <input type="text" id="kDatePicker" />
        <script>
            $("#kDatePicker").kendoDatePicker();
            $("#kNumText").kendoNumericTextBox();
            $("#kGrid").kendoGrid({ height: 150 });
        </script>
    </body>
    </html>                                                                  *
     
    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

    **))SamartAssembly.net**小測功~混淆之功具下測試**~/>

    ****SamartAssembly.net***SamartAssembly.net  
    ))>* 小測功~混淆之功具**~!
    ****反組譯是採用中介語言(.NET, Java)平台的
    共有特性,也是實務應用的資安隱憂,
    面對這個問題,最有效的解決方案--
    是 -- 混淆器(Obfuscator)~*


    **混淆器的運作原因,是解析編譯好的DLL或EXE檔,將其轉換成執行
    結果相同的組件,差別在於私有類別、屬性、方法、欄位、參數名稱
    都已改到面目全非,難以閱讀理解;更進一步還可以打亂程式碼的排列
    流程(執行順序不變)、加密程式碼中的字串常數...*

    ))~讓反組譯的程式碼亂如咒語天書,令有意破解者卻步,至少要讓對方
    追程式追到流涕痛哭。天下沒有破解不了的程式,混淆器的目標在於逼迫
    絕大部分的破解者儘早放棄,即使被破解也要對方付出極其可觀--
    --(甚至難以想像)的高昂代價**

    ****專業等級的.NET混淆器價格不斐,甚至如PreEmptive限定由銷售團隊)))
    ))再決定報價**
    **最近在估評其他軟體時看到Red Gate的SmartAssembly,標準版 
    約1,000 USD、專業版約1,500 USD,價格****貼近公司採購的其他開發元件,
    便決定實測看看**!!

    **>註: SmartAssembly有個有趣的開發者版本,不到200 USD,限制混淆後
    的程式只能在開發者自己的機器上執行,且程式會在七天後爆炸失效,
    目的是讓開發者測試混淆後的程式是否執行正常(某些混淆技巧可能導致程式
    不正常,記得要實測及適度調整混淆參數),故實務上全公司可共用一套 
    標準版/專業版,再視需要採購開發版,若不用開發版,每次上測試台前再
    統一混淆亦是可行策略**

    **SmartAssembly的 
    操作還算簡單**選取DLL或EXE,
    設定混淆參數,建置就可以--
    --得到混淆版 >>**
    **>
    SmartAssembly可混淆--
    --對象包含: Windows Form,
     WPF, Console, Silverlight XAP,
     程式庫(DLL),
     .NET Web Service,
     ASP.NET Web bin下的DLL… 等,
    原則上只要是.NET編譯出的組件(Assembly,DLL或EXE)都--
    --可以處理。除了混淆功能外,SmartAssembly還有 
    一些"額外"功能,例如:  
      ***
    1. Strong Name Siging
      為混淆後的元件加上強式簽名防止變造
    2. Automated Error Reporting
      程式當掉時蒐集錯誤資訊建立當機報告(背後會送到Red Gate的Web Service,
    3. 並可透過SmartAssembly UI瀏覽,見前圖左側選單的Reporting項目)
    ***一旦程式出錯,會彈出以下對話框(透過SDK,對話框可以客製化)*******

  • Feature Usage Reporting
    可以統計程式執行環境、各功能被使用的次數(也是透過Red Gate的
    Web Service蒐集,第一次執行前徵求使用者同意可傳送統計
    資訊較不會有爭議)

    Dependencies Merging
    1. 將參照的DLL也合併起來混淆(可提高混淆程度),並非所有DLL都適用,
    2. 3rd Party的元件可考慮改用嵌入(Embedding)做法
    3. Dependencies Embedding
      將參照DLL嵌入程式中(預設會加密、壓縮)但不進行混淆,
    4. 第一次執行時解密、解壓縮還原,能減少部署檔案數目。
    5. Pruning
      移除沒用到的Metadata,例如事件名稱、屬性、方法參數等,
    6. 讓程式碼更難解讀,也有助於減少程式檔體積。[參考]
    7. Resource Compression and Encryption
      資源壓縮及加密,第一次執行時還原,能縮小檔案體積。
    8. Other Optimization
      減少保留但未使用的記憶體、自動seal所有類別禁止繼承
    9. 回到重點 -- 混淆,SmartAssembly透過以下技巧讓反組譯的程式碼
      難以解讀,包含:
      1. 將類別、方法名稱改成看不懂的怪字
      2. 把類別的欄位名稱亂改一通,甚至讓不同類別用相同的欄位名稱
      3. 將類別A的方法搬到類別B底下,但風險較高,有時會出錯,
      4. 宜斟酌使用Control Flow Obfuscation,把程式碼的先後
      5. 順序調亂,但執行順序
      6. 保持不變 題外話: 以上四招我曾見過有人能徒手運用,直接寫出
      7. 沒人看得懂的程式碼,堪稱"人體混淆"大絕 orz   **
      8. 動態Proxy: 一律透過執行期間產生的Proxy呼叫參照DLL,
      9. 如此Assembly一旦被篡改,程式就會壞掉無法執行
      10. 字串加密: 預設.NET組件中的字串被直接儲存,檢視檔案
      11. 二進位內容時就看得到,SmartAssembly支援將字串內容加密混淆
      12. 加上註記禁止MSIL Disassembler(ildasm)對檔案進行反組譯
      13. 如果有pdb的話,混淆StackTrace中出現的原始碼檔案路徑
      接著來實測一番,以下是簡單的Console程式:
      using System;
      using System.Reflection;
      using Boo;
      using Foo;
       
      namespace ObfuscationTest
      {
          class Program
          {
              static string dllPath = @"d:\Newtonsoft.Melody.dll";
              static void Main(string[] args)
              {
                  Assembly asm = Assembly.LoadFile(dllPath);
                  Type t = asm.GetType("Newtonsoft.Melody.MelodyConverter", true);
                  foreach (var pi in t.GetProperties())
                  {
                      Console.WriteLine(pi.Name);
                  }
                  BooClass boo = new BooClass() { Name = "MelodyRO" };
                  FooClass foo = new FooClass() { Name = "MelodyROhread" };
                  Console.WriteLine("{0} / {1}", boo.Name, foo.Name);
                  string res = Console.ReadLine();
                  if (!string.IsNullOrEmpty(res))
                      throw new ApplicationException("My Bad! XD");
              }
          }
      
      

    *********
    使用反組譯工具解析ObfuscationTest.exe檔,可以看到幾乎原汁
    原味的原始程式碼:
    接著我們透過SmartAssembly惡搞一番,
    另外Build成ObfuscationTestSA.exe,
    再用反組譯工具試著打開。嗯,很好,程式碼已經被整到*都不認得*!!


    **選擇不加密字串常數,好不容易才透過程式碼中**
    **透過程式碼中( Melody ) **( MelodyROhread )**
    **找到main()的所在位置,試過連字串都加密,我選擇直接投降**
    **SmartAssembly看來是值得考慮的.NET混淆器解決方案。如果擔心專案中的程式經混淆會出問題,倒是可以先用試用版(功能完整,但編譯結果只能在有安裝程式的機器執行,七天後失效)實測評估後再考量**

    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&