首页
社区
课程
招聘
PesPin 1.1外壳简略分析-----第二篇(PE头stolen)
发表于: 2005-1-9 13:38 5081

PesPin 1.1外壳简略分析-----第二篇(PE头stolen)

2005-1-9 13:38
5081

fly 说为了“方便大家查看,方便收录精华”,因此“同一主题不要开新帖”,可是偶以为,一篇文章中包含大量的代码,有点令人
望而却步,而且每段的中心不容易突出,因此还是决定开新帖!宁可不要精华,请 fly老大原谅

第三步:PE头stolen code的找回

接着上一篇第四楼,输入下面的指令

00416E79   BF 00104000      MOV EDI,PESpin.00401000                   ;开始对 “call 头部”的修复
00416E7E   B9 70B10000      MOV ECX,0B170
00416E83   B0 E8            MOV AL,0E8
00416E85   F2:AE            REPNE SCAS BYTE PTR ES:[EDI]              ;查 call
00416E87   75 4D            JNZ SHORT PESpin.00416ED6                 ;跳转表示对头部 call 型搞定啦
00416E89   8B17             MOV EDX,DWORD PTR DS:[EDI]
00416E8B   8D543A 04        LEA EDX,DWORD PTR DS:[EDX+EDI+4]
00416E8F   81FA C8014000    CMP EDX,PESpin.004001C8
00416E95  ^72 EE            JB SHORT PESpin.00416E85                  ;跳表示不是调用头部
00416E97   81FA 28044000    CMP EDX,PESpin.00400428
00416E9D  ^73 E6            JNB SHORT PESpin.00416E85                 ;跳表示不是调用头部
00416E9F   51               PUSH ECX
00416EA0   57               PUSH EDI                  
00416EA1   6A FF            PUSH -1
00416EA3   59               POP ECX                    
00416EA4   8BFA             MOV EDI,EDX
00416EA6   B0 E9            MOV AL,0E9
00416EA8   F2:AE            REPNE SCAS BYTE PTR ES:[EDI]              ;查头部的“重定向”
00416EAA   75 28            JNZ SHORT PESpin.00416ED4
00416EAC   8B1F             MOV EBX,DWORD PTR DS:[EDI]
00416EAE   8D5C3B 04        LEA EBX,DWORD PTR DS:[EBX+EDI+4]          ;得到绝对地址         
00416EB2   81FB 00104000    CMP EBX,PESpin.00401000                  
00416EB8  ^72 EE            JB SHORT PESpin.00416EA8                  ;跳表示不是“重定向”到代码段
00416EBA   81FB 70C14000    CMP EBX,PESpin.0040C170
00416EC0  ^73 E6            JNB SHORT PESpin.00416EA8                 ;跳表示不是“重定向”到代码段
00416EC2   F7D1             NOT ECX
00416EC4   49               DEC ECX
00416EC5   85C9             TEST ECX,ECX                           
00416EC7   75 0B            JNZ SHORT PESpin.00416ED4                 ;ecx!=0表示在头部中要执行“一段代码”
00416EC9   5F               POP EDI                     
00416ECA   59               POP ECX                                
00416ECB   2BDF             SUB EBX,EDI                           
00416ECD   83EB 04          SUB EBX,4                                 ;得到偏移量
00416ED0   891F             MOV DWORD PTR DS:[EDI],EBX                ;修复           
00416ED2  ^EB AF            JMP SHORT PESpin.00416E83
00416ED4   CC               INT3
00416ED5   CC               INT3
00416ED6   BF 00104000      MOV EDI,PESpin.00401000                   ;开始对 “jmp 头部”的修复,原理和前一段
00416EDB   B9 70B10000      MOV ECX,0B170                             ;差不多,就不重复了
00416EE0   B0 E9            MOV AL,0E9
00416EE2   F2:AE            REPNE SCAS BYTE PTR ES:[EDI]
00416EE4   75 58            JNZ SHORT PESpin.00416F3E
00416EE6   8B17             MOV EDX,DWORD PTR DS:[EDI]
00416EE8   8D543A 04        LEA EDX,DWORD PTR DS:[EDX+EDI+4]
00416EEC   81FA C8014000    CMP EDX,PESpin.004001C8
00416EF2  ^72 EE            JB SHORT PESpin.00416EE2
00416EF4   81FA 28044000    CMP EDX,PESpin.00400428
00416EFA  ^73 E6            JNB SHORT PESpin.00416EE2
00416EFC   51               PUSH ECX
00416EFD   57               PUSH EDI                              
00416EFE   6A FF            PUSH -1
00416F00   59               POP ECX                              
00416F01   8BFA             MOV EDI,EDX
00416F03   B0 E9            MOV AL,0E9
00416F05   F2:AE            REPNE SCAS BYTE PTR ES:[EDI]
00416F07   75 36            JNZ SHORT PESpin.00416F3F
00416F09   8B1F             MOV EBX,DWORD PTR DS:[EDI]
00416F0B   8D5C3B 04        LEA EBX,DWORD PTR DS:[EBX+EDI+4]
00416F0F   81FB 00104000    CMP EBX,PESpin.00401000
00416F15  ^72 EE            JB SHORT PESpin.00416F05
00416F17   81FB 70C14000    CMP EBX,PESpin.0040C170
00416F1D  ^73 E6            JNB SHORT PESpin.00416F05
00416F1F   F7D1             NOT ECX
00416F21   49               DEC ECX
00416F22   85C9             TEST ECX,ECX
00416F24   74 0D            JE SHORT PESpin.00416F33
00416F26   5F               POP EDI                              
00416F27   290C24           SUB DWORD PTR SS:[ESP],ECX
00416F2A   90               NOP
00416F2B   8BF2             MOV ESI,EDX
00416F2D   4F               DEC EDI                                 
00416F2E   F3:A4            REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00416F30   59               POP ECX                                 
00416F31  ^EB AD            JMP SHORT PESpin.00416EE0
00416F33   5F               POP EDI                              
00416F34   59               POP ECX                              
00416F35   2BDF             SUB EBX,EDI                        
00416F37   83EB 04          SUB EBX,4
00416F3A   891F             MOV DWORD PTR DS:[EDI],EBX              
00416F3C  ^EB A2            JMP SHORT PESpin.00416EE0
00416F3E   61               POPAD
00416F3F   CC               INT3
00416F40   CC               INT3

