由于是算法直接解密按道理来讲无所谓什么处理不处理~~~只要是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不算很难的 我可能需要做其他的事估计么时间做了关键的地方都贴出来了 应该大家都能写出来了 |