以前也跟跟过这个壳
那我就帮楼主补充两点
正处于学习中 所以有什么不对和不足的地方请指出
1.关于SEH
壳入口处故意造成 mov [0],0的内存访问异常
来到异常处理处
00720F9A 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] ;取EXCEPTION_RECORD
00720F9E 8B52 0C MOV EDX,DWORD PTR DS:[EDX+C] ;取ExceptionAddress
00720FA1 C602 E9 MOV BYTE PTR DS:[EDX],0E9 ;修改为jmp 跳到自己要去的地方
00720FA4 83C2 05 ADD EDX,5
00720FA7 2BCA SUB ECX,EDX ;算出到要去地方的偏移
00720FA9 894A FC MOV DWORD PTR DS:[EDX-4],ECX
ret之后 就会回到CONTEXT结构里的eip处继续执行
该异常处理并没有修改eip的值 所以会跳到00401016继续执行
2.关于IAT加密
觉得这个才是重点吧 虽然说只是简单的加密下
来到处理IAT的地方
000314D9 51 PUSH ECX ;Hint
000314DA 40 INC EAX
000314DB 40 INC EAX
000314DC 50 PUSH EAX ;要处理的函数名地址
000314DD FF75 FC PUSH DWORD PTR SS:[EBP-4] ;kernel32的ImageBase
000314E0 FF93 0A210010 CALL DWORD PTR DS:[EBX+1000210A] ;我这里是call到000300DD
000300DD 55 PUSH EBP
000300DE 8BEC MOV EBP,ESP
000300E0 83C4 FC ADD ESP,-4
000300E3 53 PUSH EBX
000300E4 57 PUSH EDI
000300E5 56 PUSH ESI
000300E6 E8 00000000 CALL 000300EB
000300EB 5B POP EBX
000300EC 81EB FE103E00 SUB EBX,3E10FE
000300F2 FF75 10 PUSH DWORD PTR SS:[EBP+10]
000300F5 FF75 0C PUSH DWORD PTR SS:[EBP+C]
000300F8 FF75 08 PUSH DWORD PTR SS:[EBP+8]
000300FB FF93 2F103E00 CALL DWORD PTR DS:[EBX+3E102F] ;里面简单的封装了下GetProcAddress
00030101 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ;保存下子刚取得的函数地址
00030104 8B8B 61103E00 MOV ECX,DWORD PTR DS:[EBX+3E1061] ;获得当前所填IAT模块的ImageBase
0003010A 3B4D 08 CMP ECX,DWORD PTR SS:[EBP+8] ;判断下是不是kernel32的ImageBase
0003010D 75 63 JNZ SHORT 00030172 ;不是的话就跳走了 下面的代码就是加密了
0003010F 33C0 XOR EAX,EAX
00030111 0383 43103E00 ADD EAX,DWORD PTR DS:[EBX+3E1043] ;判断下堆地址是否存在(变形IAT用),不存在的话就申请
00030117 74 0D JE SHORT 00030126
00030119 05 07000000 ADD EAX,7
0003011E 3B83 47103E00 CMP EAX,DWORD PTR DS:[EBX+3E1047] ;判断下空间是否够用,不够用也要申请
00030124 72 25 JB SHORT 0003014B
00030126 6A 40 PUSH 40
00030128 68 00100000 PUSH 1000
0003012D 68 00100000 PUSH 1000
00030132 6A 00 PUSH 0
00030134 FF93 3F103E00 CALL DWORD PTR DS:[EBX+3E103F] ;VirtualAlloc
0003013A 8983 43103E00 MOV DWORD PTR DS:[EBX+3E1043],EAX
00030140 05 00100000 ADD EAX,1000
00030145 8983 47103E00 MOV DWORD PTR DS:[EBX+3E1047],EAX
0003014B 8DBB E9103E00 LEA EDI,DWORD PTR DS:[EBX+3E10E9] ;临时构造变形的地址
;内容为一个模板
mov eax,函数地址 5个字节大 B8+地址
jmp eax 2个字节 FFE0
00030151 8BF7 MOV ESI,EDI
00030153 81C7 01000000 ADD EDI,1 ;修改后面的立即数
00030159 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ;取出函数地址
0003015C AB STOS DWORD PTR ES:[EDI] ;存放到EDI的地址里去
0003015D 8BBB 43103E00 MOV EDI,DWORD PTR DS:[EBX+3E1043] ;这里才是真正存放变形过后的代码
00030163 8BC7 MOV EAX,EDI ;这里就return这里的地址 让IAT填充这个地址
00030165 B9 07000000 MOV ECX,7 ; 5+2 = 7
0003016A 018B 43103E00 ADD DWORD PTR DS:[EBX+3E1043],ECX ; 因为要连续存放 再把该地址add 7
00030170 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[> ;把处理过模板的内容copy到使用的地方去
00030172 5E POP ESI
00030173 5F POP EDI
00030174 5B POP EBX
00030175 C9 LEAVE
00030176 C2 0C00 RETN 0C