<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 5478|回復: 0
    打印 上一主題 下一主題

    指令歧義及程序飛和逆向工程的關系

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2009-4-3 00:23:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    關鍵詞: 程序 , 工程 , 逆向 , 歧義 , 指令
    hottask51 發表于 2009-2-12 08:58 裸奔式實時操作系統HotTask51 ←返回版面

    樓主: 指令歧義及程序飛和逆向工程的關系


    指令歧義及程序飛和逆向工程的關系

    1.標準程序樣例
    MOV   DPTR,#0013H;外部中斷1入口地址
    JNZ   NEXT1;ACC<>0,取INT1地址
    MOV   DPTR,#0003H;外部中斷0入口地址
    SJMP  NEXT
    NEXT1:
    RRA;
    NEXT:
    MOVC  A,@A+DPTR
    MOV   P3,A;
    LCALL XXXXH;

    2.對應標準程序樣例可等效非典指令序列
    MOV   DPTR,#0013H
    JNZ   NEXT-1;借用下條指令的操作數2的03H為一個隱含的RRA指令!
    MOV   DPTR,#0003H;低8位的03H實際為RRA指令(操作碼03H)!!!
    NEXT:
    MOVC  A,@A+DPTR
    MOV   P3,A
    LCALL XXXXH;
    可以看出,2個功能相同的指令后者很簡化,當然那個03H實際存在的概率幾乎是沒有的
    估計會有人說,為什么標準程序樣例不像如下所示???
    MOV   DPTR,#0003H;外部中斷0入口地址
    JZ    NEXT;
    MOV   DPTR,#0013H;外部中斷1入口地址
    RRA;
    NEXT:
    MOVC  A,@A+DPTR
    MOV   P3,A;
    LCALL XXXXH;
    雖然它不如2精簡,但卻通用許多,而且條理清晰,至少RRA讓人看的很明白。
    問題很好也不錯,所有逆向工程正是利用了人們善良帶來的漏洞予以攻擊。成功率幾乎為100%.
    因為逆向工程利用二次掃描技術實現代碼和數據的剝離,對于剩下的數據區再多次攻擊(虛擬機)
    直到逆向到滿意的代碼和數據的剝離結果。
    對2的攻擊會帶來以下2種程序源碼。
    3.當ACC為零時可等效為下列指令序列
    MOV   A,#00H
    MOV   DPTR,#0013H
    SJMP  NEXT1;
    NEXT1:
    MOV   DPTR,#0003H
    NEXT:
    MOVC  A,@A+DPTR
    MOV   P3,A
    LCALL 0000H;
    4.當ACC非零時可等效為下列指令序列
    MOV   A,#0FFH
    MOV   DPTR,#0013H
    SJMP  NEXT1;
    DW    9000H;其中90H為MOV DPTR,#00XXH的操作碼
    NEXT1:
    RRA;利用數據藏代碼
    NEXT:
    MOVC  A,@A+DPTR
    MOV   P3,A
    LCALL 0000H;
    而實際上我們的1個程序卻同時需要這2個源碼,因為ACC總存在0和非0兩種狀態。
    所以暴力反匯編經常會出現以下的結果
    5.
    MOV   DPTR,#0013H
    JNZ   NEXT;
    DW    9000H;這個對于搞過反匯編或熟悉51指令集的人才知道是殘缺的MOV DPTR,#00XXH
    NEXT:
    RRA
    MOVC  A,@A+DPTR
    MOV   P3,A
    LCALL XXXXH;
    當如像64K大的程序時,要有多少個象5一樣不解的結果呀。
    不管是用什么法則,如果采用暴力反匯編生成的代碼肯定不會全對。甚至導致編譯失。。!
    而遵守掃描法則的反匯編都將2判定為非法代碼序列。直接做為數據處理。這類反匯編出來的
    匯編代碼將會100%的通過匯編器的重新編譯。!
    菜農的超級反匯編軟件就是遵從了這一原則可以逆向任何“守法代碼”。
    故認為使用以下雷同的代碼來保護后跟的代碼和數據
    如6:
    JNZ   $+3;肯定運行NOP;LCALL DO_CRC;
    DW    1200H;低8位為NOP指令
    LCALL DO_CRC;CRC校驗,最終正確結果CRC=0(注意這個0將會被多次使用)
    例如都用這樣帶有指令歧義的分支代碼來保護,那么遵循任何法則的逆向工程每個分支都應該
    提供2個程序清單。
    假使有3個帶有指令歧義分支的的程序,應該最多提供4份程序清單。
    在這個分支時,用第1份看,這那個分支用第N份看,....暈否???
    菜農在這里不談如何破譯,而是“代碼隱身”,就和以前的“中斷隱身”類同。
    從以上分析,特別是2給我們的啟示,實際上程序飛也是個“代碼隱身”的問題。
    “代碼隱身”可以根據分支的條件將代碼重新組合,而程序飛也是PC值突變脫離了我們正常代碼
    序列的范圍,如進入數據區或代碼區指令的操作數1或操作數2。
    這就是為什么程序飛工作運行的莫名其妙的原因之所在。因為它是不可控的毫無任何規律可尋的。
    所有我們適當地采用例2的保護方法,將會使逆向工作更加困難,讓他們和“程序飛”打交道吧...

    菜農 HotPower@126.com 2007.11.16 于西安大雁塔菜地

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