电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

深入伪UPX分析之一静态脱壳机


发布日期:2022/6/10
 
由于是算法直接解密按道理来讲无所谓什么处理不处理~~~只要是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不算很难的

我可能需要做其他的事估计么时间做了关键的地方都贴出来了

应该大家都能写出来了

上一篇:详解JVM的内存管理机制

下一篇:Quartz调度框架应用总结