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期)