主要工作终于完成,呵呵。

第四步:PE头stolen code的找回,这个太容易了,当偶们修复 iat执行到伪 oep(0041390D)时,如下,
不妨单步让它运行到0041392B,就是那条 jmp语句啦

0041390D   2BC0             SUB EAX,EAX                             ;这里是原来 oep的语句,被偷在
0041390F   90               NOP                                     ;这里来了
00413910   90               NOP
00413911   90               NOP
00413912   68 1D39ACE7      PUSH E7AC391D
00413917   810424 63979418  ADD DWORD PTR SS:[ESP],18949763
0041391E   50               PUSH EAX
0041391F   90               NOP
00413920   90               NOP
00413921   90               NOP
00413922   50               PUSH EAX
00413923   90               NOP
00413924   90               NOP
00413925   90               NOP
00413926   68 30394100      PUSH PESpin.00413930
0041392B  -E9 C261FFFF      JMP PESpin.00409AF2
00413930   68 3A394100      PUSH PESpin.0041393A
00413935  -E9 E261FFFF      JMP PESpin.00409B1C
0041393A   3D B7000000      CMP EAX,0B7
0041393F   90               NOP
00413940   90               NOP
00413941   90               NOP
00413942  -E9 025AFFFF      JMP PESpin.00409349                     ;这里跳转到代码段

这时候的堆栈如下
0012F9B4   00413930  /CALL to CreateMutexA
0012F9B8   00000000  |pSecurity = NULL
0012F9BC   00000000  |InitialOwner = FALSE
0012F9C0   0040D080  \MutexName = "PE_SPIN_v1.1"

根据0041390D--00413942及堆栈数据,转到00409331,修复成:
00409331   68 80D04000    PUSH 0040D080                    
00409336   6A 00          PUSH 0
00409338   6A 00          PUSH 0
0040933A   E8 B3070000    CALL 00409AF2
0040933F   E8 D8070000    CALL 00409B1C
00409344   3D B7000000    CMP EAX,0B7
00409349   

呵呵

第五步:恢复头部:
虽然不值一提,为完整,还是说说。另起一个od,载入PESpin,把它头部中的相关数据复制粘贴过来就好啦。

第六步:patch一个anti.
在代码段下ctrl+f,搜索sub bl,[eax],找到后改成 mov bl,0

终于搞完了,用LordPE dump,注意纠正imageSize哦,再用一下ImportREC,全部完成。

后记:

notepad的脱壳和这个差不多,但是它那里对 api的修复略有不同,因为它是call [xxx],这里是jmp [xxx],注意这个差别,
修复 api时的代码就有点不而已。

感谢你耐着性子看完这篇滥文。更感谢过程中给我帮助的一位前辈,还有各位老大。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 223
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
唉 这次怎一个谢谢了得
2005-1-10 12:12
0
游客
登录 | 注册 方可回帖
返回
//