熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

深入偽UPX分析之一靜態脫殼機

2013-11-23 19:16:42  來源: Java核心技術 
    由於是算法直接解密按道理來講無所謂什麼處理不處理~~~只要是UPX算法就能搞定的…
    試了幾個都可以正常解密的解密後的程序有的可以用有的用不了但是OD全部能LOAD…
    正在研究解決中…
    寫的亂七八糟的~~~~
    貼出來給大家笑話~~~
    可能要做其它的事了麼機會再做了把重要點的代碼貼出來希望給大家有幫助
    解密代碼端的函數
    BOOL  DecryptCode()
    {
    DWORD  dwEBP = ;
    __asm
    {
    xor ediedi
    je  _LAFA
    jmp _LFEND
    _LAFA:
    mov edxxD
    ;cmp     byte ptr [esp+x] x  ;??臨時注銷
    mov esipvdUPXAddr
    xor ediedi
    je  _LBA
    jmp _LFEND
    _LBA:
    mov ecxdwUPXSize
    ;lea edidword ptr[esiecx]
    mov ediesi
    sub ediecx
    xor ecxecx
    je _LBA
    jmp _LFEND
    _LBA:
    mov eaxxD
    cmp edxeax
    not eax
    /*
    jnz _LB
    mov eaxdword ptr fs:[x]
    test eaxeax
    js  _LB
    mov eaxdword ptr [eax + xC]
    mov eaxdword ptr [eax + xC]
    mov dword ptr[eax + x]x
    mov eaxdword ptr fs:[x]
    mov eaxdword ptr[eax+x]
    movzx eaxbyte ptr[eax + x]
    test eaxeax
    jnz _LB
    jmp _LB
    _LB:
    xor eaxeax
    mov albyte ptr fs:[x]
    test eaxeax
    */


    jnz  _LB
    jmp _LB
    _LB:
    _LB:
    or  dwEBPxFFFFFFFF
    jmp _LBA
    nop
    _LB:
    mov albyte ptr[esi]
    mov byte ptr[edi]al
    inc esi
    inc edi
    _LB:
    add ebxebx
    jnz _LB
    _LBA:
    mov ebx dword ptr[esi]
    sub esi
    adc ebxebx
    _LB:
    jb  _LB
    mov eaxx
    _LB:
    add ebxebx
    jnz _LBA
    mov ebxdword ptr[esi]
    sub esi
    adc ebxebx
    _LBA:
    adc eaxeax
    add ebxebx
    jnb _LB
    jnz _LBB
    mov ebxdword ptr[esi]
    sub esi
    adc ebxebx
    jnb _LB
    _LBB:
    xor ecxecx
    sub eaxx
    jb  _LBC
    shl eaxx
    mov albyte ptr[esi]
    inc esi
    xor eax xFFFFFFFF
    je  _LCA
    mov dwEBPeax
    _LBC:
    add ebxebx
    jnz _LBD
    mov ebxdword ptr[esi]
    sub esi
    adc ebxebx
    _LBD:
    adc ecxecx
    add ebxebx
    jnz _LBE
    mov ebxdword ptr[esi]
    sub esi
    adc ebxebx
    _LBE:
    adc ecxecx
    jnz  _LC
    inc ecx
    _LBE:
    add ebxebx
    jnz _LBF
    mov ebxdword ptr[esi]
    sub esi
    adc ebxebx
    _LBF:
    adc ecxecx
    add ebxebx
    jnb _LBE
    jnz _LC
    mov ebxdword ptr[esi]
    sub esi
    adc ebxebx
    jnb _LBE
    _LC:
    add ecxx
    _LC:
    cmp dwEBPxD
    adc ecxx
    mov edxdwEBP
    lea edx dword ptr[edi + edx]
    cmp dwEBP
    jbe _LC
    _LC:
    mov albyte ptr[edx]
    mov byte ptr[edi]al
    inc edx
    inc edi
    dec ecx
    jnz _LC
    jmp _LB
    nop
    _LC:
    mov eaxdword ptr[edx]
    mov dword ptr[edi]eax
    add edxx
    add edix
    sub ecxx
    ja  _LC
    add ediecx
    jmp _LB
    _LCA:
    }
    return TRUE;
    __asm
    {
    _LFEND:
    }
    return FALSE;
    }


    //代碼段解密後會有原始PE頭只需要加個字節就是PE頭然後按PE頭來處理
    //估計是版本不同E後面的值隨即改變的
    //
    BOOL  ModfiyJmpCall()
    {
    LPBYTE  pbyte  = (LPBYTE)pvdUPXAddr;
    DWORD dwC = x;
    for(int i = x n = ; i< dwUPXSize ; i++ )
    {
    if( (pbyte[i] xE) >= x && (pbyte[i] xE) <= x
    {
    i++;
    if( pbyte[i] == x || pbyte[i] == x || pbyte[i] == x
    {
    DWORD  dwBuf = *(LPDWORD)(&pbyte[i])
    DWORD  dwA = HIWORD(dwBuf)
    //高低位互換
    BYTE  byah = LOWORD(HIBYTE(dwA))
    BYTE  byal = LOWORD(LOBYTE(dwA))
    dwA  = byal *x + byah;
    dwA   = (DWORD)&pbyte[i];
    dwA    += (DWORD)pvdUPXAddr;
    *(LPDWORD)&pbyte[i] = dwA;
    txtout(_t([%d]調用修正[x%X]: x%X <> x%X n(DWORD)&pbyte[i]dwBufdwA)
    i += x;
    n++;
    }
    }
    }
    txtout(_t(修正已經順利結束總計修正[%d <> x%X]處nn)
    return TRUE;
    }
    再說一個就是IAT表的格式為
    模塊名稱相對地址 + IAT表地址偏移 + 函數名稱列表
    函數名稱前有個標志代表是函數名稱FF代表的是HINT號
    //
    CE    DBE    lea     edi dword ptr [esi+]       ; 需要這個值計算IAT和輸入表
    C    B            mov     eax dword ptr [edi]             ; eax = [edi]
    C    C            or      eax eax
    C               je      short CBF                   ; eax = > jmp
    CA    BF          mov     ebx dword ptr [edi+]
    CD    D B lea     eax dword ptr [eax+esi+B]   ; 需要這個的
    //
    大家有興趣的可以寫了UPX不算很難的
    我可能需要做其他的事估計麼時間做了關鍵的地方都貼出來了
    應該大家都能寫出來了


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26570.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.