UPX3.03外壳段处理过程全程分析
分析的不是很好,有些东西没表达清楚,大家自己分析一哈,这个程序是我自己写的个进程管理,还没写完。。。。
UPX3.03加壳,加壳时选了加密处理,高级导入保护,模拟系统标准功能,但是再外壳段好像并没见到这几个功能。
先来个CALL公式,等会要用到。具体见附件,自己分析哈
代码:
CALL 地址计算公式:CALL下条指令开始 + E8后面的绝对偏移 = 目标地址
例如 00401B2C是当前地址,5是CALL机器码的长度;E8 CF 00 00 00是机器码
计算: 00401B2C+5+CF=00401C00 E8 CF 00 00 00就是表示CALL 00401C00.
例二: 00401B3B |. E8 C0270000 CALL decode.00404300
00401B3B+5+27C0=00404300,地址就是:CALL 00404300
例三: 00401B5F |. E8 3C1B0000 CALL decode.004036A0
00401B5F+5+1B3C=004036A0,地址就是:CALL 004036A0
00401B5F+5=下条指令开始的地址,向后移动1B3C就是目标指令的开始地址
00417550 > $ 60 PUSHAD
00417551 . BE 15604100 MOV ESI,进程管理.00416015
00417556 . 8DBE EBAFFEFF LEA EDI,DWORD PTR DS:[ESI+FFFEAFEB] ; 得到代码段的开始地址放在EDI里面
0041755C . 57 PUSH EDI
0041755D . EB 0B JMP SHORT 进程管理.0041756A
0041755F 90 NOP
00417560 > 8A06 MOV AL,BYTE PTR DS:[ESI] ; 现在分析得知00416015这个地址是我们程序代码段的开始地址,被映射到这里了,取出映射的代码的一字节
00417562 . 46 INC ESI ; 指向我们代码的下个字节
00417563 . 8807 MOV BYTE PTR DS:[EDI],AL ; EDI现在是从00401000开始的,把映射的代码放入原来我们代码的地址,那么现在知道在开始代码还原了
00417565 . 47 INC EDI ; 指向我们代码的下个地址,以便存放下个字节
00417566 > 01DB ADD EBX,EBX ; EBX+EBX,当EBX不等于0的时候就跳,那么下面如果进位加法为0,那么取出下个地址到EBX
00417568 . 75 07 JNZ SHORT 进程管理.00417571
0041756A > 8B1E MOV EBX,DWORD PTR DS:[ESI] ; 00416015这个地址放到EBX里面,
0041756C . 83EE FC SUB ESI,-4 ; 00416015加4
0041756F . 11DB ADC EBX,EBX ; 进位加法器
00417571 >^ 72 ED JB SHORT 进程管理.00417560 ; 向上跳,EBX作为跳不跳的标志,循环处理代码,一个大循环
00417573 . B8 01000000 MOV EAX,1 ; EAX=1
00417578 > 01DB ADD EBX,EBX ; EBX再加EBX,EBX在这个代码里面作为跳转标志
0041757A . 75 07 JNZ SHORT 进程管理.00417583
0041757C . 8B1E MOV EBX,DWORD PTR DS:[ESI] ; ESI指向的地址到EBX
0041757E . 83EE FC SUB ESI,-4 ; ESI加上4
00417581 . 11DB ADC EBX,EBX ; 进位加法
00417583 > 11C0 ADC EAX,EAX ; 进位加法
00417585 . 01DB ADD EBX,EBX ; EBX+EBX
00417587 .^ 73 EF JNB SHORT 进程管理.00417578
00417589 . 75 09 JNZ SHORT 进程管理.00417594 ; 跳转到下面
0041758B . 8B1E MOV EBX,DWORD PTR DS:[ESI]
0041758D . 83EE FC SUB ESI,-4
00417590 . 11DB ADC EBX,EBX
00417592 .^ 73 E4 JNB SHORT 进程管理.00417578
00417594 > 31C9 XOR ECX,ECX ; ECX清零
00417596 . 83E8 03 SUB EAX,3 &n