【目 标】:英雄王座 v0.001.014
【工 具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任 务】:脱马甲
【操作平台】:Windows Xp sp2
【作 者】:loveboom[DFCG][FCG][US]
【简要说明】:这里一个比较奇怪的外壳,在外面看不到关于这个壳的任何说明,壳通过一个DLL对原程序进行解压,解压完毕执行原程序,是一个比较有新意的加壳方式。
【详细过程】:
OD没什么特别的设置,打开所有异常项就行了。
先直接用Lordpe 看看这个壳的一点信息:
比较有意思,程序只用一个DLL来解压并运行程序,
因为壳是通过DLL解压后,再运行,所以我们不能直接让OD停在OEP处,因为OD一般是在程序的oep处下个cc断,这样才会中断在程序入口处。改一下OD的设置:
让OD中断在系统DLL中。
这样就可以加载程序了,因为壳后面会改IAT到壳里,所以我们先要在程序里新增一个段。我的做法是用winhex新键一个大小为35KB(这个因IAT大小而定)的空白文件,然后用LORDPE载入程序文件并新增一个段,选择从磁盘载入段就行了。
最下面那个段就是我新加的.
现在再次用OD载入目标程序,现在中断在系统中:
7C921231 C3 RETN ; 中断在系统dll中
7C921232 8BFF MOV EDI,EDI
断下后在程序的CODE段下F2断点:
然后按F9运行程序,运行后,程序中断在ShellDll.dll中,也就是DLL解码程序文件处:
100025A2 8BCE MOV ECX,ESI ; 如果没有解压完跳到这里继续
100025A4 6A 01 PUSH 1
100025A6 8B11 MOV EDX,DWORD PTR DS:[ECX] ; 中断在这里
100025A8 895424 18 MOV DWORD PTR SS:[ESP+18],EDX ; 这里的代码对原程序进行解码.
100025AC 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4]
100025AF 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
100025B3 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
100025B6 895424 20 MOV DWORD PTR SS:[ESP+20],EDX
100025BA 8D5424 18 LEA EDX,DWORD PTR SS:[ESP+18]
100025BE 8B41 0C MOV EAX,DWORD PTR DS:[ECX+C]
100025C1 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28]
100025C5 51 PUSH ECX
100025C6 55 PUSH EBP
100025C7 52 PUSH EDX
100025C8 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
100025CC 894424 30 MOV DWORD PTR SS:[ESP+30],EAX
100025D0 E8 5BEBFFFF CALL 10001130
100025D5 8B4C24 24 MOV ECX,DWORD PTR SS:[ESP+24]
100025D9 8B5424 28 MOV EDX,DWORD PTR SS:[ESP+28]
100025DD 8BC6 MOV EAX,ESI
100025DF 83C6 10 ADD ESI,10
100025E2 4B DEC EBX
100025E3 8908 MOV DWORD PTR DS:[EAX],ECX
100025E5 8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]
100025E9 8950 04 MOV DWORD PTR DS:[EAX+4],EDX
100025EC 8B5424 30 MOV EDX,DWORD PTR SS:[ESP+30]
100025F0 8948 08 MOV DWORD PTR DS:[EAX+8],ECX
100025F3 8950 0C MOV DWORD PTR DS:[EAX+C],EDX
100025F6 ^ 75 AA JNZ SHORT 100025A2 ; 没解压完跳回去
100025F8 5D POP EBP
100025F9 5B POP EBX
100025FA 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8]
100025FE C74424 34 FFFFF>MOV DWORD PTR SS:[ESP+34],-1
10002606 C1E7 04 SHL EDI,4
10002609 E8 22EAFFFF CALL 10001030
1000260E 8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]
10002612 8BC7 MOV EAX,EDI
10002614 5F POP EDI
10002615 5E POP ESI
10002616 64:890D 0000000>MOV DWORD PTR FS:[0],ECX
1000261D 83C4 30 ADD ESP,30
10002620 C2 1000 RETN 10 ; 我们可以直接在这里按F4,执行到这里
断下后,直接F4执行到10002620处,注意因为OD在程序OEP处下了cc,这里解码后的OEP部分代码错误,所以我们要在这时改一个OEP代码,然后再改回去就行了。操作完毕后再一次CODE段断点,这样就到了IAT处理块,我们来分析一下IAT的处理:
1000236B 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
1000236F C606 E9 MOV BYTE PTR DS:[ESI],0E9 ; 再一次下段后中断在这里,这里填入远程跳,让IAT的部分去壳里
10002372 2BC6 SUB EAX,ESI ; 计算跳转的距离
10002374 83C0 FB ADD EAX,-5
10002377 8946 01 MOV DWORD PTR DS:[ESI+1],EAX ; 填入跳去远程地址
1000237A 8B5424 14 MOV EDX,DWORD PTR SS:[ESP+14] ; 取要保存输入表的地址
1000237E 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] ; 取出跳去IAT的代码,用于然后比较,跳去API一般是 ff25,ff15之类的等
10002382 3D 2D8B0000 CMP EAX,8B2D &n
[1] [2] [3] [4] [5] [6] 下一页