PESpin1.3 的脱壳和修复
附件中有全文和脱壳产品.
这个壳花了我很多时间, 尤其是找暗桩,
差不多把 PESpin 的加壳代码分析了一遍.
附件:pespin13.zip
不忽略异常, F9, 竟然运行了.
再用进程管理器看看, 两个进程.
重新来过, 详细分析
0041211A 5D POP EBP ; 00F354
0041213E 8B95 DF4E4000 MOV EDX,DWORD PTR SS:[EBP+404EDF] ; PESpin.00400000
00412144 8B42 3C MOV EAX,DWORD PTR DS:[EDX+3C]
00412147 03C2 ADD EAX,EDX
00412149 8985 E94E4000 MOV DWORD PTR SS:[EBP+404EE9],EAX ; PESpin.00400060
00412182 C1E1 07 SHL ECX,7 ; 80
00412185 8B0C01 MOV ECX,DWORD PTR DS:[ECX+EAX] ; Import RVA
00412188 03CA ADD ECX,EDX ; PESpin.00400000
0041219B 8B59 10 MOV EBX,DWORD PTR DS:[ECX+10] ; FirstThunk(User32.dll)
0041219E 03DA ADD EBX,EDX ; PESpin.00400000
004121A0 8B1B MOV EBX,DWORD PTR DS:[EBX] ; USER32.MessageBoxA
004121A2 899D FD4E4000 MOV DWORD PTR SS:[EBP+404EFD],EBX ; [00414251]
004121A8 53 PUSH EBX
004121A9 8F85 F34C4000 POP DWORD PTR SS:[EBP+404CF3] ; [00414047]
004121BB 8B59 38 MOV EBX,DWORD PTR DS:[ECX+38] ; FirstThunk(Kernel32.dll)
004121BE 03DA ADD EBX,EDX
004121C0 8B3B MOV EDI,DWORD PTR DS:[EBX] ; KERNEL32.LoadLibraryA
004121C2 89BD A24F4000 MOV DWORD PTR SS:[EBP+404FA2],EDI ; [004142F6]
004121C8 8D5B 04 LEA EBX,DWORD PTR DS:[EBX+4]
004121CB 8B1B MOV EBX,DWORD PTR DS:[EBX] ; KERNEL32.GetProcAddress
004121CD 899D A74F4000 MOV DWORD PTR SS:[EBP+404FA7],EBX ; [004142FB]
// 下面这段循环比较巧妙, 壳反复使用这种技巧, 仔细体会
004121FD BB 27000000 MOV EBX,27
00412202 B9 84120000 MOV ECX,1284 ; 长度
00412207 8DBD D84F4000 LEA EDI,DWORD PTR SS:[EBP+404FD8] ; 41432C
0041220D 4F DEC EDI
0041221A 301C39 XOR BYTE PTR DS:[ECX+EDI],BL ; SMC 代码
0041221D FECB DEC BL
0041221F 49 DEC ECX
00412220 9C PUSHFD ; 这里很关键, 当 ECX=0, 影响 00412245 结果
0041222A C12C24 06 SHR DWORD PTR SS:[ESP],6
0041222E F71424 NOT DWORD PTR SS:[ESP]
00412231 832424 01 AND DWORD PTR SS:[ESP],1
00412235 50 PUSH EAX
00412236 52 PUSH EDX
00412237 B8 79B2DC12 MOV EAX,12DCB279
0041223C 05 444D23ED ADD EAX,ED234D44
00412241 F76424 08 MUL DWORD PTR SS:[ESP+8]
00412245 8D8428 092F4000 LEA EAX,DWORD PTR DS:[EAX+EBP+402F09] ; ECX=0 时, EAX=0, 可直接计算出口地址
0041224C 894424 08 MOV DWORD PTR SS:[ESP+8],EAX
00412250 5A POP EDX
00412251 58 POP EAX
00412252 8D6424 04 LEA ESP,DWORD PTR SS:[ESP+4]
00412256 FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 0041221A(ECX>0), 0041225D(ECX=0), 第一次
0041225D /EB 01 JMP SHORT PESpin.00412260
004122E8 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00412294(ECX>0), 004122EF(ECX=0), 第二次
004122EF E8 02000000 CALL PESpin.004122F6
// 求 Kernel32 Base Address
0041417E 8B7C24 20 MOV EDI,DWORD PTR SS:[ESP+20] ; KERNEL32.7C598989
00414182 81E7 0000FFFF AND EDI,FFFF0000
00414199 BA 246BDE21 MOV EDX,21DE6B24
0041419E 81F2 6931DE21 XOR EDX,21DE3169
004141A4 66:3917 CMP WORD PTR DS:[EDI],DX ; "MZ"
004141A7 75 17 JNZ SHORT PESpin.004141C0
004141A9 81C2 EFA5FFFF ADD EDX,FFFFA5EF ; 3C
004141AF 0FB7143A MOVZX EDX,WORD PTR DS:[EDX+EDI]
004141B3 66:F7C2 00F8 TEST DX,0F800
004141B8 75 06 JNZ SHORT PESpin.004141C0
004141BA 3B7C3A 34 CMP EDI,DWORD PTR DS:[EDX+EDI+34] ; KERNEL32.7C570000
004141BE /74 08 JE SHORT PESpin.004141C8
004141C0 81EF 00000100 SUB EDI,10000
004141C6 ^ EB C0 JMP SHORT PESpin.00414188 ; 实际到 00414199
004141C8 97 XCHG EAX,EDI ; KERNEL32.7C570000
// 求出 壳要用的其他 API, 先比较 API 名字的第三个字符, 再比较名字的 Hash
// 这里有一些 SMC, 不是很明显
004141E0 8785 014F4000 XCHG DWORD PTR SS:[EBP+404F01],EAX ; [00414255]
00414373 8BF0 MOV ESI,EAX ; KERNEL32.7C570000
00414375 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C]
00414378 FF70 7C PUSH DWORD PTR DS:[EAX+7C] ; ExportSize
0041437B 8F85 FC504000 POP DWORD PTR SS:[EBP+4050FC] ; [00414450]
00414381 8B40 78 MOV EAX,DWORD PTR DS:[EAX+78] ; ExportRVA
00414384 03C6 ADD EAX,ESI
00414386 50 PUSH EAX
00414387 8F85 F2504000 POP DWORD PTR SS:[EBP+4050F2] ; [00414446]
0041438D FF70 20 PUSH DWORD PTR DS:[EAX+20] ; AddressOfNames
00414390 5B POP EBX
00414391 03DE ADD EBX,ESI ; KERNEL32.7C570000
00414393 FF70 18 PUSH DWORD PTR DS:[EAX+18] ; NumberOfNames
00414396 8F85 DE504000 POP DWORD PTR SS:[EBP+4050DE] ; [00414432]
0041439C FF70 24 PUSH DWORD PTR DS:[EAX+24] ; AddressOfNameOrdinals
0041439F 5A POP EDX
004143A0 03D6 ADD EDX,ESI ; KERNEL32.7C570000
004143A2 FF70 1C PUSH DWORD PTR DS:[EAX+1C] ; AddressOfFunctions
004143A6 03CE ADD ECX,ESI ; KERNEL32.7C570000
004143A8 898D CE504000 MOV DWORD PTR SS:[EBP+4050CE],ECX ; [00414422]
004143B1 83C7 05 ADD EDI,5 ; 每个 API 占 5 个 byte
004143B4 833F 00 CMP DWORD PTR DS:[EDI],0 ; 00414264
004143B7 0F84 13010000 JE PESpin.004144D0 ; 所有 API 处理完了, 大出口
004143BD 8A07 MOV AL,BYTE PTR DS:[EDI]
004143BF 8885 92504000 MOV BYTE PTR SS:[EBP+405092],AL ; [004143E6]
004143C5 FF77 01 PUSH DWORD PTR DS:[EDI+1]
004143C8 8F85 BE504000 POP DWORD PTR SS:[EBP+4050BE] ; [00414412]
004143CE 53 PUSH EBX
004143CF 52 PUSH EDX
004143D0 57 PUSH EDI
004143D1 2BC9 SUB ECX,ECX
004143DF 8B3B MOV EDI,DWORD PTR DS:[EBX] ; AddressOfNames
004143E1 03FE ADD EDI,ESI ; KERNEL32.7C570000
004143E3 807F 02 69 CMP BYTE PTR DS:[EDI+2],69 ; 比较名字的第三个字符
004143E7 /75 43 JNZ SHORT PESpin.0041442C
004143E9 E8 02000000 CALL PESpin.004143F0 ; 实际上 CALL 004144D6 (计算 API 名字Hash)
00414411 3D 3368EFDA CMP EAX,DAEF6833 ; 比较 Hash
00414416 75 14 JNZ SHORT PESpin.0041442C
00414418 8D044A LEA EAX,DWORD PTR DS:[EDX+ECX*2]
0041441B 0FB700 MOVZX EAX,WORD PTR DS:[EAX]
0041441E C1E0 02 SHL EAX,2
00414421 05 58425C7C ADD EAX,7C5C4258
00414426 8B00 MOV EAX,DWORD PTR DS:[EAX]
00414428 03C6 ADD EAX,ESI
0041442A EB 0E JMP SHORT PESpin.0041443A ; 找到了一个 API, 小出口
0041442C \83C3 04 ADD EBX,4 ; Export 中下一个
0041442F 41 INC ECX
00414430 81F9 3D030000 CMP ECX,33D
00414436 ^ 75 A7 JNZ SHORT PESpin.004143DF
004144D6 52 PUSH EDX ; 对 string 计算 Hash ;
004144D7 83CA FF OR EDX,FFFFFFFF
004144E6 8A07 MOV AL,BYTE PTR DS:[EDI] ; 指向 API 名字
004144E8 0AC0 OR AL,AL
004144EA /74 32 JE SHORT PESpin.0041451E
004144FD 47 INC EDI ; KERNEL32.7C5C63CD
004144FE 32D0 XOR DL,AL
00414500 B0 08 MOV AL,8
0041450E D1EA SHR EDX,1
00414510 /73 06 JNB SHORT PESpin.00414518
00414512 |81F2 2083B8ED XOR EDX,EDB88320
00414518 \FEC8 DEC AL
0041451A ^\75 E6 JNZ SHORT PESpin.00414502 ; 实际上 0041450E
0041451C ^\EB C8 JMP SHORT PESpin.004144E6
0041451E 33FF XOR EDI,EDI
0041452C 92 XCHG EAX,EDX
0041455F 5A POP EDX ;
00414560 C3 RETN
0041443A 5F POP EDI ; PESpin.00414264
0041443B 5A POP EDX
0041443C 5B POP EBX
0041443D 0BC0 OR EAX,EAX
0041443F 0F84 8D000000 JE PESpin.004144D2
00414445 B9 30425C7C MOV ECX,7C5C4230 ; 再比较地址是否位于 Export 范围内, 如果是的话, 指向另一 DLL 的另一 API
0041444A 3BC1 CMP EAX,ECX
0041444C 76 63 JBE SHORT PESpin.004144B1
0041444E 81C1 115C0000 ADD ECX,5C11
00414454 3BC8 CMP ECX,EAX
00414456 76 59 JBE SHORT PESpin.004144B1
00414458 60 PUSHAD ; 2K 下上面的情况我们没遇到, XP 下就会遇到
00414459 8DBD AC2C4000 LEA EDI,DWORD PTR SS:[EBP+402CAC]
0041445F 96 XCHG EAX,ESI
00414460 33C9 XOR ECX,ECX
00414462 8A0431 MOV AL,BYTE PTR DS:[ECX+ESI]
00414465 3C 2E CMP AL,2E ; "."
00414467 74 04 JE SHORT PESpin.0041446D
00414469 41 INC ECX
0041446A AA STOS BYTE PTR ES:[EDI]
0041446B ^ EB F5 JMP SHORT PESpin.00414462
0041446D 41 INC ECX
0041446E 03F1 ADD ESI,ECX
00414470 56 PUSH ESI
00414471 2C 2E SUB AL,2E
00414473 AA STOS BYTE PTR ES:[EDI]
00414474 2BF9 SUB EDI,ECX
00414476 57 PUSH EDI
00414477 8DBD 104F4000 LEA EDI,DWORD PTR SS:[EBP+404F10]
0041447D B9 92000000 MOV ECX,92
00414482 FF1439 CALL DWORD PTR DS:[ECX+EDI] ; LoadLibrary
00414491 8DBD 017F1246 LEA EDI,DWORD PTR SS:[EBP+46127F01]
00414497 81EF 7E18A845 SUB EDI,45A8187E
0041449D 81EF 73172A00 SUB EDI,2A1773
004144A3 B9 97000000 MOV ECX,97
004144A8 50 PUSH EAX
004144A9 FF1439 CALL DWORD PTR DS:[ECX+EDI] ; GetProcAddress
004144AC 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
004144B0 61 POPAD
004144BA B9 E72BFFFF MOV ECX,FFFF2BE7
004144BF 32CD XOR CL,CH
004144C1 3808 CMP BYTE PTR DS:[EAX],CL ; CC, Int3
004144C3 75 03 JNZ SHORT PESpin.004144C8
004144C5 8028 00 SUB BYTE PTR DS:[EAX],0 ; 如果有断点, 这里就会触发非法访问异常
004144C8 8947 01 MOV DWORD PTR DS:[EDI+1],EAX ; 用 API 地址替换原来的 Hash
004144CB ^\E9 E1FEFFFF JMP PESpin.004143B1 ; 下一个
004144D0 0BC0 OR EAX,EAX
用到的 API 有 ExitProcess, VirtualProtect, CloseHandle, VirtualAlloc, VirtualFree, CreateFileA, ReadFile, GetTickCount,
GetModuleHandleA, CreateThread, Sleep, GetCurrentProcessId, OpenProcess, TerminateProcess, GetFileSize, GetModuleFileNameA,
CreateMutexA, CreateProcessA, GetCommandLineA, GetLastError, GetThreadContext, SetThreadContext, VirtualProtectEx, WaitForDebugEvent,
ContinueDebugEvent, ReadProcessMemory, WriteProcessMemory, VirtualQueryEx
// 继续 SMC
00412322 2BC9 SUB ECX,ECX
00412324 80C9 25 OR CL,25
00412327 8D85 48D7460F LEA EAX,DWORD PTR SS:[EBP+F46D748]
0041232D 85C0 TEST EAX,EAX
0041232F 81F3 4823D90E XOR EBX,0ED92348
00412335 49 DEC ECX
00412336 9C PUSHFD
...
0041236C ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 0041232F(ECX>0), 00412374(ECX=0), 第三次
00412374 2D A970060F SUB EAX,0F0670A9
00412379 0BC0 OR EAX,EAX
00412390 BB 3F317A02 MOV EBX,27A313F
00412395 8DBD 1DE043ED LEA EDI,DWORD PTR SS:[EBP+ED43E01D]
0041239B 81EF C17D03ED SUB EDI,ED037DC1
004123A1 68 31130000 PUSH 1331
004123A6 59 POP ECX
004123A7 C1EB 03 SHR EBX,3
004123AA /72 06 JB SHORT PESpin.004123B2
004123AC |81EB B48765F0 SUB EBX,F06587B4
004123B2 FE07 INC BYTE PTR DS:[EDI]
004123B4 301F XOR BYTE PTR DS:[EDI],BL
004123B6 47 INC EDI
004123B7 49 DEC ECX
004123B8 9C PUSHFD
...
004123E8 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 004123A7(ECX>0), 004123F2(ECX=0), 第四次
00415A24 41 INC ECX
00415A25 9C PUSHFD
...
00415A51 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00415A09(ECX<0), 00415A72(ECX=0), 第五次
// 为父进程做标志, 为子进程选另一条路
00415A72 8D85 D8624000 LEA EAX,DWORD PTR SS:[EBP+4062D8] ; 0041562C, "MDYGINTX"
00415A78 50 PUSH EAX
00415A79 6A 00 PUSH 0
00415A7B 6A 00 PUSH 0
00415A7D 8D85 8283C9ED LEA EAX,DWORD PTR SS:[EBP+EDC98382]
00415A83 2D 213489ED SUB EAX,ED893421 ;
00415A88 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.CreateMutexA
00415A8A 8985 D4624000 MOV DWORD PTR SS:[EBP+4062D4],EAX ; [00415628]
00415A90 8D85 6C1E1F03 LEA EAX,DWORD PTR SS:[EBP+31F1E6C]
00415A96 2D FCCEDE02 SUB EAX,2DECEFC
00415A9B FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.GetLastError
00415A9D BB CA7DB9FE MOV EBX,FEB97DCA
00415AA2 81EB 137DB9FE SUB EBX,FEB97D13 ; B7
00415AA8 3BC3 CMP EAX,EBX ; 相等表示 Mutex 已存在
00415AAA 9C PUSHFD ; 父子进程的命运在此决定 *******************************************
00415AAB C12C24 06 SHR DWORD PTR SS:[ESP],6
00415AAF F71424 NOT DWORD PTR SS:[ESP]
00415AB2 832424 01 AND DWORD PTR SS:[ESP],1
00415AB6 58 POP EAX
00415AB7 2BD2 SUB EDX,EDX
00415AB9 BB BAE74D02 MOV EBX,24DE7BA
00415ABE 81EB 86E74D02 SUB EBX,24DE786
00415AC4 F7E3 MUL EBX
00415AC6 81CB FE12F40E OR EBX,0EF412FE
00415ACC 8D8428 B40291ED LEA EAX,DWORD PTR DS:[EAX+EBP+ED9102B4]
00415AD3 2D 179B50ED SUB EAX,ED509B17
00415AD8 FFE0 JMP EAX ; 父进程走 00415B25, 子进程走 00415AF1
// 我们先看看父进程
// CreateProcess
00415B36 B9 00100000 MOV ECX,1000 ; size
00415B3B 6A 04 PUSH 4
00415B3D 68 00300000 PUSH 3000
00415B42 51 PUSH ECX
00415B43 6A 00 PUSH 0
00415B45 8D85 214F4000 LEA EAX,DWORD PTR SS:[EBP+404F21]
00415B4B 48 DEC EAX
00415B4C FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.VirtualAlloc
00415B4E 8985 A0624000 MOV DWORD PTR SS:[EBP+4062A0],EAX ; [004155F4], buffer1, 保留子进程的 ThreadID 和 hThread 用
00415B54 B9 00100000 MOV ECX,1000 ; size
00415B59 6A 04 PUSH 4
00415B5B 68 00300000 PUSH 3000
00415B60 51 PUSH ECX
00415B61 6A 00 PUSH 0
00415B63 8D85 214F4000 LEA EAX,DWORD PTR SS:[EBP+404F21]
00415B69 48 DEC EAX
00415B6A FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.VirtualAlloc
00415B6C 8985 C4624000 MOV DWORD PTR SS:[EBP+4062C4],EAX ; [00415618], buffer2, 给 mov reg1, [reg2+offset] 用的
00415BA0 C785 EE624000 4>MOV DWORD PTR SS:[EBP+4062EE],44 ; [00415642], StartupInfo
00415BAA 8D85 6C4F4000 LEA EAX,DWORD PTR SS:[EBP+404F6C]
00415BB0 48 DEC EAX
00415BB1 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.GetCommandLineA
00415BB3 8BF8 MOV EDI,EAX
00415BB5 8BD0 MOV EDX,EAX ; EDX -> CommandLine
00415BB7 803F 22 CMP BYTE PTR DS:[EDI],22 ; 双引号
00415BBA 75 1A JNZ SHORT PESpin.00415BD6
00415BBC 83C9 FF OR ECX,FFFFFFFF
00415BBF 47 INC EDI
00415BC0 8BF7 MOV ESI,EDI
00415BC2 B0 22 MOV AL,22
00415BC4 F2:AE REPNE SCAS BYTE PTR ES:[EDI]
00415BC6 F7D1 NOT ECX
00415BC8 49 DEC ECX ; 去掉双引号的长度
00415BC9 8BBD A0624000 MOV EDI,DWORD PTR SS:[EBP+4062A0]
00415BCF 8BDF MOV EBX,EDI ; EBX -> buffer1
00415BD1 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; 复制到 buffer1
00415BD3 2AC0 SUB AL,AL
00415BD5 AA STOS BYTE PTR ES:[EDI]
00415BE2 8DB5 EE624000 LEA ESI,DWORD PTR SS:[EBP+4062EE] ; 00415642, pStartupInfo
00415BE8 8DBD 32634000 LEA EDI,DWORD PTR SS:[EBP+406332] ; 00415686, pProcessInfo
00415BEE 8D85 5D2E8663 LEA EAX,DWORD PTR SS:[EBP+63862E5D]
00415BF4 57 PUSH EDI
00415BF5 56 PUSH ESI
00415BF6 6A 00 PUSH 0
00415BF8 6A 00 PUSH 0
00415C0B 6A 03 PUSH 3
00415C0D 6A 01 PUSH 1
00415C0F 6A 00 PUSH 0
00415C11 6A 00 PUSH 0
00415C13 2D F8DE4563 SUB EAX,6345DEF8
00415C18 52 PUSH EDX
00415C19 53 PUSH EBX
00415C1A 40 INC EAX
00415C1B FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.CreateProcessA
0012FF74 00415C1D /CALL to CreateProcessA from PESpin.00415C1B
0012FF78 00880000 |ModuleFileName = "E:\pespin13\PESpin.exe"
0012FF7C 00132610 |CommandLine = ""E:\pespin13\PESpin.exe""
0012FF80 00000000 |pProcessSecurity = NULL
0012FF84 00000000 |pThreadSecurity = NULL
0012FF88 00000001 |InheritHandles = TRUE
0012FF8C 00000003 |CreationFlags = DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS
0012FF90 00000000 |pEnvironment = NULL
0012FF94 00000000 |CurrentDir = NULL
0012FF98 00415642 |pStartupInfo = PESpin.00415642
0012FF9C 00415686 \pProcessInfo = PESpin.00415686
00415C1D 0BC0 OR EAX,EAX
00415C1F 0F84 68060000 JE PESpin.0041628D ; 不成功直接退出
// 调试循环
00415C5D 8D9D 42634000 LEA EBX,DWORD PTR SS:[EBP+406342] ; 00415696, DebugEvent
00415C63 8D85 854F4000 LEA EAX,DWORD PTR SS:[EBP+404F85]
00415C69 6A FF PUSH -1 ; 无限等待
00415C6B 53 PUSH EBX
00415C6C 48 DEC EAX
00415C6D FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.WaitForDebugEvent
00415C6F 0BC0 OR EAX,EAX
00415C71 0F84 16060000 JE PESpin.0041628D ; 结束
00415C77 8B85 42634000 MOV EAX,DWORD PTR SS:[EBP+406342] ; dwDebugEventCode
00415C7D 35 C19B54D3 XOR EAX,D3549BC1
00415C82 3D C29B54D3 CMP EAX,D3549BC2
00415C87 0F84 D4050000 JE PESpin.00416261 ; CREATE_PROCESS_DEBUG_EVENT, 好象没干什么活, 最后跳到 00415CB5
00415C8D 3D C09B54D3 CMP EAX,D3549BC0
00415C92 74 50 JE SHORT PESpin.00415CE4 ; EXCEPTION_DEBUG_EVENT
00415C94 3D C49B54D3 CMP EAX,D3549BC4
00415C99 0F84 EE050000 JE PESpin.0041628D ; EXIT_PROCESS_DEBUG_EVENT
00415C9F 3D C39B54D3 CMP EAX,D3549BC3
00415CA4 0F84 33050000 JE PESpin.004161DD ; CREATE_THREAD_DEBUG_EVENT, 增加成员到 Buffer1
00415CAA 3D C59B54D3 CMP EAX,D3549BC5
00415CAF 0F84 69050000 JE PESpin.0041621E ; EXIT_THREAD_DEBUG_EVENT, 减少 Buffer1 成员
00415CB5 B8 127DB87E MOV EAX,7EB87D12
00415CBA 35 137DB9FE XOR EAX,FEB97D13
00415CBF 50 PUSH EAX ; 80010001, DBG_EXCEPTION_NOT_HANDLED
00415CC0 FFB5 4A634000 PUSH DWORD PTR SS:[EBP+40634A] ; dwThreadId
00415CC6 FFB5 46634000 PUSH DWORD PTR SS:[EBP+406346] ; dwProcessId
00415CCC 8D85 8A4F4000 LEA EAX,DWORD PTR SS:[EBP+404F8A]
00415CD2 48 DEC EAX
00415CD3 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.ContinueDebugEvent
00415CD5 8D85 219BA74F LEA EAX,DWORD PTR SS:[EBP+4FA79B21]
00415CDB 05 E8CD98B0 ADD EAX,B098CDE8
00415CE0 FFE0 JMP EAX ; 00415C5D
// 对异常的处理
00415CE4 8B85 4E634000 MOV EAX,DWORD PTR SS:[EBP+40634E] ; EXCEPTION_DEBUG_EVENT 的处理代码
00415CEA 35 A1B97180 XOR EAX,8071B9A1
00415CEF 3D A2B97100 CMP EAX,71B9A2
00415CF4 74 1F JE SHORT PESpin.00415D15 ; 80 00 00 03 Int3
00415CF6 3D A5B97100 CMP EAX,71B9A5
00415CFB 0F84 C8030000 JE PESpin.004160C9 ; 80 00 00 04 单步
00415D01 3D BCB97140 CMP EAX,4071B9BC
00415D06 74 5E JE SHORT PESpin.00415D66 ; C0 00 00 1D 非法指令
00415D08 8D85 49014800 LEA EAX,DWORD PTR SS:[EBP+480149] ; 其他异常父进程都不处理
00415D0E 2D E8970700 SUB EAX,797E8
00415D13 ^\FFE0 JMP EAX ; PESpin.00415CB5
00415D15 838D B4624000 0>OR DWORD PTR SS:[EBP+4062B4],0 ; [00415608] Int3 异常次数
00415D1C 75 39 JNZ SHORT PESpin.00415D57
// 第一次 Int3 异常
00415D1E FF85 B4624000 INC DWORD PTR SS:[EBP+4062B4] ; 第一次, 系统异常
00415D2E 50 PUSH EAX ; DBG_CONTINUE
00415D2F FFB5 4A634000 PUSH DWORD PTR SS:[EBP+40634A] ; dwThreadId
00415D35 FFB5 46634000 PUSH DWORD PTR SS:[EBP+406346] ; dwProcessId
00415D3B 8D85 0A176B51 LEA EAX,DWORD PTR SS:[EBP+516B170A]
00415D41 2D 81C72A51 SUB EAX,512AC781
00415D46 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.ContinueDebugEvent
00415D48 8D85 25A9150A LEA EAX,DWORD PTR SS:[EBP+A15A925]
00415D4E 2D 1C40D509 SUB EAX,9D5401C
00415D53 FFE0 JMP EAX ; 00415C5D
// 第二次以上子进程自己处理
00415D57 8D85 02A577EF LEA EAX,DWORD PTR SS:[EBP+EF77A502]
00415D5D 2D A13B37EF SUB EAX,EF373BA1
00415D62 ^ FFE0 JMP EAX ; PESpin.00415CB5
// 第一次非法指令异常到这里
00415D66 ^\E9 4AFFFFFF JMP PESpin.00415CB5 ; 父进程不做处理, 子进程自己处理
// 第二次非法指令异常到这里, 代码已被改变
00415D66 /EB 00 JMP SHORT PESpin.00415D68
00415D68 \EB 01 JMP SHORT PESpin.00415D6B
00415D6B 90 NOP
00415D6C 90 NOP
00415D6D 90 NOP
00415D6E 90 NOP
00415D6F 90 NOP
00415D70 EB 07 JMP SHORT PESpin.00415D79
00415D79 ^\EB F8 JMP SHORT PESpin.00415D73
00415D73 /EB 01 JMP SHORT PESpin.00415D76
00415D76 /EB 04 JMP SHORT PESpin.00415D7C
00415D7C 8B85 36634000 MOV EAX,DWORD PTR SS:[EBP+406336] ; hThread
00415D82 F785 A4624000 F>TEST DWORD PTR SS:[EBP+4062A4],FFFFFFFF ; [004155F8], 子进程有没有创建其他线程(0没有)
00415D8C /74 33 JE SHORT PESpin.00415DC1
00415D8E 8BB5 A0624000 MOV ESI,DWORD PTR SS:[EBP+4062A0] ; 存放线程信息的 Buffer1
00415D94 8B8D A4624000 MOV ECX,DWORD PTR SS:[EBP+4062A4] ; 已使用字节数
00415D9A 8B85 4A634000 MOV EAX,DWORD PTR SS:[EBP+40634A] ; dwThreadID
00415DA9 3906 CMP DWORD PTR DS:[ESI],EAX
00415DAB /74 1C JE SHORT PESpin.00415DC9 ; 相等表示异常不是主线程中发生的
00415DAD |83C6 08 ADD ESI,8
00415DBC 83E9 08 SUB ECX,8
00415DBF ^ 75 E8 JNZ SHORT PESpin.00415DA9
00415DC1 8B85 36634000 MOV EAX,DWORD PTR SS:[EBP+406336] ; hThread, 主线程
00415DC7 EB 03 JMP SHORT PESpin.00415DCC
00415DC9 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4] ; hThread, 从线程 (异常发生在从线程, 从表中取 hThread)
00415DCC E8 03000000 CALL PESpin.00415DD4
00415DDD 8985 A8624000 MOV DWORD PTR SS:[EBP+4062A8],EAX ; [004155FC]
00415DE3 B8 13000100 MOV EAX,10013
00415DE8 8D95 4754AE34 LEA EDX,DWORD PTR SS:[EBP+34AE5447]
00415DEE 81EA 0CE16D34 SUB EDX,346DE10C
00415DF4 FFD2 CALL EDX ; PESpin.0041668F, 类似 004166D5 调用 GetThreadContext
00415DF6 93 XCHG EAX,EBX
...
0041675F 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = B0h, regEax=0
00416762 8907 MOV DWORD PTR DS:[EDI],EAX ; [004155B0]
00416764 BA B3E40D00 MOV EDX,0DE4B3
00416769 81F2 1FE40D00 XOR EDX,0DE41F
0041676F 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = ACh, regEcx=0
00416772 8947 04 MOV DWORD PTR DS:[EDI+4],EAX
0041677E BA 2700EC00 MOV EDX,0EC0027
00416783 81EA 7FFFEB00 SUB EDX,0EBFF7F
00416789 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = A8h, regEdx=-1
0041678C 8947 08 MOV DWORD PTR DS:[EDI+8],EAX
004167BD BA 27EF0D00 MOV EDX,0DEF27
004167C2 81F2 83EF0D00 XOR EDX,0DEF83
004167C8 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = A4h, regEbx=7FFDF000
004167CB 8947 0C MOV DWORD PTR DS:[EDI+C],EAX
004167CE BA 5102FFFF MOV EDX,FFFF0251
004167D3 81C2 73FE0000 ADD EDX,0FE73
004167D9 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = C4h, regEsp=12FFC4
004167DC 8947 10 MOV DWORD PTR DS:[EDI+10],EAX
004167EB BA E5720C00 MOV EDX,0C72E5
004167F0 81EA 31720C00 SUB EDX,0C7231
004167F6 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = B4h, regEbp=12FFF0
004167F9 8947 14 MOV DWORD PTR DS:[EDI+14],EAX
0041682E BA C1A3F9FF MOV EDX,FFF9A3C1
00416833 81C2 DF5C0600 ADD EDX,65CDF
00416839 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = A0h, regEsi=1
0041683C 8947 18 MOV DWORD PTR DS:[EDI+18],EAX
0041683F BA D5FB0900 MOV EDX,9FBD5
00416844 81EA 39FB0900 SUB EDX,9FB39
0041684A 8B041A MOV EAX,DWORD PTR DS:[EDX+EBX] ; EDX = 9Ch, regEdi=414913
0041684D 8947 1C MOV DWORD PTR DS:[EDI+1C],EAX
00415E16 BA 2A14FFFF MOV EDX,FFFF142A
00415E1B 8D92 8EEC0000 LEA EDX,DWORD PTR DS:[EDX+EC8E]
00415E21 8B0413 MOV EAX,DWORD PTR DS:[EBX+EDX] ; EDX = B8h, regEip=4098F8( 已经进入程序代码空间) ***************************************************
00415E24 8DBD E1624000 LEA EDI,DWORD PTR SS:[EBP+4062E1] ; 00415635
...
00415E8C ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00415E5D(ECX>0), 00415E9A(ECX=0)
00415ED5 /FF6424 FC JMP DWORD PTR SS:[ESP-4] ; PESpin.00415EE3
00415F14 /FF6424 FC JMP DWORD PTR SS:[ESP-4] ; PESpin.00415F2F
00415F66 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00415E41(ECX>0), 00415F70(ECX=0) 以上 4 个是嵌套的, 最终出口 415F70
; 作用就是把 Address->String(8位16进制)
...
00415F81 C647 08 00 MOV BYTE PTR DS:[EDI+8],0 ; 00415635 "004098F8"
00415F85 8D85 901B1F13 LEA EAX,DWORD PTR SS:[EBP+131F1B90]
00415F8B 2D 0ECADE12 SUB EAX,12DECA0E
00415F90 FFD0 CALL EAX ; PESpin.004144D6 (计算 Hash)
00415F92 8DBD BFAF530F LEA EDI,DWORD PTR SS:[EBP+F53AFBF] ; 破坏字符串
00415F98 81EF DE4C130F SUB EDI,0F134CDE ; 00415635
00415F9E B9 DE4613ED MOV ECX,ED1346DE
00415FA3 BB B60D385A MOV EBX,5A380DB6
00415FA8 2BCB SUB ECX,EBX
00415FAA C1E9 1C SHR ECX,1C
00415FAD 2BDB SUB EBX,EBX ; EBX = 0
00415FAF 49 DEC ECX ; ECX = 8
00415FB0 8D95 A2D1540F LEA EDX,DWORD PTR SS:[EBP+F54D1A2]
00415FB6 81EA 3665140F SUB EDX,0F146536
00415FBC 03D1 ADD EDX,ECX
00415FBE FFE2 JMP EDX
00415FC8 49 DEC ECX
...
00415FF8 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00415FC8(ECX>0), 00416003(ECX=0)
0041600F BF F36B4100 MOV EDI,PESpin.00416BF3 ; 父进程放一个表, 处理子进程到 OEP 后的异常
00416014 B9 55010000 MOV ECX,155 ; 总长 155 字节
0041602A 3B07 CMP EAX,DWORD PTR DS:[EDI]
0041602C /74 26 JE SHORT PESpin.00416054 ; 找到了, 出口
0041602E |83C7 0B ADD EDI,0B ; 每段 0B 字节
0041603D 83E9 0B SUB ECX,0B
00416040 0BC9 OR ECX,ECX
00416042 ^ 77 D5 JA SHORT PESpin.00416019 ; 实际到 0041602A
00416044 8D85 D1C51E13 LEA EAX,DWORD PTR SS:[EBP+131EC5D1] ; 找不到, 子进程自己处理
0041604A 2D 705CDE12 SUB EAX,12DE5C70
0041604F FFE0 JMP EAX ; 00415CB5
00416BF3 9A 78 C3 A0 1E 00 00 00 03 01 02 ; 4098F8 , 对应的地址
82 14 AA 21 94 00 00 00 03 00 06 ; 409912
9F 92 FD DD 05 00 00 00 01 03 02 ; 40993E
8A 9E 73 E9 05 00 00 00 01 20 02 ; 409992
31 1E B4 EC 05 00 00 00 01 54 02 ; 4099BA
79 FB C9 4C 5F 00 00 00 03 00 02 ; 4099C7
FF DB C5 85 9C 04 00 00 03 00 06 ; 4099CD
BE 6D 88 03 27 00 00 00 03 00 02 ; 4099D7
38 4D 84 CA 34 04 00 00 03 00 06 ; 4099DD
FF 5C 93 1A 19 04 00 00 03 00 06 ; 4099E7
09 AA DD D8 0F 04 00 00 03 00 06 ; 4099F1
88 89 37 FC C4 04 00 00 03 00 06 ; 409A05
46 4C 46 95 F0 03 00 00 03 00 06 ; 409A10
56 5C 4D 2B E9 04 00 00 03 00 06 ; 409A1B
C7 2D B7 CC 05 00 00 00 01 30 02 ; 409C4A
82 5E 96 2E 27 00 00 00 03 00 02 ; 409C72
8B 8A F0 97 03 00 00 00 01 71 02 ; 409C7D
58 C1 F1 70 16 00 00 00 03 00 02 ; 409CAC
EF 81 F2 34 20 00 00 00 03 01 02 ; 409CE6
98 2B EE 7A 20 00 00 00 03 01 02 ; 409D16
DD DF 99 07 20 00 00 00 03 01 02 ; 409D46
6B C1 25 32 11 00 00 00 03 01 02 ; 409D85
17 50 F5 E7 11 00 00 00 03 00 02 ; 409DB5
3B 31 FB 09 14 00 00 00 00 75 03 ; 409DB7
39 71 2B 0C 14 00 00 00 00 45 03 ; 409E17
30 A5 4D B5 08 00 00 00 00 40 03 ; 409E1A
75 D6 6C 57 07 00 00 00 03 00 02 ; 409E22
54 A6 68 64 10 00 00 00 00 5D 03 ; 409E6F
36 D6 4A 23 1B 00 00 00 03 00 02 ; 409E99
8A FC 63 5E 1C 00 00 00 03 01 02 ; 409ED7
DA 9E 64 97 01 00 00 00 01 03 02 ; 409F14
structure table
{
dword AddressHash;
dword offset;
byte Type;
byte Reg;
byte Length;(被偷指令长度)
}
对 Type = 0, Reg 表示两个 reg, (3-5)reg1, (0-2)reg2, offset 表示偏移(1 or 4 byte), mov reg1, [reg2+offset]
对 Type = 1, Reg 表示两个 reg, (4-7)reg1, (0-3)reg2, offset 表示五种运算 xxx reg1, reg2
对 Type = 3, Reg=1 表示 JNZ, Reg=0 表示 JZ, offset 表示偏移(最高位表示方向, 1 or 4 byte)
0 or , 1 and , 2 xor, 3 add, 4 sub, 5 mov
00 EAX, 01 ECX, 02 EDX, 03 EBX, 04 ESP, 05 EBP, 06 ESI, 07 EDI
写一个程序, 计算 Hash 对应的地址和对应的二进制代码, 结果如下
deNanomite STRUCT
dwAddr DD ? ; 对应的地址
dwLen DD ? ; 代码长度
dbCode DB 8 dup(?) ; 二进制代码
deNanomite ENDS
F8 98 40 00 02 00 00 00 75 1E 00 00 00 00 00 00
12 99 40 00 06 00 00 00 0F 84 94 00 00 00 00 00
3E 99 40 00 02 00 00 00 8B C3 00 00 00 00 00 00
92 99 40 00 02 00 00 00 8B D0 00 00 00 00 00 00
BA 99 40 00 02 00 00 00 8B EC 00 00 00 00 00 00
C7 99 40 00 02 00 00 00 74 5F 00 00 00 00 00 00
CD 99 40 00 06 00 00 00 0F 84 9C 04 00 00 00 00
D7 99 40 00 02 00 00 00 74 27 00 00 00 00 00 00
DD 99 40 00 06 00 00 00 0F 84 34 04 00 00 00 00
E7 99 40 00 06 00 00 00 0F 84 19 04 00 00 00 00
F1 99 40 00 06 00 00 00 0F 84 0F 04 00 00 00 00
05 9A 40 00 06 00 00 00 0F 84 C4 04 00 00 00 00
10 9A 40 00 06 00 00 00 0F 84 F0 03 00 00 00 00
1B 9A 40 00 06 00 00 00 0F 84 E9 04 00 00 00 00
4A 9C 40 00 02 00 00 00 8B D8 00 00 00 00 00 00
72 9C 40 00 02 00 00 00 74 27 00 00 00 00 00 00
7D 9C 40 00 02 00 00 00 03 F9 00 00 00 00 00 00
AC 9C 40 00 02 00 00 00 74 16 00 00 00 00 00 00
E6 9C 40 00 02 00 00 00 75 20 00 00 00 00 00 00
16 9D 40 00 02 00 00 00 75 20 00 00 00 00 00 00
46 9D 40 00 02 00 00 00 75 20 00 00 00 00 00 00
85 9D 40 00 02 00 00 00 75 11 00 00 00 00 00 00
B5 9D 40 00 02 00 00 00 74 11 00 00 00 00 00 00
B7 9D 40 00 03 00 00 00 8B 75 14 00 00 00 00 00
17 9E 40 00 03 00 00 00 8B 45 14 00 00 00 00 00
1A 9E 40 00 03 00 00 00 8B 40 08 00 00 00 00 00
22 9E 40 00 02 00 00 00 74 07 00 00 00 00 00 00
6F 9E 40 00 03 00 00 00 8B 5D 10 00 00 00 00 00
99 9E 40 00 02 00 00 00 74 1B 00 00 00 00 00 00
D7 9E 40 00 02 00 00 00 75 1C 00 00 00 00 00 00
14 9F 40 00 02 00 00 00 23 C3 00 00 00 00 00 00
00416054 BE 0FD4FAFE MOV ESI,FEFAD40F
00416059 81EE 137DB9FE SUB ESI,FEB97D13 ; 004156FC, pContext
0041605F 8D85 990880E1 LEA EAX,DWORD PTR SS:[EBP+E1800899]
00416065 2D 1B983FE1 SUB EAX,E13F981B
0041606A FFD0 CALL EAX ; 004163D2, 实际到 004163E3, 见后面, 很关键 ********************************************
0041607D B8 FBCEEA6C MOV EAX,6CEACEFB
00416082 2D F8CEE96C SUB EAX,6CE9CEF8 ; 10003
00416087 8D9D EDA354B8 LEA EBX,DWORD PTR SS:[EBP+B854A3ED]
0041608D 81EB DE3014B8 SUB EBX,B81430DE
00416093 FFD3 CALL EBX ; 00416663, 类同 004168B0 去调用 SetThreadContext
00416095 B8 117DB8FE MOV EAX,FEB87D11
0041609A 35 137DB9FE XOR EAX,FEB97D13
0041609F 50 PUSH EAX ; DBG_CONTINUE
004160A0 FFB5 4A634000 PUSH DWORD PTR SS:[EBP+40634A]
004160A6 FFB5 46634000 PUSH DWORD PTR SS:[EBP+406346]
004160AC 8D85 A46744F9 LEA EAX,DWORD PTR SS:[EBP+F94467A4]
004160B2 2D 1B1804F9 SUB EAX,F904181B
004160B7 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.ContinueDebugEvent
004160B9 8D85 7C47EC80 LEA EAX,DWORD PTR SS:[EBP+80EC477C]
004160BF 2D 73DEAB80 SUB EAX,80ABDE73
004160C4 FFE0 JMP EAX ; 00415C5D
004160C9 /EB 04 JMP SHORT PESpin.004160CF
004160D2 F785 B8624000 F>TEST DWORD PTR SS:[EBP+4062B8],FFFFFFFF ; [0041560C] 单步异常次数
004160DC /75 71 JNZ SHORT PESpin.0041614F
// 第一次单步异常
004160DE FFB5 D4624000 PUSH DWORD PTR SS:[EBP+4062D4] ; [00415628], hMutex
004160E4 8D85 1C4F4000 LEA EAX,DWORD PTR SS:[EBP+404F1C]
004160EA 48 DEC EAX
004160EB FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.CloseHandle, 释放 Mutex
004160FE B8 09311793 MOV EAX,93173109
00416103 05 F8CEE96C ADD EAX,6CE9CEF8 ; 10001
00416108 8D9D 5D704512 LEA EBX,DWORD PTR SS:[EBP+1245705D]
0041610E 81EB E5FC0412 SUB EBX,1204FCE5
00416114 FFD3 CALL EBX ; 004166D5 去调用 GetThreadContext
004166D5 A3 FC564100 MOV DWORD PTR DS:[4156FC],EAX ; 10001
004166DA 68 FC564100 PUSH PESpin.004156FC ; pContext
004166DF FFB5 36634000 PUSH DWORD PTR SS:[EBP+406336] ; [0041568A], hThread
004166F0 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.GetThreadContext
004166F2 0BC0 OR EAX,EAX
004166F4 74 05 JE SHORT PESpin.004166FB
004166F6 B8 FC564100 MOV EAX,PESpin.004156FC
004166FB C3 RETN
00416116 96 XCHG EAX,ESI ; pContext->ESI
00416117 B8 9A81FFFF MOV EAX,FFFF819A
0041611C 8D80 1E7F0000 LEA EAX,DWORD PTR DS:[EAX+7F1E] ; B8
00416122 810406 1E000000 ADD DWORD PTR DS:[ESI+EAX],1E ; regEip + 1E, 00415AF2->00415B10
00416129 B8 C09B55D3 MOV EAX,D3559BC0
0041612E 35 C19B54D3 XOR EAX,D3549BC1 ; 10001
00416133 8D9D 53650E35 LEA EBX,DWORD PTR SS:[EBP+350E6553]
00416139 81EB F7EFCD34 SUB EBX,34CDEFF7
0041613F FFD3 CALL EBX ; 004168B0 去调用 SetThreadContext
004168C1 A3 FC564100 MOV DWORD PTR DS:[4156FC],EAX
004168C6 68 FC564100 PUSH PESpin.004156FC
004168CB FFB5 36634000 PUSH DWORD PTR SS:[EBP+406336] ; hThread
004168D1 8D85 336C66D6 LEA EAX,DWORD PTR SS:[EBP+D6666C33]
004168D7 2D B91C26D6 SUB EAX,D6261CB9
004168DC FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.SetThreadContext
004168DE C3 RETN
00416141 8D9D 37510614 LEA EBX,DWORD PTR SS:[EBP+14065137]
00416147 81EB C3E2C513 SUB EBX,13C5E2C3
0041614D FFE3 JMP EBX ; 004161C8
0041614F EB 04 JMP SHORT PESpin.00416155 ; 实际到 416158
00416158 83BD B8624000 0>CMP DWORD PTR SS:[EBP+4062B8],1 ; 是第二次单步异常吗
0041615F 75 67 JNZ SHORT PESpin.004161C8
// 第二次单步异常
00416161 B8 20451CD0 MOV EAX,D01C4520 ; 第二次单步异常父进程 SMC 本身五个字节
00416166 35 CB45F7D1 XOR EAX,D1F745CB ; 01EB00EB
0041616B 8DBD 126A4000 LEA EDI,DWORD PTR SS:[EBP+406A12] ; 00415D66,
00416171 AB STOS DWORD PTR ES:[EDI]
00416172 B0 D3 MOV AL,0D3
00416174 AA STOS BYTE PTR ES:[EDI]
0041617F 35 A1B97180 XOR EAX,8071B9A1 ; 10001
00416184 8D9D 7472FE10 LEA EBX,DWORD PTR SS:[EBP+10FE7274]
0041618A 81EB FCFEBD10 SUB EBX,10BDFEFC
00416190 FFD3 CALL EBX ; PESpin.004166CC, 类同 004166D5 去调用 GetThreadContext
00416192 96 XCHG EAX,ESI ; PESpin.004156FC
00416193 B8 B6810200 MOV EAX,281B6
00416198 35 0E810200 XOR EAX,2810E ; B8
0041619D 810406 2B000000 ADD DWORD PTR DS:[ESI+EAX],2B ; regEip + 2B, 41638B->4163B6
004161A4 EB 07 JMP SHORT PESpin.004161AD
004161B0 B8 F9CEEA6C MOV EAX,6CEACEF9
004161B5 2D F8CEE96C SUB EAX,6CE9CEF8 ; 10001
004161BA 8D9D 908539DF LEA EBX,DWORD PTR SS:[EBP+DF398590]
004161C0 81EB 3410F9DE SUB EBX,DEF91034
004161C6 FFD3 CALL EBX ; 004168B0 去调用 SetThreadContext
// 第三次以上单步异常
004161C8 FF85 B8624000 INC DWORD PTR SS:[EBP+4062B8] ; 单步次数加 1
004161CE 8D85 302B129F LEA EAX,DWORD PTR SS:[EBP+9F122B30]
004161D4 2D EFBDD19E SUB EAX,9ED1BDEF
004161D9 FFE0 JMP EAX ; 00416095, 父进程已处理, 子进程不用处理
// 新线程创建的处理
004161DD E8 03000000 CALL PESpin.004161E5
004161EE 8B85 4A634000 MOV EAX,DWORD PTR SS:[EBP+40634A] ; dwThreadID(新)
004161F4 8BBD A0624000 MOV EDI,DWORD PTR SS:[EBP+4062A0] ; EDI-> buffer1
004161FA 03BD A4624000 ADD EDI,DWORD PTR SS:[EBP+4062A4] ; 已使用字节数
00416200 AB STOS DWORD PTR ES:[EDI] ; dwThreadID
00416201 8B85 4E634000 MOV EAX,DWORD PTR SS:[EBP+40634E] ; hThread(新)
00416207 AB STOS DWORD PTR ES:[EDI]
00416208 8385 A462400008 ADD DWORD PTR SS:[EBP+4062A4],8 ; 用了 8 字节
0041620F 8D85 80277209 LEA EAX,DWORD PTR SS:[EBP+9722780]
00416215 2D 1FBE3109 SUB EAX,931BE1F
0041621A ^\FFE0 JMP EAX ; PESpin.00415CB5, 父进程保留 dwThreadID 和 hThread
// 新线程退出的处理
0041621E 8BB5 A0624000 MOV ESI,DWORD PTR SS:[EBP+4062A0] ; ESI->Buffer1
00416224 8B8D A4624000 MOV ECX,DWORD PTR SS:[EBP+4062A4] ; 已使用字节数
0041622A 8B85 4A634000 MOV EAX,DWORD PTR SS:[EBP+40634A] ; 退出的线程 ID
00416230 8D1C31 LEA EBX,DWORD PTR DS:[ECX+ESI]
00416233 3906 CMP DWORD PTR DS:[ESI],EAX ; 搜索数组
00416235 74 0A JE SHORT PESpin.00416241
00416237 83C6 08 ADD ESI,8
0041623A 83E9 08 SUB ECX,8
0041623D ^ 75 F4 JNZ SHORT PESpin.00416233
0041623F EB 12 JMP SHORT PESpin.00416253 ; 没有, 直接退出
00416241 8BFE MOV EDI,ESI ; 找到了, 去掉该成员
00416243 83C6 08 ADD ESI,8
00416246 83AD A4624000 08 SUB DWORD PTR SS:[EBP+4062A4],8
0041624D 87CB XCHG EBX,ECX
0041624F 2BCE SUB ECX,ESI
00416251 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00416253 8D85 F5D86D01 LEA EAX,DWORD PTR SS:[EBP+16DD8F5]
00416259 2D 946F2D01 SUB EAX,12D6F94
0041625E ^\FFE0 JMP EAX ; PESpin.00415CB5
// 处理子进程的的关键代码
004163E3 60 PUSHAD
004163E4 0FB647 08 MOVZX EAX,BYTE PTR DS:[EDI+8] ; Table.Type
004163E8 8D9D 54C01F02 LEA EBX,DWORD PTR SS:[EBP+21FC054]
004163EE 81EB EE4FDF01 SUB EBX,1DF4FEE ; 004163BA
004163F4 8B0483 MOV EAX,DWORD PTR DS:[EBX+EAX*4]
004163F7 2D 6FD45CE3 SUB EAX,E35CD46F
004163FC 03C5 ADD EAX,EBP ; 0-41641D 1-41647F 3-416539
0041640F /FFE0 JMP EAX ; EAX
0041641D /EB 04 JMP SHORT PESpin.00416426
00416426 0FB65F 09 MOVZX EBX,BYTE PTR DS:[EDI+9] ; Table.Reg
0041642A 2BC0 SUB EAX,EAX
0041642C 8AC3 MOV AL,BL
0041642E 24 07 AND AL,7
00416430 C1E0 02 SHL EAX,2 ; * 4
00416433 8B8428 5C624000 MOV EAX,DWORD PTR DS:[EAX+EBP+40625C] ; reg2
0041643A 807F 0A 03 CMP BYTE PTR DS:[EDI+A],3 ; offset 是 dword or byte?
0041643E 75 16 JNZ SHORT PESpin.00416456
00416440 0FBA67 04 07 BT DWORD PTR DS:[EDI+4],7 ; 符号位
00416445 73 0F JNB SHORT PESpin.00416456
00416447 8B4F 04 MOV ECX,DWORD PTR DS:[EDI+4]
0041644A F7D9 NEG ECX ; 取反
0041644C 81E1 FF000000 AND ECX,0FF
00416452 2BC1 SUB EAX,ECX ; reg2+offset( 1 byte, 负数)
00416454 EB 03 JMP SHORT PESpin.00416459
00416456 0347 04 ADD EAX,DWORD PTR DS:[EDI+4] ; reg2+offset
00416459 2BC9 SUB ECX,ECX
0041645B 80C9 04 OR CL,4
0041645E E8 9F020000 CALL PESpin.00416702 ; ReadProcessMemory [reg2+offset], 见下面
00416463 8B00 MOV EAX,DWORD PTR DS:[EAX] ; [reg2+offset]
00416465 C0EB 03 SHR BL,3
00416468 80E3 07 AND BL,7 ; (3-5)
0041646B C1E3 02 SHL EBX,2
0041646E 8B9C2B 80624000 MOV EBX,DWORD PTR DS:[EBX+EBP+406280]
00416475 890433 MOV DWORD PTR DS:[EBX+ESI],EAX ; reg1
00416478 E9 BB010000 JMP PESpin.00416638
0041647F 0FB647 09 MOVZX EAX,BYTE PTR DS:[EDI+9] ; Table.Reg
00416483 2BDB SUB EBX,EBX
00416485 8AD8 MOV BL,AL
00416487 80E3 0F AND BL,0F
0041648A C0C8 04 ROR AL,4 ; (4-7)
0041648D 24 0F AND AL,0F
0041648F 8B9C9D 5C624000 MOV EBX,DWORD PTR SS:[EBP+EBX*4+40625C] ; reg2
00416496 8B9485 5C624000 MOV EDX,DWORD PTR SS:[EBP+EAX*4+40625C] ; reg1
0041649D 8B8485 80624000 MOV EAX,DWORD PTR SS:[EBP+EAX*4+406280] ; 004155D4
004164A4 834F 04 00 OR DWORD PTR DS:[EDI+4],0
004164A8 75 04 JNZ SHORT PESpin.004164AE
004164AA 0BD3 OR EDX,EBX ; 0 = or
004164AC EB 30 JMP SHORT PESpin.004164DE
004164AE 837F 04 01 CMP DWORD PTR DS:[EDI+4],1
004164B2 75 04 JNZ SHORT PESpin.004164B8
004164B4 23D3 AND EDX,EBX ; 1 = and
004164B6 EB 26 JMP SHORT PESpin.004164DE
004164B8 837F 04 02 CMP DWORD PTR DS:[EDI+4],2
004164BC 75 04 JNZ SHORT PESpin.004164C2
004164BE 33D3 XOR EDX,EBX ; 2 = xor
004164C0 EB 1C JMP SHORT PESpin.004164DE
004164C2 837F 04 03 CMP DWORD PTR DS:[EDI+4],3
004164C6 75 04 JNZ SHORT PESpin.004164CC
004164C8 03D3 ADD EDX,EBX ; 3 = add
004164CA EB 12 JMP SHORT PESpin.004164DE
004164CC 837F 04 04 CMP DWORD PTR DS:[EDI+4],4
004164D0 75 04 JNZ SHORT PESpin.004164D6
004164D2 2BD3 SUB EDX,EBX ; 4 = sub
004164D4 EB 08 JMP SHORT PESpin.004164DE
004164D6 837F 04 05 CMP DWORD PTR DS:[EDI+4],5
004164DA 87D3 XCHG EBX,EDX ; 其他 mov
004164DC EB 0F JMP SHORT PESpin.004164ED
004164DE 9C PUSHFD
004164DF BB B8CFE96C MOV EBX,6CE9CFB8
004164E4 81EB F8CEE96C SUB EBX,6CE9CEF8 ; C0, Elags
004164EA 8F0433 POP DWORD PTR DS:[EBX+ESI] ; 除了 Mov, 其他还需要处理标志位
004164ED 891430 MOV DWORD PTR DS:[EAX+ESI],EDX
004164F0 E9 43010000 JMP PESpin.00416638
00416539 BB 61BA7180 MOV EBX,8071BA61 ; Type = 3
0041653E 81EB A1B97180 SUB EBX,8071B9A1 ; C0
00416544 8B1433 MOV EDX,DWORD PTR DS:[EBX+ESI] ; ESI = 004156FC, regEflag
00416547 C1EA 06 SHR EDX,6
00416553 8B47 04 MOV EAX,DWORD PTR DS:[EDI+4] ; Table.offset
00416556 0FB65F 09 MOVZX EBX,BYTE PTR DS:[EDI+9] ; Table.Reg
0041655A 83FB 00 CMP EBX,0
0041655D 74 02 JE SHORT PESpin.00416561
0041655F F7D2 NOT EDX
00416561 83E2 01 AND EDX,1 ; Zf = 1 吗
00416564 4A DEC EDX
00416565 0F85 CD000000 JNZ PESpin.00416638
0041656B 807F 0A 02 CMP BYTE PTR DS:[EDI+A],2 ; Table.Length
0041656F /74 0A JE SHORT PESpin.0041657B
00416571 |0FBAE0 1F BT EAX,1F ; 31 位
00416575 |73 2A JNB SHORT PESpin.004165A1
00416577 |F7D8 NEG EAX ; 对 负数取反
00416579 |EB 0D JMP SHORT PESpin.00416588
0041657B \0FBAE0 07 BT EAX,7 ; 7 位
0041657F 73 20 JNB SHORT PESpin.004165A1
00416581 F7D8 NEG EAX ; 对 负数取反
00416583 25 FF000000 AND EAX,0FF ; 对 Length = 2, 只取一个 byte
00416588 BB B1E50000 MOV EBX,0E5B1
0041658D 81EB F9E40000 SUB EBX,0E4F9 ; B8
00416593 0FB657 0A MOVZX EDX,BYTE PTR DS:[EDI+A]
00416597 2BC2 SUB EAX,EDX
00416599 290433 SUB DWORD PTR DS:[EBX+ESI],EAX
0041659C E9 AD000000 JMP PESpin.0041664E
004165A1 BB 59FF0000 MOV EBX,0FF59
004165A6 81EB A1FE0000 SUB EBX,0FEA1 ; B8
004165AC 0FB657 0A MOVZX EDX,BYTE PTR DS:[EDI+A]
004165B0 03C2 ADD EAX,EDX
004165B2 010433 ADD DWORD PTR DS:[EBX+ESI],EAX ; regEip 4098F8+20=409918
004165B5 E9 94000000 JMP PESpin.0041664E
00416638 /EB 07 JMP SHORT PESpin.00416641
00416641 ^\EB F8 JMP SHORT PESpin.0041663B
0041663B /EB 01 JMP SHORT PESpin.0041663E
0041663E /EB 04 JMP SHORT PESpin.00416644
00416644 0FB647 0A MOVZX EAX,BYTE PTR DS:[EDI+A] ; 跳过该条指令长度
00416648 0186 B8000000 ADD DWORD PTR DS:[ESI+B8],EAX
0041664E E8 03000000 CALL PESpin.00416656 ; 花指令
0041665F 61 POPAD
00416660 C3 RETN
// mov reg1, [reg2+offset] 专用的一段程序
00416702 60 PUSHAD
00416703 8BBD C4624000 MOV EDI,DWORD PTR SS:[EBP+4062C4] ; buffer2
00416709 6A 00 PUSH 0
0041670B 51 PUSH ECX ; 4 byte
0041670C 57 PUSH EDI ; buffer2
0041670D 50 PUSH EAX ; address
0041670E FFB5 32634000 PUSH DWORD PTR SS:[EBP+406332] ; hProcess
00416720 8D85 BFA356E9 LEA EAX,DWORD PTR SS:[EBP+E956A3BF]
00416726 2D 315416E9 SUB EAX,E9165431
0041672B FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.ReadProcessMemory
0041672D 61 POPAD
0041672E 8B85 C4624000 MOV EAX,DWORD PTR SS:[EBP+4062C4] ; buffer2
00416734 C3 RETN
父进程就这么多了.
// 接下来我们看看子进程
00415AF1 F1 INT1 ; 单步异常, 由父进程处理 ****************************************************
00415AF2 E8 1C030000 CALL PESpin.00415E13 ; eip -> 00415B10
00415B10 8B85 D4624000 MOV EAX,DWORD PTR SS:[EBP+4062D4] ; hMutex
00415B16 50 PUSH EAX
00415B17 8D85 D8A388ED LEA EAX,DWORD PTR SS:[EBP+ED88A3D8]
00415B1D 2D BD5448ED SUB EAX,ED4854BD
00415B22 FF10 CALL DWORD PTR DS:[EAX] ; KERNEL32.CloseHandle
00415B24 C3 RETN ; 004123F5
...
00414ADB 49 DEC ECX
00414ADC 9C PUSHFD
...
00414B09 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00414ACE(ECX>0), 00414B13(ECX=0)
...
004124FB E8 00000000 CALL PESpin.00412500
00412500 58 POP EAX
00412501 05 36000000 ADD EAX,36
00412506 8D9D FC4F4000 LEA EBX,DWORD PTR SS:[EBP+404FFC]
0041250C 8918 MOV DWORD PTR DS:[EAX],EBX ; PESpin.00414350
0041250E 33DB XOR EBX,EBX
00412510 8D4424 F8 LEA EAX,DWORD PTR SS:[ESP-8]
00412514 64:8703 XCHG DWORD PTR FS:[EBX],EAX
00412517 8D9D D3314000 LEA EBX,DWORD PTR SS:[EBP+4031D3]
0041251D 53 PUSH EBX
0041251E 50 PUSH EAX
0041251F 83CF FF OR EDI,FFFFFFFF
00412522 0BCF OR ECX,EDI
00412524 F3:AE REPE SCAS BYTE PTR ES:[EDI] ; 非法访问异常, 子进程自己处理 *************************************************
00412540 83CD FF OR EBP,FFFFFFFF ; 异常处理完, 这里继续
0041255A 5B POP EBX ; PESpin.00412559
0041255B 81C3 1E000000 ADD EBX,1E
00412561 8DB5 AC2C4000 LEA ESI,DWORD PTR SS:[EBP+402CAC]
00412567 68 FF000000 PUSH 0FF
0041256C 56 PUSH ESI
0041256D 6A 00 PUSH 0
0041256F 53 PUSH EBX
00412570 - FFA5 5C4F4000 JMP DWORD PTR SS:[EBP+404F5C] ; KERNEL32.GetModuleFileNameA
0041257D 5B POP EBX ; PESpin.0041257C
0041257E 81C3 25000000 ADD EBX,25
00412584 6A 00 PUSH 0
00412586 68 80000000 PUSH 80
0041258B 6A 03 PUSH 3
0041258D 6A 00 PUSH 0
0041258F 6A 01 PUSH 1
00412591 68 00000080 PUSH 80000000
00412596 56 PUSH ESI
00412597 53 PUSH EBX
00412598 - FFA5 2A4F4000 JMP DWORD PTR SS:[EBP+404F2A] ; KERNEL32.CreateFileA
004125A7 5A POP EDX ; PESpin.004125A6
004125A8 81C2 1A000000 ADD EDX,1A
004125AE 8985 AD754000 MOV DWORD PTR SS:[EBP+4075AD],EAX
004125B4 93 XCHG EAX,EBX
004125B5 6A 00 PUSH 0
004125B7 53 PUSH EBX
004125B8 52 PUSH EDX
004125B9 - FFA5 574F4000 JMP DWORD PTR SS:[EBP+404F57] ; KERNEL32.GetFileSize
004125C6 5A POP EDX ; PESpin.004125C5
004125C7 81C2 24000000 ADD EDX,24
004125CD 8BD8 MOV EBX,EAX
004125CF 53 PUSH EBX
004125D0 8F85 B9754000 POP DWORD PTR SS:[EBP+4075B9]
004125D6 6A 04 PUSH 4
004125D8 68 00300000 PUSH 3000
004125DD 50 PUSH EAX
004125DE 6A 00 PUSH 0
004125E0 52 PUSH EDX
004125E1 - FFA5 204F4000 JMP DWORD PTR SS:[EBP+404F20] ; KERNEL32.VirtualAlloc
004125E9 50 PUSH EAX
004125EA 8F85 E54E4000 POP DWORD PTR SS:[EBP+404EE5] ; [00414239], bufferForFile
004125FC 5A POP EDX ; PESpin.004125FB
004125FD 81C2 1E000000 ADD EDX,1E
00412603 6A 00 PUSH 0
00412605 51 PUSH ECX
00412606 53 PUSH EBX
00412607 50 PUSH EAX
00412608 FFB5 AD754000 PUSH DWORD PTR SS:[EBP+4075AD]
0041260E 52 PUSH EDX
0041260F - FFA5 2F4F4000 JMP DWORD PTR SS:[EBP+404F2F] ; KERNEL32.ReadFile
0041261F 5A POP EDX
00412620 81C2 17000000 ADD EDX,17
00412626 FFB5 AD754000 PUSH DWORD PTR SS:[EBP+4075AD]
0041262C 52 PUSH EDX
0041262D - FFA5 1B4F4000 JMP DWORD PTR SS:[EBP+404F1B] ; KERNEL32.CloseHandle
00412635 FFB5 B9754000 PUSH DWORD PTR SS:[EBP+4075B9]
0041263B 59 POP ECX ; FileSize
0041263C 81E9 EC1C0000 SUB ECX,1CEC ; 一部分不检查
00412642 8DBD E54E4000 LEA EDI,DWORD PTR SS:[EBP+404EE5]
00412648 8B3F MOV EDI,DWORD PTR DS:[EDI]
0041264A 8D85 8E6F6038 LEA EAX,DWORD PTR SS:[EBP+38606F8E]
00412650 0BC0 OR EAX,EAX
0041266D 2D 7F162038 SUB EAX,3820167F
00412672 FFD0 CALL EAX ; PESpin.00414C63, 计算校验和
00412674 2985 C1754000 SUB DWORD PTR SS:[EBP+4075C1],EAX ; [00416915]
00412680 5A POP EDX
00412681 81C2 1E000000 ADD EDX,1E
00412687 68 00800000 PUSH 8000
0041268C 6A 00 PUSH 0
0041268E FFB5 E54E4000 PUSH DWORD PTR SS:[EBP+404EE5] ; bufferForFile
00412694 52 PUSH EDX
00412695 - FFA5 254F4000 JMP DWORD PTR SS:[EBP+404F25] ; KERNEL32.VirtualFree
0041269D BB 380D581C MOV EBX,1C580D38
004126B3 33C0 XOR EAX,EAX
004126B5 68 95334000 PUSH PESpin.00403395
004126BA 64:FF30 PUSH DWORD PTR FS:[EAX]
004126BD 016C24 04 ADD DWORD PTR SS:[ESP+4],EBP ; SEH = 004126E9
004126C1 64:8920 MOV DWORD PTR FS:[EAX],ESP
004126C4 C1EB 02 SHR EBX,2
004126C7 81EB 4E031607 SUB EBX,716034E
004126D0 F6F3 DIV BL ; 除零异常, 子进程自己处理 ********************************************
0041432D 90 NOP ; 异常处理完这里继续
0041432F 33DB XOR EBX,EBX
00414331 64:8F03 POP DWORD PTR FS:[EBX]
00414334 5B POP EBX
00414335 81EB 16000000 SUB EBX,16
0041433E 803B CC CMP BYTE PTR DS:[EBX],0CC ; 004126D3 有没有断点
00414341 /75 0B JNZ SHORT PESpin.0041434E
00414343 |81E4 FFFF0000 AND ESP,0FFFF
00414349 |E8 1A000000 CALL PESpin.00414368 ; game over
0041434E ^\FFE3 JMP EBX ; PESpin.004126D3
004126D3 8DB5 4CC83F00 LEA ESI,DWORD PTR SS:[EBP+3FC84C]
004126D9 BA E71A0000 MOV EDX,1AE7
004126E1 C1E2 02 SHL EDX,2
004126E4 03F2 ADD ESI,EDX
004126E6 FFE6 JMP ESI ; 0041273C
0041274D 0FB78D E34E4000 MOVZX ECX,WORD PTR SS:[EBP+404EE3] ; [00414237]=04 (区段数)
00412754 8B95 E94E4000 MOV EDX,DWORD PTR SS:[EBP+404EE9] ; [0041423D]=00400060, PE 头
0041275A 81C2 F8000000 ADD EDX,0F8 ; Section Header
00412760 8B9D B1754000 MOV EBX,DWORD PTR SS:[EBP+4075B1] ; [00416905]=07, 前面 3 个区段都需要解密, 后面的不用
00412766 33C0 XOR EAX,EAX
00412779 51 PUSH ECX
0041277A 0FA3C3 BT EBX,EAX ; 前面 3 个区段都需要解密, 后面的不用
0041277D /73 67 JNB SHORT PESpin.004127E6
0041277F 52 PUSH EDX ; PESpin.00400158
00412791 8B7A 0C MOV EDI,DWORD PTR DS:[EDX+C] ; Voffset
00412794 03BD DF4E4000 ADD EDI,DWORD PTR SS:[EBP+404EDF] ; Base
0041279A 8B4A 10 MOV ECX,DWORD PTR DS:[EDX+10] ; RawSize
0041279D 8B95 C1754000 MOV EDX,DWORD PTR SS:[EBP+4075C1] ; [00416915] 前面的文件校验值
004127A3 D1EA SHR EDX,1
004127A5 72 06 JB SHORT PESpin.004127AD
004127A7 81F2 31AF43ED XOR EDX,ED43AF31
004127AD 3017 XOR BYTE PTR DS:[EDI],DL ; 用文件校验值来解密
004127AF 47 INC EDI
004127E2 49 DEC ECX
004127E3 ^ 75 BE JNZ SHORT PESpin.004127A3
004127E5 5A POP EDX ; PESpin.00400158
004127E6 40 INC EAX
004127E7 83C2 28 ADD EDX,28 ; 下一个区段
004127EA 59 POP ECX
004127FC 49 DEC ECX
004127FD 9C PUSHFD
0041282A ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00412779(ECX>0), 00412831(ECX=0)
00412831 E8 03000000 CALL PESpin.00412839
00412842 838D 8A614000 0>OR DWORD PTR SS:[EBP+40618A],0 ; [004154DE] ???
00412849 /74 0D JE SHORT PESpin.00412858
0041284B 8D85 B5594000 LEA EAX,DWORD PTR SS:[EBP+4059B5]
00412851 2D D1030000 SUB EAX,3D1
00412856 FFD0 CALL EAX ; 00414938
00412858 68 80010000 PUSH 180 ; 这里开始不要单步走, 直到 004128F7
0041285D 59 POP ECX
...
004128F1 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00412891(ECX>0), 004128F7(ECX=0)
004128F7 8D85 EC968D65 LEA EAX,DWORD PTR SS:[EBP+658D96EC]
004128FD BB D09EA632 MOV EBX,32A69ED0
00412902 D1E3 SHL EBX,1
00412904 2BC3 SUB EAX,EBX
00412906 50 PUSH EAX
00412907 C3 RETN ; 00414CA0 就对了, 否则 over
00414CA3 8DBD B4354000 LEA EDI,DWORD PTR SS:[EBP+4035B4] ; 00412908
00414CA9 B9 A1010000 MOV ECX,1A1
...
00414D0C ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00414CB7(ECX>0), 00414D15(ECX=0)
00414D15 55 PUSH EBP
00414D16 9C PUSHFD
00414D17 E8 77000000 CALL PESpin.00414D93
00414D1D 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8] ; 一开始的 SEH = 00414D1D
00414D21 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
00414D25 8142 04 35000000 ADD DWORD PTR DS:[EDX+4],35 ; SEH 00414D1D-> 00414D52
00414D2C 81CA 29242123 OR EDX,23212429
00414D32 2BC9 SUB ECX,ECX
00414D34 2148 04 AND DWORD PTR DS:[EAX+4],ECX
00414D37 2148 08 AND DWORD PTR DS:[EAX+8],ECX
00414D3A 2148 0C AND DWORD PTR DS:[EAX+C],ECX
00414D3D 2148 10 AND DWORD PTR DS:[EAX+10],ECX
00414D40 8160 14 F00FFFFF AND DWORD PTR DS:[EAX+14],FFFF0FF0
00414D47 C740 18 55010000 MOV DWORD PTR DS:[EAX+18],155
00414D4E 33C0 XOR EAX,EAX
00414D50 C3 RETN ; 改一下 SEH, 返回后还是同样的异常, 只是 SEH 变了
00414D93 FF0424 INC DWORD PTR SS:[ESP] ; PESpin.00414D1C+1
00414D96 2BDB SUB EBX,EBX
00414D98 64:FF33 PUSH DWORD PTR FS:[EBX]
00414D9B 64:8923 MOV DWORD PTR FS:[EBX],ESP
00414D9E FB STI ; 特权指令异常(第一次到 00414D1D, 第二次到 00414D52) ************************************
00414D52 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8]
00414D56 8142 04 1B000000 ADD DWORD PTR DS:[EDX+4],1B ; SEH 00414D52-> 00414D6D, 第二次改变
00414D60 33DB XOR EBX,EBX
00414D62 D7 XLAT BYTE PTR DS:[EBX+AL] ; 在异常处理中又遇到了非法访问异常, 先去系统中走一走,不能处理, 最后还是到 414D6D
00414D6D 8B6424 08 MOV ESP,DWORD PTR SS:[ESP+8] ; 414D6D 直接恢复 ESP
00414D71 2BD2 SUB EDX,EDX
00414D73 75 1C JNZ SHORT PESpin.00414D91
00414D75 /74 01 JE SHORT PESpin.00414D78
00414D78 64:8F02 POP DWORD PTR FS:[EDX] ; 0012FFE0
00414D7B 5A POP EDX
00414D7C 81E2 30313431 AND EDX,31343130
00414D82 9D POPFD
00414D83 5D POP EBP
00414DAB 8DBD 55374000 LEA EDI,DWORD PTR SS:[EBP+403755] ; 00412AA9
00414DB1 B9 57110000 MOV ECX,1157
...
00414E14 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00414DBF(ECX>0), 00414E1A(ECX=0)
00414E1A ^\E9 E9DAFFFF JMP PESpin.00412908
00412908 0FB78D E34E4000 MOVZX ECX,WORD PTR SS:[EBP+404EE3] ; 区段数, 再解密一次数据
0041290F 8B95 E94E4000 MOV EDX,DWORD PTR SS:[EBP+404EE9]
00412915 81C2 F8000000 ADD EDX,0F8
00412924 68 07000000 PUSH 7 ; 前三个区段需要解密
00412929 5B POP EBX
0041293A 51 PUSH ECX ; 区段数
00412947 0FA3C3 BT EBX,EAX
0041294A /73 79 JNB SHORT PESpin.004129C5
0041297A 8B7A 0C MOV EDI,DWORD PTR DS:[EDX+C] ; Voffset
0041297D 03BD DF4E4000 ADD EDI,DWORD PTR SS:[EBP+404EDF] ; Base
00412983 8B4A 10 MOV ECX,DWORD PTR DS:[EDX+10] ; RawSize
00412986 50 PUSH EAX
00412987 8A07 MOV AL,BYTE PTR DS:[EDI]
...
004129AE 49 DEC ECX
004129C0 0BC9 OR ECX,ECX
004129C2 ^ 75 C3 JNZ SHORT PESpin.00412987
004129C4 58 POP EAX
004129C5 40 INC EAX
004129C6 83C2 28 ADD EDX,28
004129D3 49 DEC ECX
004129D4 9C PUSHFD
00412A01 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 0041293A(ECX>0), 00412A08(ECX=0)
00412A08 E8 01000000 CALL PESpin.00412A0E
0041489E 33DB XOR EBX,EBX
004148A0 55 PUSH EBP
004148A1 E8 16000000 CALL PESpin.004148BC
004148A6 2BDB SUB EBX,EBX ; SEH = 004148A6
004148B1 8B6424 08 MOV ESP,DWORD PTR SS:[ESP+8] ; 直接恢复 ESP
004148B5 64:8F03 POP DWORD PTR FS:[EBX]
004148B8 5B POP EBX
004148B9 5D POP EBP
004148BA /EB 4A JMP SHORT PESpin.00414906
004148BC 64:FF33 PUSH DWORD PTR FS:[EBX]
004148BF 64:8923 MOV DWORD PTR FS:[EBX],ESP
004148C2 83E0 00 AND EAX,0
004148C5 64:3343 30 XOR EAX,DWORD PTR FS:[EBX+30] ; PEB
004148C9 /79 1B JNS SHORT PESpin.004148E6 ; NT 跳
004148F2 8B40 0C MOV EAX,DWORD PTR DS:[EAX+C]
004148F5 8B40 0C MOV EAX,DWORD PTR DS:[EAX+C]
00414901 4B DEC EBX
00414902 0958 20 OR DWORD PTR DS:[EAX+20],EBX ; 破坏 ImageSize, Skip *****************************************************
00414905 D7 XLAT BYTE PTR DS:[EBX+AL] ; 非法访问异常, SEH = 004148A6 **********************************************
00414906 6A F9 PUSH -7
00414908 5A POP EDX
00414909 59 POP ECX
0041490A 8D6424 04 LEA ESP,DWORD PTR SS:[ESP+4]
00414917 03D1 ADD EDX,ECX
00414919 ^ FFE2 JMP EDX ; PESpin.00412A16
...
00412A58 E8 03000000 CALL PESpin.00412A60
00412A6A 33DB XOR EBX,EBX
00412A6C 8D4424 F4 LEA EAX,DWORD PTR SS:[ESP-C]
00412A70 64:8703 XCHG DWORD PTR FS:[EBX],EAX
00412A73 55 PUSH EBP
00412A74 8D9D 95334000 LEA EBX,DWORD PTR SS:[EBP+403395] ; SEH = 004126E9
00412A7A 53 PUSH EBX
00412A7B 33DB XOR EBX,EBX
00412A86 8918 MOV DWORD PTR DS:[EAX],EBX ; EAX=0, 非法访问异常 *******************************************************
004126E9 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] ; SEH
004126ED 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
004126F1 8B00 MOV EAX,DWORD PTR DS:[EAX]
004126F3 35 5B011238 XOR EAX,3812015B
004126F8 3D 5E0112F8 CMP EAX,F812015E
004126FD 75 0F JNZ SHORT PESpin.0041270E
004126FF 8181 B8000000 E42000>ADD DWORD PTR DS:[ECX+B8],20E4 ; EIP 00412A86->00414B6A
00412709 EB 27 JMP SHORT PESpin.00412732
0041270E 3D 460112F8 CMP EAX,F8120146
00412713 75 0C JNZ SHORT PESpin.00412721
00412715 8181 B8000000 720100>ADD DWORD PTR DS:[ECX+B8],172
0041271F EB 11 JMP SHORT PESpin.00412732
00412721 3D CF0112F8 CMP EAX,F81201CF
00412726 75 0A JNZ SHORT PESpin.00412732
00412728 8181 B8000000 5D1C00>ADD DWORD PTR DS:[ECX+B8],1C5D
00412732 33C0 XOR EAX,EAX
00412734 C3 RETN
00414B6A 2BC0 SUB EAX,EAX
00414B6C EB 04 JMP SHORT PESpin.00414B72
00414B75 64:8F00 POP DWORD PTR FS:[EAX] ; 0012FFE0
00414B78 58 POP EAX
00414B79 5D POP EBP
00414B7A 8D85 55374000 LEA EAX,DWORD PTR SS:[EBP+403755] ; 00412AA9
00414B80 68 57110000 PUSH 1157
00414B85 59 POP ECX
00414B86 68 C3FDE514 PUSH 14E5FDC3
00414B8B 5A POP EDX
00414B8C D1EA SHR EDX,1
00414B8E /73 06 JNB SHORT PESpin.00414B96
00414B90 |81F2 32AF43ED XOR EDX,ED43AF32
00414B96 \3010 XOR BYTE PTR DS:[EAX],DL ; SMC 解密代码
00414B98 40 INC EAX
00414B99 49 DEC ECX
00414BD0 ^\FF6424 FC JMP DWORD PTR SS:[ESP-4] ; 00414B8C(ECX>0), 00414BD9(ECX=0)
00414BD9 2D 57110000 SUB EAX,1157
00414BDE ^ FFE0 JMP EAX ; PESpin.00412AA9
...
00412ADB 8B95 E94E4000 MOV EDX,DWORD PTR SS:[EBP+404EE9] ; PESpin.00400060
00412AE1 81C2 F8000000 ADD EDX,0F8
00412AE7 8B7A 0C MOV EDI,DWORD PTR DS:[EDX+C] ; Voffset
00412AEA 03BD DF4E4000 ADD EDI,DWORD PTR SS:[EBP+404EDF] ; +Base, edi=401000
00412AF0 6A 20 PUSH 20
00412AF2 59 POP ECX ; 校验 20h 字节
00412B04 E8 02000000 CALL PESpin.00412B0B
00412B0B 58 POP EAX
00412B0C 05 16000000 ADD EAX,16
00412B11 50 PUSH EAX ; 00412B1F 返回地址
00412B12 8D85 4DB8A5E5 LEA EAX,DWORD PTR SS:[EBP+E5A5B84D]
00412B18 2D 776065E5 SUB EAX,E5656077
00412B1D FFE0 JMP EAX ; 00414B2A(另一种 Hash 算法)
00412B1F 2985 B5754000 SUB DWORD PTR SS:[EBP+4075B5],EAX ; [00416909] 这里放着 401000-401020 的校验
00412B28 /0F85 4E150000 JNZ PESpin.0041407C ; 跳 over *************************************************************
00412B2E E8 03000000 CALL PESpin.00412B36
00412B3F 8D9D 19034900 LEA EBX,DWORD PTR SS:[EBP+490319]
00412B45 81EB 15A30800 SUB EBX,8A315 ; 00415358
00412B73 FFD3 CALL EBX ; PESpin.00415358
;=====================================================================================================================
00414B2A
00414B3B 52 PUSH EDX ; PESpin.00400158
00414B3C 33D2 XOR EDX,EDX
00414B3E 8A0439 MOV AL,BYTE PTR DS:[ECX+EDI] ; 401020
00414B41 32D0 XOR DL,AL
00414B43 B0 06 MOV AL,6
00414B45 D1EA SHR EDX,1
00414B47 72 06 JB SHORT PESpin.00414B4F
00414B49 81F2 20292D3A XOR EDX,3A2D2920
00414B4F 0FBAE2 08 BT EDX,8
00414B53 /73 03 JNB SHORT PESpin.00414B58
00414B55 |80E6 FE AND DH,0FE
00414B58 \FEC8 DEC AL
00414B5A ^\75 E9 JNZ SHORT PESpin.00414B45
00414B5C 49 DEC ECX
00414B5D ^ 75 DF JNZ SHORT PESpin.00414B3E
00414B5F 92 XCHG EAX,EDX
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!