能力值:
( LV9,RANK:2130 )
2 楼
......
00373BF8 8DB5 4E254000 LEA ESI , DWORD PTR SS :[EBP +<Next_Decode_addr>] ; 开始解出下一段代码
00373BFE 87E6 XCHG ESI , ESP
00373C00 B9 930B0000 MOV ECX , 0B93 ; 解压大小0b93
00373C05 58 POP EAX ; 0012FFE0
00373C06 F6D0 NOT AL
00373C08 50 PUSH EAX
00373C09 44 INC ESP
00373C0A ^ E2 F9 LOOPD SHORT 00373C05
00373C0C 87E6 XCHG ESI , ESP ;?????????????????????????????????输入表处理????????????????????????????????? 解压出代码后开始处理输入表部分了,输入表部分是复杂了点.总体是这样子,simonzh2k和Window已经标的很明白,我直接搬了过来:
加密后的 IAT 在内存里如下存放(搬了simonzh2k的)
; 1. FF FF FF FF ----------- 00 00 00 00 表示 所有 DLL 结束
; 2. xx ----- DLL Name 长度(不算 null)
; 3. DLL 名字, null 结尾 ( 明文 )
; 4. 80 yy yy yy ---------- yy yy yy 表示 API 个数 , 80 表示需要重定向
; 5. zz ---------- ZZ<>0 表示 API Name 长度(不算 null), ZZ==0, 后 4 byte 函数序号, 1 byte NULL
; 6. API Name, null 结尾 ( 密文, 解密代码见 12FF68 )
; 7. 重复 5, 6 结束 一个 DLL
; 重复 1,..,7 处理 所有 DLL ; 经过壳的iat处理,形成了下面的一个调用过程, ( 引用 window 的表示)
;
; iat中地址 --> Hook_proc:
; Hook_proc:
; |PUSH DWORD PTR DS:[Hook_proc+1C]
; |XOR DWORD PTR SS:[ESP], key
; |ret; -> |Stub_proc:
; |api_start_code
|api_some_code
|push api_next_code_addr
|ret 00373C0E 6A 04 PUSH 4
00373C10 68 00100000 PUSH 1000
00373C15 68 00200000 PUSH 2000
00373C1A 6A 00 PUSH 0
00373C1C FF95 AE434000 CALL DWORD PTR SS :[EBP +<APIVirtualAlloc>] ; kernel32.VirtualAlloc
00373C22 8985 E9494000 MOV DWORD PTR SS :[EBP +<hvMEM>], EAX
00373C28 C785 ED494000 0>MOV DWORD PTR SS :[EBP +<shellFunAddress>], 0
00373C32 8B85 DE434000 MOV EAX , DWORD PTR SS :[EBP +<flgCrypt_Improt>] ; (initial cpu selection)
00373C38 0BC0 OR EAX , EAX
00373C3A 0F85 BD000000 JNZ <IAT_isCrypted> ; 如果输入表加密了则跳
00373C40 8BBD 02444000 MOV EDI , DWORD PTR SS :[EBP +<IAT_RVA>] ; 如果没有加密则这里是输入表的rva,加密了就不是了
00373C46 03BD B2434000 ADD EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00373C4C > 8B77 0C MOV ESI , DWORD PTR DS :[EDI +C] ; dis_Dlls
00373C4F 0BF6 OR ESI , ESI
00373C51 75 05 JNZ SHORT <dis_iat> ; 如果没有处理完输入表则跳
00373C53 E9 A0000000 JMP <not_crypt_IAT_dis_Done>
00373C58 > 03B5 B2434000 ADD ESI , DWORD PTR SS :[EBP +<IMGBASE>] ; dis_iat
00373C5E 56 PUSH ESI
00373C5F 8D85 8F254000 LEA EAX , DWORD PTR SS :[EBP +40258F]
00373C65 50 PUSH EAX
00373C66 8B85 A6434000 MOV EAX , DWORD PTR SS :[EBP +<GetModhandle>] ; kernel32.GetModuleHandleA
00373C6C E9 690D0000 JMP <proc_Run_FUN> ; 判断DLL是否已经载入
00373C71 90 NOP
00373C72 90 NOP
00373C73 0BC0 OR EAX , EAX
00373C75 75 1E JNZ SHORT <dll_isLoaded>
00373C77 56 PUSH ESI
00373C78 8D85 A8254000 LEA EAX , DWORD PTR SS :[EBP +4025A8]
00373C7E 50 PUSH EAX
00373C7F 8B85 AA434000 MOV EAX , DWORD PTR SS :[EBP +<APILoadLib>] ; kernel32.LoadLibraryA
00373C85 E9 500D0000 JMP <proc_Run_FUN>
00373C8A 90 NOP
00373C8B 90 NOP
00373C8C 0BC0 OR EAX , EAX
00373C8E 75 05 JNZ SHORT <dll_isLoaded>
00373C90 E9 5A0F0000 JMP <proc_Loaddll_failed> ; 载入DLL失败显示失败信息
00373C95 > 8BF0 MOV ESI , EAX ; dll_isLoaded
00373C97 8B17 MOV EDX , DWORD PTR DS :[EDI ]
00373C99 0BD2 OR EDX , EDX
00373C9B 75 03 JNZ SHORT 00373CA0
00373C9D 8B57 10 MOV EDX , DWORD PTR DS :[EDI +10] ; 004480AC
00373CA0 0395 B2434000 ADD EDX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00373CA6 8B5F 10 MOV EBX , DWORD PTR DS :[EDI +10] ; 004480AC
00373CA9 039D B2434000 ADD EBX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00373CAF > 8B02 MOV EAX , DWORD PTR DS :[EDX ] ; dis_current_DLLs_api
00373CB1 0BC0 OR EAX , EAX
00373CB3 75 02 JNZ SHORT 00373CB7
00373CB5 EB 39 JMP SHORT 00373CF0
00373CB7 53 PUSH EBX
00373CB8 52 PUSH EDX
00373CB9 99 CDQ
00373CBA 0BD2 OR EDX , EDX
00373CBC 75 0B JNZ SHORT <is_number1> ; 是序号还是API名字
00373CBE 83C0 02 ADD EAX , 2
00373CC1 0385 B2434000 ADD EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00373CC7 EB 05 JMP SHORT 00373CCE
00373CC9 > 25 FFFFFF7F AND EAX , 7FFFFFFF ; is_number1
00373CCE 50 PUSH EAX
00373CCF 56 PUSH ESI
00373CD0 8D85 00264000 LEA EAX , DWORD PTR SS :[EBP +402600]
00373CD6 50 PUSH EAX
00373CD7 8B85 9E434000 MOV EAX , DWORD PTR SS :[EBP +<MyGetProcAddress>]
00373CDD E9 F80C0000 JMP <proc_Run_FUN>
00373CE2 90 NOP
00373CE3 90 NOP
00373CE4 8903 MOV DWORD PTR DS :[EBX ], EAX ; 填充输入表
00373CE6 5A POP EDX ; 0012FFE0
00373CE7 5B POP EBX ; 0012FFE0
00373CE8 83C2 04 ADD EDX , 4
00373CEB 83C3 04 ADD EBX , 4
00373CEE ^ EB BF JMP SHORT <dis_current_DLLs_api>
00373CF0 83C7 14 ADD EDI , 14
00373CF3 ^ E9 54FFFFFF JMP <dis_Dlls> ; 循环填充输入表
00373CF8 > E9 C6050000 JMP <Disposal_IAT_Done> ; not_crypt_IAT_dis_Done
00373CFD > 8D95 A01A4000 LEA EDX , DWORD PTR SS :[EBP +<Crc_Start_addr>] ; IAT_isCrypted
00373D03 0395 02444000 ADD EDX , DWORD PTR SS :[EBP +<IAT_RVA>]
00373D09 > 8B3A MOV EDI , DWORD PTR DS :[EDX ] ; loop_De_Crypted_iat
00373D0B 0BFF OR EDI , EDI
00373D0D 75 05 JNZ SHORT <DIS_NEXT_1> ; 如果没有处理完IAT则跳
00373D0F E9 AF050000 JMP <Disposal_IAT_Done>
00373D14 > 03BD B2434000 ADD EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; DIS_NEXT_1
00373D1A 83C2 05 ADD EDX , 5
00373D1D 8BF2 MOV ESI , EDX
00373D1F 56 PUSH ESI
00373D20 8D85 50264000 LEA EAX , DWORD PTR SS :[EBP +402650]
00373D26 50 PUSH EAX
00373D27 8B85 A6434000 MOV EAX , DWORD PTR SS :[EBP +<GetModhandle>] ; kernel32.GetModuleHandleA
00373D2D E9 A80C0000 JMP <proc_Run_FUN>
00373D32 90 NOP
00373D33 90 NOP
00373D34 0BC0 OR EAX , EAX
00373D36 75 1E JNZ SHORT 00373D56
00373D38 56 PUSH ESI
00373D39 8D85 69264000 LEA EAX , DWORD PTR SS :[EBP +402669]
00373D3F 50 PUSH EAX
00373D40 8B85 AA434000 MOV EAX , DWORD PTR SS :[EBP +<APILoadLib>] ; kernel32.LoadLibraryA
00373D46 E9 8F0C0000 JMP <proc_Run_FUN>
00373D4B 90 NOP
00373D4C 90 NOP
00373D4D 0BC0 OR EAX , EAX
00373D4F 75 05 JNZ SHORT 00373D56
00373D51 E9 990E0000 JMP <proc_Loaddll_failed>
00373D56 0FB64E FF MOVZX ECX , BYTE PTR DS :[ESI -1] ; MODULE NAME长度
00373D5A 03F1 ADD ESI , ECX
00373D5C 8BD6 MOV EDX , ESI
00373D5E 8BF0 MOV ESI , EAX
00373D60 42 INC EDX
00373D61 8B0A MOV ECX , DWORD PTR DS :[EDX ] ; 本DLL需引入函数的数
00373D63 81E1 00000080 AND ECX , 80000000
00373D69 0BC9 OR ECX , ECX
00373D6B 0F85 87000000 JNZ <Reloc_FUN> ; 判断DLL中的API是否需要重定位处理,如果需要则跳
00373D71 8B0A MOV ECX , DWORD PTR DS :[EDX ] ; 不需要特殊处理的API则跳这里
00373D73 83C2 04 ADD EDX , 4
00373D76 > 51 PUSH ECX ; loop_not_relocs_api
00373D77 0FB602 MOVZX EAX , BYTE PTR DS :[EDX ]
00373D7A 0BC0 OR EAX , EAX
00373D7C 75 27 JNZ SHORT <not_reloc_Ord_by_name>
00373D7E 42 INC EDX ; 以序号方式填充
00373D7F 52 PUSH EDX
00373D80 8B02 MOV EAX , DWORD PTR DS :[EDX ]
00373D82 50 PUSH EAX
00373D83 56 PUSH ESI
00373D84 8D85 B4264000 LEA EAX , DWORD PTR SS :[EBP +4026B4]
00373D8A 50 PUSH EAX
00373D8B 8B85 9E434000 MOV EAX , DWORD PTR SS :[EBP +<MyGetProcAddress>]
00373D91 E9 440C0000 JMP <proc_Run_FUN>
00373D96 90 NOP
00373D97 36:E8 A10E0000 CALL <proc_check_CC> ; Superfluous prefix
00373D9D 8907 MOV DWORD PTR DS :[EDI ], EAX ; 填充IAT
00373D9F 5A POP EDX ; 0012FFE0
00373DA0 83C2 04 ADD EDX , 4
00373DA3 EB 47 JMP SHORT 00373DEC
00373DA5 > 42 INC EDX ; not_reloc_Ord_by_name
00373DA6 52 PUSH EDX
00373DA7 60 PUSHAD
00373DA8 8BF2 MOV ESI , EDX
00373DAA 8DBD 74484000 LEA EDI , DWORD PTR SS :[EBP +<strAPIName>] ; 循环解压出API名称
00373DB0 33C0 XOR EAX , EAX
00373DB2 AC LODS BYTE PTR DS :[ESI ]
00373DB3 EB 07 JMP SHORT 00373DBC
00373DB5 C0C0 03 ROL AL , 3
00373DB8 F6D0 NOT AL
00373DBA AA STOS BYTE PTR ES :[EDI ]
00373DBB AC LODS BYTE PTR DS :[ESI ]
00373DBC 0BC0 OR EAX , EAX
00373DBE ^ 75 F5 JNZ SHORT 00373DB5
00373DC0 AA STOS BYTE PTR ES :[EDI ]
00373DC1 61 POPAD
00373DC2 8D95 74484000 LEA EDX , DWORD PTR SS :[EBP +<strAPIName>]
00373DC8 52 PUSH EDX
00373DC9 56 PUSH ESI
00373DCA 8D85 FA264000 LEA EAX , DWORD PTR SS :[EBP +4026FA]
00373DD0 50 PUSH EAX
00373DD1 8B85 9E434000 MOV EAX , DWORD PTR SS :[EBP +<MyGetProcAddress>]
00373DD7 E9 FE0B0000 JMP <proc_Run_FUN>
00373DDC 90 NOP
00373DDD 90 NOP
00373DDE E8 5B0E0000 CALL <proc_check_CC>
00373DE3 8907 MOV DWORD PTR DS :[EDI ], EAX ; 填充IAT
00373DE5 5A POP EDX ; 0012FFE0
00373DE6 0FB642 FF MOVZX EAX , BYTE PTR DS :[EDX -1]
00373DEA 03D0 ADD EDX , EAX
00373DEC 42 INC EDX
00373DED 83C7 04 ADD EDI , 4
00373DF0 59 POP ECX ; 0012FFE0
00373DF1 ^ E2 83 LOOPD SHORT <loop_not_relocs_api>
00373DF3 E9 C6040000 JMP <jmp_loop_de_iat>
00373DF8 > 8B0A MOV ECX , DWORD PTR DS :[EDX ] ; Reloc_FUN
00373DFA 81E1 FFFFFF7F AND ECX , 7FFFFFFF
00373E00 51 PUSH ECX
00373E01 52 PUSH EDX
00373E02 C1E1 05 SHL ECX , 5
00373E05 6A 04 PUSH 4
00373E07 68 00100000 PUSH 1000
00373E0C 51 PUSH ECX
00373E0D 6A 00 PUSH 0
00373E0F 8D85 3E274000 LEA EAX , DWORD PTR SS :[EBP +40273E]
00373E15 50 PUSH EAX
00373E16 8B85 AE434000 MOV EAX , DWORD PTR SS :[EBP +<APIVirtualAlloc>] ; kernel32.VirtualAlloc
00373E1C E9 B90B0000 JMP <proc_Run_FUN>
00373E21 90 NOP
00373E22 8985 FE434000 MOV DWORD PTR SS :[EBP +<hMEM_IAT_RELOC_1>], EAX
00373E28 5A POP EDX ; 0012FFE0
00373E29 59 POP ECX ; 0012FFE0
00373E2A 50 PUSH EAX
00373E2B 51 PUSH ECX
00373E2C 2BBD B2434000 SUB EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00373E32 83FF FF CMP EDI , -1
00373E35 74 15 JE SHORT 00373E4C
00373E37 03BD B2434000 ADD EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00373E3D EB 09 JMP SHORT 00373E48
00373E3F 8907 MOV DWORD PTR DS :[EDI ], EAX ; 循环填充第一层加密地址
00373E41 83C0 20 ADD EAX , 20 ; 每次+20
00373E44 83C7 04 ADD EDI , 4
00373E47 49 DEC ECX
00373E48 0BC9 OR ECX , ECX
00373E4A ^ 75 F3 JNZ SHORT 00373E3F
00373E4C 59 POP ECX ; 0012FFE0
00373E4D 58 POP EAX ; 0012FFE0
00373E4E 8BF8 MOV EDI , EAX
00373E50 57 PUSH EDI
00373E51 51 PUSH ECX
00373E52 EB 2D JMP SHORT 00373E81
00373E54 > 8D47 1C LEA EAX , DWORD PTR DS :[EDI +1C] ; Fill_1_address
00373E57 66:C707 FF35 MOV WORD PTR DS :[EDI ], 35FF ; 填充为push [addr]
00373E5C C747 06 8134240>MOV DWORD PTR DS :[EDI +6], 243481 ; xor [esp],rndkey
00373E63 8947 02 MOV DWORD PTR DS :[EDI +2], EAX ; ret
00373E66 C647 0D C3 MOV BYTE PTR DS :[EDI +D], 0C3
00373E6A 52 PUSH EDX
00373E6B 0F31 RDTSC
00373E6D 32E0 XOR AH , AL
00373E6F C1C8 08 ROR EAX , 8
00373E72 02E0 ADD AH , AL
00373E74 C1C8 08 ROR EAX , 8
00373E77 32E0 XOR AH , AL
00373E79 8947 09 MOV DWORD PTR DS :[EDI +9], EAX
00373E7C 5A POP EDX ; 0012FFE0
00373E7D 83C7 20 ADD EDI , 20
00373E80 49 DEC ECX
00373E81 0BC9 OR ECX , ECX
00373E83 ^ 75 CF JNZ SHORT <Fill_1_address>
00373E85 59 POP ECX ; 0012FFE0
00373E86 5F POP EDI ; 0012FFE0
00373E87 83C2 04 ADD EDX , 4
00373E8A > 51 PUSH ECX ; loop_Current_DLL
00373E8B 0FB602 MOVZX EAX , BYTE PTR DS :[EDX ]
00373E8E 0BC0 OR EAX , EAX
00373E90 0F85 85000000 JNZ <By_Name> ; 判断是名称方式还是序号方式
00373E96 42 INC EDX ; API是序号方式则这里开始处理
00373E97 52 PUSH EDX
00373E98 8B02 MOV EAX , DWORD PTR DS :[EDX ]
00373E9A 50 PUSH EAX
00373E9B 56 PUSH ESI
00373E9C 8D85 CB274000 LEA EAX , DWORD PTR SS :[EBP +4027CB]
00373EA2 50 PUSH EAX
00373EA3 8B85 9E434000 MOV EAX , DWORD PTR SS :[EBP +<MyGetProcAddress>]
00373EA9 E9 2C0B0000 JMP <proc_Run_FUN>
00373EAE 90 NOP
00373EAF 8B9D E9494000 MOV EBX , DWORD PTR SS :[EBP +<hvMEM>]
00373EB5 039D ED494000 ADD EBX , DWORD PTR SS :[EBP +<shellFunAddress>]
00373EBB 53 PUSH EBX
00373EBC 50 PUSH EAX
00373EBD 53 PUSH EBX
00373EBE E8 2C0B0000 CALL <steal code>
00373EC3 2B85 E9494000 SUB EAX , DWORD PTR SS :[EBP +<hvMEM>]
00373EC9 8985 ED494000 MOV DWORD PTR SS :[EBP +<shellFunAddress>], EAX
00373ECF 60 PUSHAD
00373ED0 3D C01F0000 CMP EAX , 1FC0
00373ED5 76 31 JBE SHORT 00373F08 ; 判断是否够空间
00373ED7 6A 04 PUSH 4 ; 存放空间不够则再申请空间
00373ED9 68 00100000 PUSH 1000
00373EDE 68 00200000 PUSH 2000
00373EE3 6A 00 PUSH 0
00373EE5 8D85 14284000 LEA EAX , DWORD PTR SS :[EBP +402814]
00373EEB 50 PUSH EAX
00373EEC 8B85 AE434000 MOV EAX , DWORD PTR SS :[EBP +<APIVirtualAlloc>] ; kernel32.VirtualAlloc
00373EF2 E9 E30A0000 JMP <proc_Run_FUN>
00373EF7 90 NOP
00373EF8 8985 E9494000 MOV DWORD PTR SS :[EBP +<hvMEM>], EAX
00373EFE C785 ED494000 0>MOV DWORD PTR SS :[EBP +<shellFunAddress>], 0
00373F08 61 POPAD
00373F09 5B POP EBX ; 0012FFE0
00373F0A 8BC3 MOV EAX , EBX
00373F0C 3347 09 XOR EAX , DWORD PTR DS :[EDI +9]
00373F0F 8947 1C MOV DWORD PTR DS :[EDI +1C], EAX
00373F12 5A POP EDX ; 0012FFE0
00373F13 83C2 04 ADD EDX , 4
00373F16 E9 97030000 JMP 003742B2
00373F1B > 42 INC EDX ; By_Name
00373F1C 52 PUSH EDX
00373F1D > 60 PUSHAD ; Decrypt_API_name
00373F1E 8BF2 MOV ESI , EDX
00373F20 8DBD 74484000 LEA EDI , DWORD PTR SS :[EBP +<strAPIName>]
00373F26 33C0 XOR EAX , EAX
00373F28 0FB64E FF MOVZX ECX , BYTE PTR DS :[ESI -1]
00373F2C EB 0E JMP SHORT 00373F3C
00373F2E AC LODS BYTE PTR DS :[ESI ]
00373F2F 34 79 XOR AL , 79
00373F31 2C 55 SUB AL , 55
00373F33 C0C0 03 ROL AL , 3
00373F36 F6D0 NOT AL
00373F38 AA STOS BYTE PTR ES :[EDI ]
00373F39 49 DEC ECX
00373F3A 33C0 XOR EAX , EAX
00373F3C 0BC9 OR ECX , ECX
00373F3E ^ 75 EE JNZ SHORT 00373F2E
00373F40 AA STOS BYTE PTR ES :[EDI ]
00373F41 61 POPAD
00373F42 8D95 74484000 LEA EDX , DWORD PTR SS :[EBP +<strAPIName>]
00373F48 52 PUSH EDX
00373F49 52 PUSH EDX
00373F4A 8D85 C9464000 LEA EAX , DWORD PTR SS :[EBP +<strLoadLib>]
00373F50 50 PUSH EAX
00373F51 8D85 80284000 LEA EAX , DWORD PTR SS :[EBP +402880]
00373F57 50 PUSH EAX
00373F58 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00373F5E E9 770A0000 JMP <proc_Run_FUN> ; 判断是否为特殊处理的API
00373F63 90 NOP
00373F64 5A POP EDX ; 0012FFE0
00373F65 85C0 TEST EAX , EAX
00373F67 75 0B JNZ SHORT 00373F74
00373F69 8D85 89394000 LEA EAX , DWORD PTR SS :[EBP +<SDKLoadLib>]
00373F6F E9 31030000 JMP <Fill_IAT_RELOC_2>
00373F74 52 PUSH EDX
00373F75 52 PUSH EDX
00373F76 8D85 BA464000 LEA EAX , DWORD PTR SS :[EBP +<strGetProcaddress>]
00373F7C 50 PUSH EAX
00373F7D 8D85 AC284000 LEA EAX , DWORD PTR SS :[EBP +4028AC]
00373F83 50 PUSH EAX
00373F84 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00373F8A E9 4B0A0000 JMP <proc_Run_FUN>
00373F8F 90 NOP
00373F90 5A POP EDX ; 0012FFE0
00373F91 85C0 TEST EAX , EAX
00373F93 75 0B JNZ SHORT 00373FA0
00373F95 8D85 9A394000 LEA EAX , DWORD PTR SS :[EBP +<SDKGetProcAddr>]
00373F9B E9 05030000 JMP <Fill_IAT_RELOC_2>
00373FA0 52 PUSH EDX
00373FA1 52 PUSH EDX
00373FA2 8D85 D6464000 LEA EAX , DWORD PTR SS :[EBP +<strGetVersion>]
00373FA8 50 PUSH EAX
00373FA9 8D85 D8284000 LEA EAX , DWORD PTR SS :[EBP +4028D8]
00373FAF 50 PUSH EAX
00373FB0 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00373FB6 E9 1F0A0000 JMP <proc_Run_FUN>
00373FBB 90 NOP
00373FBC 5A POP EDX ; 0012FFE0
00373FBD 85C0 TEST EAX , EAX
00373FBF 75 0B JNZ SHORT 00373FCC
00373FC1 8D85 AF394000 LEA EAX , DWORD PTR SS :[EBP +<SDKGetVersion>]
00373FC7 E9 D9020000 JMP <Fill_IAT_RELOC_2>
00373FCC 52 PUSH EDX
00373FCD 52 PUSH EDX
00373FCE 8D85 E1464000 LEA EAX , DWORD PTR SS :[EBP +<strGetModlehnd>]
00373FD4 50 PUSH EAX
00373FD5 8D85 04294000 LEA EAX , DWORD PTR SS :[EBP +402904]
00373FDB 50 PUSH EAX
00373FDC 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00373FE2 E9 F3090000 JMP <proc_Run_FUN>
00373FE7 90 NOP
00373FE8 5A POP EDX ; 0012FFE0
00373FE9 85C0 TEST EAX , EAX
00373FEB 75 0B JNZ SHORT 00373FF8
00373FED 8D85 E4394000 LEA EAX , DWORD PTR SS :[EBP +<SDKGetModlehnd>]
00373FF3 E9 AD020000 JMP <Fill_IAT_RELOC_2>
00373FF8 52 PUSH EDX
00373FF9 52 PUSH EDX
00373FFA 8D85 F2464000 LEA EAX , DWORD PTR SS :[EBP +<strGetCurrProcess>]
00374000 50 PUSH EAX
00374001 8D85 30294000 LEA EAX , DWORD PTR SS :[EBP +402930]
00374007 50 PUSH EAX
00374008 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
0037400E E9 C7090000 JMP <proc_Run_FUN>
00374013 90 NOP
00374014 5A POP EDX ; 0012FFE0
00374015 85C0 TEST EAX , EAX
00374017 75 0B JNZ SHORT 00374024
00374019 8D85 F5394000 LEA EAX , DWORD PTR SS :[EBP +<SDKGetCurProcess>]
0037401F E9 81020000 JMP <Fill_IAT_RELOC_2>
00374024 52 PUSH EDX
00374025 52 PUSH EDX
00374026 8D85 04474000 LEA EAX , DWORD PTR SS :[EBP +<strGetCurprocID>]
0037402C 50 PUSH EAX
0037402D 8D85 5C294000 LEA EAX , DWORD PTR SS :[EBP +40295C]
00374033 50 PUSH EAX
00374034 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
0037403A E9 9B090000 JMP <proc_Run_FUN>
0037403F 90 NOP
00374040 5A POP EDX ; 0012FFE0
00374041 85C0 TEST EAX , EAX
00374043 75 0B JNZ SHORT 00374050
00374045 8D85 323A4000 LEA EAX , DWORD PTR SS :[EBP +<SDKGetcurProcID>]
0037404B E9 55020000 JMP <Fill_IAT_RELOC_2>
00374050 52 PUSH EDX
00374051 52 PUSH EDX
00374052 8D85 18474000 LEA EAX , DWORD PTR SS :[EBP +<strGetcmdline>]
00374058 50 PUSH EAX
00374059 8D85 88294000 LEA EAX , DWORD PTR SS :[EBP +402988]
0037405F 50 PUSH EAX
00374060 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00374066 E9 6F090000 JMP <proc_Run_FUN>
0037406B 90 NOP
0037406C 5A POP EDX ; 0012FFE0
0037406D 85C0 TEST EAX , EAX
0037406F 75 0B JNZ SHORT 0037407C
00374071 8D85 5F3A4000 LEA EAX , DWORD PTR SS :[EBP +<SDKGetCMDline>]
00374077 E9 29020000 JMP <Fill_IAT_RELOC_2>
0037407C 52 PUSH EDX
0037407D 52 PUSH EDX
0037407E 8D85 41474000 LEA EAX , DWORD PTR SS :[EBP +<strLockRes>]
00374084 50 PUSH EAX
00374085 8D85 B4294000 LEA EAX , DWORD PTR SS :[EBP +4029B4]
0037408B 50 PUSH EAX
0037408C 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00374092 E9 43090000 JMP <proc_Run_FUN>
00374097 90 NOP
00374098 5A POP EDX ; 0012FFE0
00374099 85C0 TEST EAX , EAX
0037409B 75 0B JNZ SHORT 003740A8
0037409D 8D85 023B4000 LEA EAX , DWORD PTR SS :[EBP +<SDKLockRes>]
003740A3 E9 FD010000 JMP <Fill_IAT_RELOC_2>
003740A8 52 PUSH EDX
003740A9 52 PUSH EDX
003740AA 8D85 4E474000 LEA EAX , DWORD PTR SS :[EBP +<strFreeRes>]
003740B0 50 PUSH EAX
003740B1 8D85 E0294000 LEA EAX , DWORD PTR SS :[EBP +4029E0]
003740B7 50 PUSH EAX
003740B8 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
003740BE E9 17090000 JMP <proc_Run_FUN>
003740C3 90 NOP
003740C4 5A POP EDX ; 0012FFE0
003740C5 85C0 TEST EAX , EAX
003740C7 75 0B JNZ SHORT 003740D4
003740C9 8D85 023B4000 LEA EAX , DWORD PTR SS :[EBP +<SDKLockRes>]
003740CF E9 D1010000 JMP <Fill_IAT_RELOC_2>
003740D4 52 PUSH EDX
003740D5 52 PUSH EDX
003740D6 8D85 28474000 LEA EAX , DWORD PTR SS :[EBP +<strExitProc>]
003740DC 50 PUSH EAX
003740DD 8D85 0C2A4000 LEA EAX , DWORD PTR SS :[EBP +402A0C]
003740E3 50 PUSH EAX
003740E4 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
003740EA E9 EB080000 JMP <proc_Run_FUN>
003740EF 90 NOP
003740F0 5A POP EDX ; 0012FFE0
003740F1 85C0 TEST EAX , EAX
003740F3 75 0B JNZ SHORT 00374100
003740F5 8D85 7C3A4000 LEA EAX , DWORD PTR SS :[EBP +<SDKExitProc>]
003740FB E9 A5010000 JMP <Fill_IAT_RELOC_2>
00374100 52 PUSH EDX
00374101 52 PUSH EDX
00374102 8D85 5B474000 LEA EAX , DWORD PTR SS :[EBP +<strDLGBoxParamA>]
00374108 50 PUSH EAX
00374109 8D85 852A4000 LEA EAX , DWORD PTR SS :[EBP +402A85]
0037410F 50 PUSH EAX
00374110 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00374116 E9 BF080000 JMP <proc_Run_FUN>
0037411B 90 NOP
0037411C 8BC5 MOV EAX , EBP
0037411E 8DB5 014A4000 LEA ESI , DWORD PTR SS :[EBP +404A01] ; 过完全部的异常后把最后异常的那些地址再加密回去
00374124 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
00374127 2946 08 SUB DWORD PTR DS :[ESI +8], EAX
0037412A 83C6 20 ADD ESI , 20
0037412D 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
00374130 83C6 20 ADD ESI , 20
00374133 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
00374136 2946 08 SUB DWORD PTR DS :[ESI +8], EAX
00374139 83C6 20 ADD ESI , 20
0037413C 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
0037413F 83C6 20 ADD ESI , 20
00374142 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
00374145 83C6 20 ADD ESI , 20
00374148 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
0037414B 83C6 20 ADD ESI , 20
0037414E 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
00374151 83C6 20 ADD ESI , 20
00374154 2946 04 SUB DWORD PTR DS :[ESI +4], EAX
00374157 8DB5 FD494000 LEA ESI , DWORD PTR SS :[EBP +4049FD]
0037415D B8 014A4000 MOV EAX , 404A01
00374162 8906 MOV DWORD PTR DS :[ESI ], EAX
00374164 ^ E9 F5F8FFFF JMP 00373A5E ; 跳去处理OEP的代码
00374169 5A POP EDX ; 0012FFE0
0037416A 85C0 TEST EAX , EAX
0037416C 75 0B JNZ SHORT 00374179 ; 如果不是特殊函数则跳
0037416E 8D85 8B3A4000 LEA EAX , DWORD PTR SS :[EBP +<SDKDLGBoxParamA>]
00374174 E9 2C010000 JMP <Fill_IAT_RELOC_2>
00374179 52 PUSH EDX
0037417A 52 PUSH EDX
0037417B 8D85 6B474000 LEA EAX , DWORD PTR SS :[EBP +<strCreateDLGParamA>]
00374181 50 PUSH EAX
00374182 8D85 B12A4000 LEA EAX , DWORD PTR SS :[EBP +402AB1]
00374188 50 PUSH EAX
00374189 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
0037418F E9 46080000 JMP <proc_Run_FUN>
00374194 90 NOP
00374195 5A POP EDX ; 0012FFE0
00374196 85C0 TEST EAX , EAX
00374198 75 0B JNZ SHORT 003741A5
0037419A 8D85 C83A4000 LEA EAX , DWORD PTR SS :[EBP +<SDKCreateDLGParamA>]
003741A0 E9 00010000 JMP <Fill_IAT_RELOC_2>
003741A5 52 PUSH EDX
003741A6 52 PUSH EDX
003741A7 8D85 34474000 LEA EAX , DWORD PTR SS :[EBP +<strSndMsg>]
003741AD 50 PUSH EAX
003741AE 8D85 DD2A4000 LEA EAX , DWORD PTR SS :[EBP +402ADD]
003741B4 50 PUSH EAX
003741B5 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
003741BB E9 1A080000 JMP <proc_Run_FUN>
003741C0 90 NOP
003741C1 5A POP EDX ; 0012FFE0
003741C2 85C0 TEST EAX , EAX
003741C4 75 0B JNZ SHORT 003741D1
003741C6 8D85 2E3B4000 LEA EAX , DWORD PTR SS :[EBP +<SDKSndMsg>]
003741CC E9 D4000000 JMP <Fill_IAT_RELOC_2>
003741D1 52 PUSH EDX
003741D2 52 PUSH EDX
003741D3 8D85 7E474000 LEA EAX , DWORD PTR SS :[EBP +<strsend>]
003741D9 50 PUSH EAX
003741DA 8D85 092B4000 LEA EAX , DWORD PTR SS :[EBP +402B09]
003741E0 50 PUSH EAX
003741E1 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
003741E7 E9 EE070000 JMP <proc_Run_FUN>
003741EC 90 NOP
003741ED 5A POP EDX ; 0012FFE0
003741EE 85C0 TEST EAX , EAX
003741F0 75 0B JNZ SHORT 003741FD
003741F2 8D85 323B4000 LEA EAX , DWORD PTR SS :[EBP +<SDKsend>]
003741F8 E9 A8000000 JMP <Fill_IAT_RELOC_2>
003741FD 52 PUSH EDX
003741FE 52 PUSH EDX
003741FF 8D85 83474000 LEA EAX , DWORD PTR SS :[EBP +<strrecv>]
00374205 50 PUSH EAX
00374206 8D85 352B4000 LEA EAX , DWORD PTR SS :[EBP +402B35]
0037420C 50 PUSH EAX
0037420D 8B85 E3444000 MOV EAX , DWORD PTR SS :[EBP +<APIlstrcmpA>] ; kernel32.lstrcmpA
00374213 E9 C2070000 JMP <proc_Run_FUN>
00374218 90 NOP
00374219 5A POP EDX ; 0012FFE0
0037421A 85C0 TEST EAX , EAX
0037421C 75 08 JNZ SHORT 00374226
0037421E 8D85 363B4000 LEA EAX , DWORD PTR SS :[EBP +<SDKrecv>]
00374224 EB 7F JMP SHORT <Fill_IAT_RELOC_2>
00374226 52 PUSH EDX
00374227 56 PUSH ESI
00374228 8D85 572B4000 LEA EAX , DWORD PTR SS :[EBP +402B57]
0037422E 50 PUSH EAX
0037422F 8B85 9E434000 MOV EAX , DWORD PTR SS :[EBP +<MyGetProcAddress>] ; GetProcAddress获取API的地址
00374235 E9 A0070000 JMP <proc_Run_FUN>
0037423A 90 NOP
0037423B 8B9D E9494000 MOV EBX , DWORD PTR SS :[EBP +<hvMEM>]
00374241 039D ED494000 ADD EBX , DWORD PTR SS :[EBP +<shellFunAddress>]
00374247 53 PUSH EBX
00374248 50 PUSH EAX
00374249 53 PUSH EBX
0037424A E8 A0070000 CALL <steal code>
0037424F 2B85 E9494000 SUB EAX , DWORD PTR SS :[EBP +<hvMEM>]
00374255 8985 ED494000 MOV DWORD PTR SS :[EBP +<shellFunAddress>], EAX
0037425B 60 PUSHAD
0037425C 3D C01F0000 CMP EAX , 1FC0 ; 判断是否够空间
00374261 76 3E JBE SHORT 003742A1 ; 如果空间够用则跳
00374263 6A 04 PUSH 4
00374265 68 00100000 PUSH 1000
0037426A 68 00200000 PUSH 2000
0037426F 6A 00 PUSH 0
00374271 8D85 AD2B4000 LEA EAX , DWORD PTR SS :[EBP +402BAD]
00374277 50 PUSH EAX ; 空间不够用则跳
00374278 8B85 AE434000 MOV EAX , DWORD PTR SS :[EBP +<APIVirtualAlloc>] ; kernel32.VirtualAlloc
0037427E E9 57070000 JMP <proc_Run_FUN>
......
00374284 64:8F05 0000000>POP DWORD PTR FS :[0] ; 最后一个恢复SEH到这里
0037428B 58 POP EAX ; 0012FFE0
0037428C ^ E9 8BFEFFFF JMP 0037411C
00374291 8985 E9494000 MOV DWORD PTR SS :[EBP +<hvMEM>], EAX
00374297 C785 ED494000 0>MOV DWORD PTR SS :[EBP +<shellFunAddress>], 0
003742A1 61 POPAD
003742A2 5B POP EBX ; 0012FFE0
003742A3 8BC3 MOV EAX , EBX
003742A5 > 3347 09 XOR EAX , DWORD PTR DS :[EDI +9] ; Fill_IAT_RELOC_2
003742A8 8947 1C MOV DWORD PTR DS :[EDI +1C], EAX ; 填充地址
003742AB 5A POP EDX ; 0012FFE0
003742AC 0FB642 FF MOVZX EAX , BYTE PTR DS :[EDX -1]
003742B0 03D0 ADD EDX , EAX
003742B2 42 INC EDX
003742B3 83C7 20 ADD EDI , 20
003742B6 59 POP ECX ; 0012FFE0
003742B7 49 DEC ECX
003742B8 ^ 0F85 CCFBFFFF JNZ <loop_Current_DLL>
003742BE >^ E9 46FAFFFF JMP <loop_De_Crypted_iat> ; jmp_loop_de_iat
003742C3 > B9 00010000 MOV ECX , 100 ; Disposal_IAT_Done
看起来都有够复杂了,还好脱的时候不会这么复杂
;?????????????????????????END????????????????????????????????????????? ;♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀文件CRC检测♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀ 003742C8 2BE1 SUB ESP , ECX
003742CA 8BF4 MOV ESI , ESP
003742CC 8BFC MOV EDI , ESP
003742CE C1E9 02 SHR ECX , 2
003742D1 33C0 XOR EAX , EAX
003742D3 F3:AB REP STOS DWORD PTR ES :[EDI ]
003742D5 68 00010000 PUSH 100
003742DA 56 PUSH ESI
003742DB 8B85 B2434000 MOV EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003742E1 50 PUSH EAX
003742E2 8D85 112C4000 LEA EAX , DWORD PTR SS :[EBP +402C11]
003742E8 50 PUSH EAX
003742E9 8B85 0B454000 MOV EAX , DWORD PTR SS :[EBP +<APIGetModuleFileName>] ; kernel32.GetModuleFileNameA
003742EF E9 E6060000 JMP <proc_Run_FUN> ; 获取模块名
003742F4 90 NOP
003742F5 6A 00 PUSH 0
003742F7 68 80000000 PUSH 80
003742FC 6A 03 PUSH 3
003742FE 6A 00 PUSH 0
00374300 6A 03 PUSH 3
00374302 68 00000080 PUSH 80000000
00374307 56 PUSH ESI
00374308 8D85 3F2C4000 LEA EAX , DWORD PTR SS :[EBP +402C3F]
0037430E 50 PUSH EAX
0037430F 8B85 BC444000 MOV EAX , DWORD PTR SS :[EBP +<APICreateFileA>] ; kernel32.CreateFileA
00374315 E9 C0060000 JMP <proc_Run_FUN>
0037431A 90 NOP
0037431B 6285 F1494000 BOUND EAX , QWORD PTR SS :[EBP +4049F1] ; 最后一次异常跳这里
00374321 ^ EB F8 JMP SHORT 0037431B
00374323 8BD8 MOV EBX , EAX
00374325 81C4 00010000 ADD ESP , 100
0037432B 6A 00 PUSH 0
0037432D 53 PUSH EBX
0037432E 8D85 5D2C4000 LEA EAX , DWORD PTR SS :[EBP +402C5D]
00374334 50 PUSH EAX
00374335 8B85 C9444000 MOV EAX , DWORD PTR SS :[EBP +<APIGetFileSize>] ; kernel32.GetFileSize
0037433B E9 9A060000 JMP <proc_Run_FUN>
00374340 90 NOP
00374341 8985 B6434000 MOV DWORD PTR SS :[EBP +<_dwFileSize>], EAX
00374347 6A 00 PUSH 0
00374349 FFB5 B6434000 PUSH DWORD PTR SS :[EBP +<_dwFileSize>]
0037434F 6A 00 PUSH 0
00374351 6A 02 PUSH 2
00374353 6A 00 PUSH 0
00374355 53 PUSH EBX
00374356 8D85 852C4000 LEA EAX , DWORD PTR SS :[EBP +402C85]
0037435C 50 PUSH EAX
0037435D 8B85 75454000 MOV EAX , DWORD PTR SS :[EBP +<CreateFileMapA>] ; kernel32.CreateFileMappingA
00374363 E9 72060000 JMP <proc_Run_FUN>
00374368 90 NOP
00374369 8985 BA434000 MOV DWORD PTR SS :[EBP +<hMap>], EAX
0037436F 6A 00 PUSH 0
00374371 6A 00 PUSH 0
00374373 6A 00 PUSH 0
00374375 6A 04 PUSH 4
00374377 FFB5 BA434000 PUSH DWORD PTR SS :[EBP +<hMap>]
0037437D 8D85 B32C4000 LEA EAX , DWORD PTR SS :[EBP +402CB3]
00374383 50 PUSH EAX
00374384 8B85 89454000 MOV EAX , DWORD PTR SS :[EBP +<APIMapViewofFile>] ; kernel32.MapViewOfFile
0037438A E9 4B060000 JMP <proc_Run_FUN>
0037438F 90 NOP
00374390 90 NOP
00374391 40 INC EAX
00374392 D1C8 ROR EAX , 1
00374394 CE INTO
00374395 ^ EB FA JMP SHORT 00374391
00374397 8985 BE434000 MOV DWORD PTR SS :[EBP +<hvmapmem>], EAX
0037439D 53 PUSH EBX
0037439E 8B40 3C MOV EAX , DWORD PTR DS :[EAX +3C]
003743A1 8B8D B6434000 MOV ECX , DWORD PTR SS :[EBP +<_dwFileSize>]
003743A7 2BC8 SUB ECX , EAX
003743A9 8BB5 BE434000 MOV ESI , DWORD PTR SS :[EBP +<hvmapmem>]
003743AF 03F0 ADD ESI , EAX
003743B1 E8 A5080000 CALL <Calculate_CRC> ; 计算CRC值
003743B6 5B POP EBX ; 0012FFE0
003743B7 3385 C6434000 XOR EAX , DWORD PTR SS :[EBP +<xorsizeimg_Key>]
003743BD C1C8 03 ROR EAX , 3
003743C0 8BF0 MOV ESI , EAX
003743C2 8B85 BE434000 MOV EAX , DWORD PTR SS :[EBP +<hvmapmem>]
003743C8 0340 3C ADD EAX , DWORD PTR DS :[EAX +3C]
003743CB 8B78 FC MOV EDI , DWORD PTR DS :[EAX -4] ; 取出文件的CRC值
003743CE FFB5 BE434000 PUSH DWORD PTR SS :[EBP +<hvmapmem>]
003743D4 8D85 032D4000 LEA EAX , DWORD PTR SS :[EBP +402D03]
003743DA 50 PUSH EAX
003743DB 8B85 98454000 MOV EAX , DWORD PTR SS :[EBP +<APIUnmapviewofFile>] ; kernel32.UnmapViewOfFile
003743E1 E9 F4050000 JMP <proc_Run_FUN>
003743E6 90 NOP
003743E7 FFB5 BA434000 PUSH DWORD PTR SS :[EBP +<hMap>]
003743ED 8D85 1C2D4000 LEA EAX , DWORD PTR SS :[EBP +402D1C]
003743F3 50 PUSH EAX
003743F4 8B85 A9454000 MOV EAX , DWORD PTR SS :[EBP +<APICloaseHandel>] ; kernel32.CloseHandle
003743FA E9 DB050000 JMP <proc_Run_FUN>
003743FF 90 NOP
00374400 53 PUSH EBX
00374401 8D85 302D4000 LEA EAX , DWORD PTR SS :[EBP +402D30]
00374407 50 PUSH EAX
00374408 8B85 A9454000 MOV EAX , DWORD PTR SS :[EBP +<APICloaseHandel>] ; kernel32.CloseHandle
0037440E E9 C7050000 JMP <proc_Run_FUN>
00374413 90 NOP
00374414 8B85 E6434000 MOV EAX , DWORD PTR SS :[EBP +<flg_CRC_Check>]
0037441A 83F8 01 CMP EAX , 1
0037441D 75 08 JNZ SHORT <not_Check_crc> ; 判断是否需要进行CRC效验
0037441F 3BF7 CMP ESI , EDI ; 如果要检测,不相等的话就OVER了
00374421 0F85 171E0000 JNZ <Game_Over>;♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀END♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀♀ 00374427 > 8D85 5F2D4000 LEA EAX , DWORD PTR SS :[EBP +402D5F] ; not_Check_crc
0037442D 50 PUSH EAX
0037442E 8B85 ED444000 MOV EAX , DWORD PTR SS :[EBP +<APIGetVersion>] ; kernel32.GetVersion
00374434 E9 A1050000 JMP <proc_Run_FUN>
00374439 90 NOP
0037443A 33C0 XOR EAX , EAX
0037443C F7F0 DIV EAX ; 除 0异常
0037443E E9 FB1D0000 JMP <Game_Over>
00374443 8985 88474000 MOV DWORD PTR SS :[EBP +<save_VerInfo>], EAX
00374449 8D85 782D4000 LEA EAX , DWORD PTR SS :[EBP +402D78]
0037444F 50 PUSH EAX
00374450 8B85 1F454000 MOV EAX , DWORD PTR SS :[EBP +<APIGetCurProcess>] ; kernel32.GetCurrentProcess
00374456 E9 7F050000 JMP <proc_Run_FUN>
0037445B 90 NOP
0037445C 8985 90474000 MOV DWORD PTR SS :[EBP +<_dwCurProc>], EAX
00374462 8D85 912D4000 LEA EAX , DWORD PTR SS :[EBP +402D91]
00374468 50 PUSH EAX
00374469 8B85 32454000 MOV EAX , DWORD PTR SS :[EBP +<APIGetCurProcId>] ; kernel32.GetCurrentProcessId
0037446F E9 66050000 JMP <proc_Run_FUN>
00374474 90 NOP
00374475 8985 94474000 MOV DWORD PTR SS :[EBP +<_dwCurProcId>], EAX
0037447B 8D85 B52D4000 LEA EAX , DWORD PTR SS :[EBP +402DB5]
00374481 50 PUSH EAX
00374482 8B85 47454000 MOV EAX , DWORD PTR SS :[EBP +<APIGetCmdLine>] ; kernel32.GetCommandLineA
00374488 E9 4D050000 JMP <proc_Run_FUN>
0037448D 90 NOP
0037448E 9C PUSHFD
0037448F 9C PUSHFD
00374490 58 POP EAX ; 0012FFE0
00374491 80CC 01 OR AH , 1 ; 这里也是最后八个异常里的
00374494 50 PUSH EAX
00374495 9D POPFD
00374496 9D POPFD
00374497 ^ EB F5 JMP SHORT 0037448E
00374499 8985 98474000 MOV DWORD PTR SS :[EBP +<ptrGetCmdLine>], EAX
0037449F 6A 00 PUSH 0
003744A1 8D85 D02D4000 LEA EAX , DWORD PTR SS :[EBP +402DD0]
003744A7 50 PUSH EAX
003744A8 8B85 F9444000 MOV EAX , DWORD PTR SS :[EBP +<APIGetModulehndA>] ; kernel32.GetModuleHandleA
003744AE E9 27050000 JMP <proc_Run_FUN>
003744B3 90 NOP
003744B4 8985 8C474000 MOV DWORD PTR SS :[EBP +<_dwHandle>], EAX
003744BA FFB5 64464000 PUSH DWORD PTR SS :[EBP +<APIwsASend>] ; 对WSASend特别处理
003744C0 8D85 E5484000 LEA EAX , DWORD PTR SS :[EBP +4048E5]
003744C6 50 PUSH EAX
003744C7 E8 23050000 CALL <steal code>
003744CC FFB5 6D464000 PUSH DWORD PTR SS :[EBP +<APIWSARecv>] ; WS2_32.WSARecv
003744D2 8D85 25494000 LEA EAX , DWORD PTR SS :[EBP +404925]
003744D8 50 PUSH EAX
003744D9 E8 11050000 CALL <steal code>
003744DE 8D85 AC484000 LEA EAX , DWORD PTR SS :[EBP +<strShellTmpMap>]
003744E4 50 PUSH EAX
003744E5 68 00010000 PUSH 100
003744EA 6A 00 PUSH 0
003744EC 6A 04 PUSH 4
003744EE 6A 00 PUSH 0
003744F0 6A FF PUSH -1
003744F2 8D85 212E4000 LEA EAX , DWORD PTR SS :[EBP +402E21]
003744F8 50 PUSH EAX
003744F9 8B85 75454000 MOV EAX , DWORD PTR SS :[EBP +<CreateFileMapA>] ; kernel32.CreateFileMappingA
003744FF E9 D6040000 JMP <proc_Run_FUN>
00374504 90 NOP
00374505 83F8 00 CMP EAX , 0
00374508 0F84 301D0000 JE <Game_Over>
0037450E 8985 B8484000 MOV DWORD PTR SS :[EBP +<hMAP1>], EAX
00374514 68 00010000 PUSH 100
00374519 6A 00 PUSH 0
0037451B 6A 00 PUSH 0
0037451D 6A 06 PUSH 6
0037451F 50 PUSH EAX
00374520 8D85 4F2E4000 LEA EAX , DWORD PTR SS :[EBP +402E4F]
00374526 50 PUSH EAX
00374527 8B85 89454000 MOV EAX , DWORD PTR SS :[EBP +<APIMapViewofFile>] ; kernel32.MapViewOfFile
0037452D E9 A8040000 JMP <proc_Run_FUN>
00374532 90 NOP
00374533 8985 BC484000 MOV DWORD PTR SS :[EBP +<hMapview1>], EAX
00374539 8BF8 MOV EDI , EAX
0037453B 8DB5 C0484000 LEA ESI , DWORD PTR SS :[EBP +4048C0]
00374541 B9 0A000000 MOV ECX , 0A
00374546 F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ] ; 把ShellMap字符串复制到990000处
00374548 8B85 88474000 MOV EAX , DWORD PTR SS :[EBP +<save_VerInfo>]
0037454E 3D 00000080 CMP EAX , 80000000
00374553 73 16 JNB SHORT <OSisWin9x> ; 判断系统是否为WinNT或以上系统
00374555 64:FF35 3000000>PUSH DWORD PTR FS :[30] ; 如果是NT系统则检测IsDebuggerPresent
0037455C 58 POP EAX ; 检测Ring3级调试器
0037455D 0FB658 02 MOVZX EBX , BYTE PTR DS :[EAX +2]
00374561 0ADB OR BL , BL
00374563 0F85 D51C0000 JNZ <Game_Over>
00374569 EB 2A JMP SHORT 00374595
0037456B > 50 PUSH EAX ; OSisWin9x
0037456C 0F014C24 FE SIDT FWORD PTR SS :[ESP -2]
00374571 5B POP EBX ; 0012FFE0
00374572 83C3 18 ADD EBX , 18
00374575 8B4B 04 MOV ECX , DWORD PTR DS :[EBX +4]
00374578 66:8B0B MOV CX , WORD PTR DS :[EBX ]
0037457B 8B53 0C MOV EDX , DWORD PTR DS :[EBX +C]
0037457E 66:8B53 08 MOV DX , WORD PTR DS :[EBX +8]
00374582 8B43 14 MOV EAX , DWORD PTR DS :[EBX +14]
00374585 66:8B43 10 MOV AX , WORD PTR DS :[EBX +10]
00374589 2BC2 SUB EAX , EDX
0037458B 2BD1 SUB EDX , ECX
0037458D 2BC2 SUB EAX , EDX
0037458F 0F85 A91C0000 JNZ <Game_Over>
;◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎重定位表处理◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
如果是DLL的话,这里填充重定位表,修复重定位表时要注意一点,如果加密时选择了加密输入和特殊代码加密的话,是不能直接通过
修改这里来获取到全部的重定位表. 00374595 8BB5 D6434000 MOV ESI , DWORD PTR SS :[EBP +<Reloc_RVA(DLL)>] ; 判断是否有重定位表,一般的EXE这里为0
0037459B 0BF6 OR ESI , ESI
0037459D 74 4C JE SHORT <no_Reloc_Tab> ; 如果没有重定位表则跳
0037459F 03B5 B2434000 ADD ESI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003745A5 8BBD B2434000 MOV EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003745AB 8BDF MOV EBX , EDI
003745AD 2BBD D2434000 SUB EDI , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 重定位后的实际基址
003745B3 0FB606 MOVZX EAX , BYTE PTR DS :[ESI ]
003745B6 EB 2F JMP SHORT 003745E7
003745B8 > 3C 01 CMP AL , 1 ; Loop_Fill_Reloc_Tab
003745BA 75 15 JNZ SHORT 003745D1
003745BC 46 INC ESI
003745BD 0FB606 MOVZX EAX , BYTE PTR DS :[ESI ]
003745C0 3C 02 CMP AL , 2
003745C2 75 08 JNZ SHORT 003745CC
003745C4 46 INC ESI
003745C5 031E ADD EBX , DWORD PTR DS :[ESI ]
003745C7 83C6 04 ADD ESI , 4
003745CA EB 18 JMP SHORT 003745E4
003745CC 46 INC ESI
003745CD 03D8 ADD EBX , EAX
003745CF EB 13 JMP SHORT 003745E4
003745D1 3C 02 CMP AL , 2
003745D3 75 0A JNZ SHORT 003745DF
003745D5 46 INC ESI
003745D6 031E ADD EBX , DWORD PTR DS :[ESI ]
003745D8 013B ADD DWORD PTR DS :[EBX ], EDI ; 填充重定位表
003745DA 83C6 04 ADD ESI , 4
003745DD EB 05 JMP SHORT 003745E4
003745DF 46 INC ESI
003745E0 03D8 ADD EBX , EAX
003745E2 013B ADD DWORD PTR DS :[EBX ], EDI ; 填充重定位表
003745E4 0FB606 MOVZX EAX , BYTE PTR DS :[ESI ]
003745E7 0AC0 OR AL , AL
003745E9 ^ 75 CD JNZ SHORT <Loop_Fill_Reloc_Tab>
;◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎重定位表处理完毕◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ 003745EB > 8CC9 MOV CX , CS ; no_Reloc_Tab
003745ED 32C9 XOR CL , CL
003745EF 0BC9 OR ECX , ECX ; 判断操作系统
003745F1 74 32 JE SHORT <Os_isWinNT>
003745F3 50 PUSH EAX
003745F4 0F014C24 FE SIDT FWORD PTR SS :[ESP -2]
003745F9 5F POP EDI ; 0012FFE0
003745FA 83C7 20 ADD EDI , 20
003745FD 8B4F 04 MOV ECX , DWORD PTR DS :[EDI +4]
00374600 66:8B0F MOV CX , WORD PTR DS :[EDI ]
00374603 FA CLI
00374604 8DB5 434B4000 LEA ESI , DWORD PTR SS :[EBP +404B43]
0037460A 66:8937 MOV WORD PTR DS :[EDI ], SI
0037460D C1EE 10 SHR ESI , 10
00374610 66:8977 06 MOV WORD PTR DS :[EDI +6], SI
00374614 FB STI
00374615 CD 04 INT 4
00374617 FA CLI
00374618 66:890F MOV WORD PTR DS :[EDI ], CX
0037461B C1E9 10 SHR ECX , 10
0037461E 66:894F 06 MOV WORD PTR DS :[EDI +6], CX
00374622 FB STI
00374623 EB 37 JMP SHORT 0037465C
00374625 > E8 0E000000 CALL <Check_Debug> ; Os_isWinNT
0037462A 8B4C24 0C MOV ECX , DWORD PTR SS :[ESP +C]
0037462E 8381 B8000000 0>ADD DWORD PTR DS :[ECX +B8], 2 ; 异常地址+2
00374635 33C0 XOR EAX , EAX
00374637 C3 RETN
00374638 > 64:FF35 0000000>PUSH DWORD PTR FS :[0] ; Check_Debug
0037463F 64:8925 0000000>MOV DWORD PTR FS :[0], ESP
00374646 33C0 XOR EAX , EAX
00374648 CD 01 INT 1
0037464A 40 INC EAX
0037464B 40 INC EAX
0037464C 0BC0 OR EAX , EAX
0037464E 64:8F05 0000000>POP DWORD PTR FS :[0] ; 0012FFE0
00374655 58 POP EAX ; 0012FFE0
00374656 0F84 E21B0000 JE <Game_Over> ; 如果是sice这里就要处理了
0037465C 8BB5 FA434000 MOV ESI , DWORD PTR SS :[EBP +4043FA] ; 修正JMP IAT 到HOOK table
00374662 0BF6 OR ESI , ESI ; 可惜我这个程序没有
00374664 74 27 JE SHORT 0037468D
00374666 03B5 B2434000 ADD ESI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
0037466C EB 18 JMP SHORT 00374686
0037466E 8B46 02 MOV EAX , DWORD PTR DS :[ESI +2]
00374671 C1E0 05 SHL EAX , 5
00374674 0385 FE434000 ADD EAX , DWORD PTR SS :[EBP +<hMEM_IAT_RELOC_1>]
0037467A 2BC6 SUB EAX , ESI
0037467C 48 DEC EAX
0037467D 83E8 05 SUB EAX , 5
00374680 8946 02 MOV DWORD PTR DS :[ESI +2], EAX
00374683 83C6 06 ADD ESI , 6
00374686 66:813E 90E9 CMP WORD PTR DS :[ESI ], 0E990
0037468B ^ 74 E1 JE SHORT 0037466E
;++++++++++++++++++++++++++++++++++++++++++++++++++++对DELPHI程序的特别处理++++++++++++++++++++++++++++++++++++++++++++++++++++
如果是delphi的程序,加密时选择了DELPHI++选项,壳就会把mainform的部分数据搬到壳里去了,脱壳的话就得把它找回来.
0037468D 8B85 0A444000 MOV EAX , DWORD PTR SS :[EBP +<flgDelphi++>] ; 这里是对DELPHI的MAINFORM的特别处理
00374693 0BC0 OR EAX , EAX
00374695 74 3F JE SHORT 003746D6 ; 如果不是delphi的程序或没有选择Delphi++选项就会跳过这里了:-)
00374697 8DB5 A01A4000 LEA ESI , DWORD PTR SS :[EBP +<Crc_Start_addr>]
0037469D 03F0 ADD ESI , EAX
0037469F 8B1E MOV EBX , DWORD PTR DS :[ESI ] ; MAINFORM的原始参考RVA
003746A1 039D B2434000 ADD EBX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003746A7 C706 00000000 MOV DWORD PTR DS :[ESI ], 0
003746AD 83C6 04 ADD ESI , 4
003746B0 8933 MOV DWORD PTR DS :[EBX ], ESI ; [esi]就是抽取mainform的数据保存处
003746B2 0FB70E MOVZX ECX , WORD PTR DS :[ESI ] ; ebx中查找和[esi]对应的第一个字节空处就是了
003746B5 83C6 02 ADD ESI , 2
003746B8 8B9D B2434000 MOV EBX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003746BE 8B95 D2434000 MOV EDX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 00400000
003746C4 EB 0C JMP SHORT 003746D2
003746C6 2956 02 SUB DWORD PTR DS :[ESI +2], EDX ; 对重定位的处理
003746C9 015E 02 ADD DWORD PTR DS :[ESI +2], EBX ; exe文件一般不用去管的
003746CC 0FB706 MOVZX EAX , WORD PTR DS :[ESI ]
003746CF 03F0 ADD ESI , EAX
003746D1 49 DEC ECX
003746D2 0BC9 OR ECX , ECX
003746D4 ^ 75 F0 JNZ SHORT 003746C6
;++++++++++++++++++++++++++++++++++++++++++++++++++++特殊处理结束++++++++++++++++++++++++++++++++++++++++++++++++++++
能力值:
( LV9,RANK:2130 )
3 楼
;????????????????????????? Anti Dump ?????????????????????????
003746D6 6A 04 PUSH 4
003746D8 68 00100000 PUSH 1000
003746DD 68 00100000 PUSH 1000
003746E2 6A 00 PUSH 0
003746E4 8D85 13304000 LEA EAX , DWORD PTR SS :[EBP +403013]
003746EA 50 PUSH EAX
003746EB 8B85 AE434000 MOV EAX , DWORD PTR SS :[EBP +<APIVirtualAlloc>] ; kernel32.VirtualAlloc
003746F1 E9 E4020000 JMP <proc_Run_FUN>
003746F7 8985 1A444000 MOV DWORD PTR SS :[EBP +<hMEM46f7>], EAX
003746FD 8185 1A444000 0>ADD DWORD PTR SS :[EBP +<hMEM46f7>], 1000 ; 修改VirtualSize??
00374707 64:FF35 3000000>PUSH DWORD PTR FS :[30]
0037470E 58 POP EAX ; 0012FFE0
0037470F 85C0 TEST EAX , EAX
00374711 78 0F JS SHORT 00374722 ; ??检测操作系统??,判断是否可以Anti_dump
00374713 8B40 0C MOV EAX , DWORD PTR DS :[EAX +C]
00374716 8B40 0C MOV EAX , DWORD PTR DS :[EAX +C]
00374719 C740 20 0010000>MOV DWORD PTR DS :[EAX +20], 1000 ; anti_dump
00374720 EB 39 JMP SHORT 0037475B
00374722 6A 00 PUSH 0
00374724 8D85 53304000 LEA EAX , DWORD PTR SS :[EBP +403053]
0037472A 50 PUSH EAX
0037472B 8B85 A6434000 MOV EAX , DWORD PTR SS :[EBP +<GetModhandle>] ; kernel32.GetModuleHandleA
00374731 E9 A4020000 JMP <proc_Run_FUN>
00374736 90 NOP
00374737 85D2 TEST EDX , EDX
00374739 79 20 JNS SHORT 0037475B
0037473B 837A 08 FF CMP DWORD PTR DS :[EDX +8], -1
0037473F 75 1A JNZ SHORT 0037475B
00374741 8B52 04 MOV EDX , DWORD PTR DS :[EDX +4]
00374744 C742 50 0010000>MOV DWORD PTR DS :[EDX +50], 1000
0037474B 64:FF35 2000000>PUSH DWORD PTR FS :[20]
00374752 58 POP EAX ; 0012FFE0
00374753 85C0 TEST EAX , EAX
00374755 0F85 E31A0000 JNZ <Game_Over>
0037475B 50 PUSH EAX
0037475C 8BC4 MOV EAX , ESP
0037475E 50 PUSH EAX
0037475F 6A 04 PUSH 4
00374761 68 00100000 PUSH 1000
00374766 FFB5 B2434000 PUSH DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
0037476C 8D85 9B304000 LEA EAX , DWORD PTR SS :[EBP +40309B]
00374772 50 PUSH EAX
00374773 8B85 28464000 MOV EAX , DWORD PTR SS :[EBP +<APIVirtualProtect>] ; kernel32.VirtualProtect
00374779 E9 5C020000 JMP <proc_Run_FUN>
0037477E 90 NOP
0037477F 83C4 04 ADD ESP , 4
00374782 0BC0 OR EAX , EAX
00374784 74 0F JE SHORT 00374795 ; 修改PE文件头为可写
00374786 8B95 B2434000 MOV EDX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
0037478C 0352 3C ADD EDX , DWORD PTR DS :[EDX +3C]
0037478F 8B42 30 MOV EAX , DWORD PTR DS :[EDX +30]
00374792 8942 2C MOV DWORD PTR DS :[EDX +2C], EAX ; 修改BaseOfCode为1000
;????????????????????????? End ????????????????????????? 00374795 8DB5 07484000 LEA ESI , DWORD PTR SS :[EBP +<Author's TIP>]
0037479B 8BFE MOV EDI , ESI
0037479D B9 4F000000 MOV ECX , 4F
003747A2 EB 05 JMP SHORT 003747A9 ; 显示I am xxxx
003747A4 AC LODS BYTE PTR DS :[ESI ]
003747A5 2C 80 SUB AL , 80
003747A7 AA STOS BYTE PTR ES :[EDI ]
003747A8 49 DEC ECX
003747A9 0BC9 OR ECX , ECX
003747AB ^ 75 F7 JNZ SHORT 003747A4
003747AD 8DB5 07484000 LEA ESI , DWORD PTR SS :[EBP +<Author's TIP>]
003747B3 8BFE MOV EDI , ESI
003747B5 B9 4F000000 MOV ECX , 4F
003747BA EB 05 JMP SHORT 003747C1
003747BC AC LODS BYTE PTR DS :[ESI ] ; 显示完再清除掉
003747BD 04 80 ADD AL , 80
003747BF AA STOS BYTE PTR ES :[EDI ]
003747C0 49 DEC ECX
003747C1 0BC9 OR ECX , ECX
003747C3 ^ 75 F7 JNZ SHORT 003747BC;◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇Calculate UnLock Key◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
解出关键KEY,这个非常重要,KEY由内存代码效验值和Drx的值计算得来,这个程序最终KEY为:299A8442. 003747C5 8B85 0E444000 MOV EAX , DWORD PTR SS :[EBP +<OEP(RVA)>]
003747CB 0385 B2434000 ADD EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 计算出OEP的VA
003747D1 894424 EC MOV DWORD PTR SS :[ESP -14], EAX ; OEP保存到ESP-14中
003747D5 896C24 E8 MOV DWORD PTR SS :[ESP -18], EBP ; 保存EBP
003747D9 C785 F6434000 0>MOV DWORD PTR SS :[EBP +<UnLock_Important_Key>], 0 ; 初始化关键KEY,这里的KEY是整个壳的关键
003747E3 33C0 XOR EAX , EAX ; 没有KEY后面就会出错的
003747E5 8DB5 A01A4000 LEA ESI , DWORD PTR SS :[EBP +<Crc_Start_addr>] ; 从内存00373184处开始计算出关键KEY
003747EB B9 FE280000 MOV ECX , 28FE ; 内存代码检测大小28fe
003747F0 C1E9 02 SHR ECX , 2
003747F3 EB 08 JMP SHORT 003747FD
003747F5 AD LODS DWORD PTR DS :[ESI ] ; 如果内存代码修改过,这个KEY就肯定会不正确
003747F6 3185 F6434000 XOR DWORD PTR SS :[EBP +<UnLock_Important_Key>], EAX ;这里关键一定要记下正确的值否则后面解码会出错
003747FC 49 DEC ECX
003747FD 0BC9 OR ECX , ECX
003747FF ^ 75 F4 JNZ SHORT 003747F5
00374801 8B4424 EC MOV EAX , DWORD PTR SS :[ESP -14]
00374805 2B85 B2434000 SUB EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
0037480B 8985 0E444000 MOV DWORD PTR SS :[EBP +<OEP(RVA)>], EAX
00374811 8B6C24 E8 MOV EBP , DWORD PTR SS :[ESP -18]
00374815 8B85 F6434000 MOV EAX , DWORD PTR SS :[EBP +<UnLock_Important_Key>]
0037481B E8 3F000000 CALL <Fuck_Int3>
00374820 8B4C24 0C MOV ECX , DWORD PTR SS :[ESP +C]
00374824 FF81 B8000000 INC DWORD PTR DS :[ECX +B8] ; 异常地址+1
0037482A 33C0 XOR EAX , EAX
0037482C 3341 04 XOR EAX , DWORD PTR DS :[ECX +4] ; 取出Dr0 参与运算
0037482F 0341 08 ADD EAX , DWORD PTR DS :[ECX +8] ; 取出Dr1 参与运算
00374832 3341 0C XOR EAX , DWORD PTR DS :[ECX +C] ; 取出Dr2 参与运算
00374835 0341 10 ADD EAX , DWORD PTR DS :[ECX +10] ; 取出Dr3 参与运算
00374838 0181 B0000000 ADD DWORD PTR DS :[ECX +B0], EAX ; 算出的值保存回regEAX,壳的关键陷阱
0037483E 60 PUSHAD ; 如果Dr0被我们跟踪时破坏了则后面肯定出错
0037483F 8D71 04 LEA ESI , DWORD PTR DS :[ECX +4]
00374842 8BA9 B4000000 MOV EBP , DWORD PTR DS :[ECX +B4]
00374848 8DBD 014A4000 LEA EDI , DWORD PTR SS :[EBP +404A01]
0037484E 81C7 E8000000 ADD EDI , 0E8
00374854 B9 06000000 MOV ECX , 6
00374859 F3:A5 REP MOVS DWORD PTR ES :[EDI ], DWORD PTR DS :[ESI ]
0037485B 61 POPAD
0037485C 33C0 XOR EAX , EAX
0037485E C3 RETN
0037485F > 64:FF35 0000000>PUSH DWORD PTR FS :[0] ; Fuck_Int3
00374866 64:8925 0000000>MOV DWORD PTR FS :[0], ESP
0037486D CC INT3
0037486E 90 NOP
0037486F 64:8F05 0000000>POP DWORD PTR FS :[0] ; 0012FFE0
00374876 83C4 04 ADD ESP , 4
00374879 8985 F6434000 MOV DWORD PTR SS :[EBP +<UnLock_Important_Key>], EAX ; 看到了吧,如果Drx被破坏或内存代码被修改过
0037487F 33C0 XOR EAX , EAX ; 那个关键kEy就肯定不对了,那样程序就会异常退出
;◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇END◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ :________________________________________________________________________________________________________________________________
最后一个部分特殊代码加密
这部分也是关键的,如果上面的KEY不正确这里处理的时候就会产生异常,特殊代码加密也就是把原程序中的call [address]和jmp [address]
改成:
NOP
CALL HOOKED_ADDRESS
或者
NOP
JMP HOOK_ADDRESS 00374881 8B8D E2434000 MOV ECX , DWORD PTR SS :[EBP +<flg_specific_Code_Encrypt>] ; 特殊代码加密标志
00374887 83F9 01 CMP ECX , 1
0037488A 0F85 AE000000 JNZ <Disposal_Hook_code_done> ; 如果没有选择特殊代码加密这里会跳过
00374890 8DBD A01A4000 LEA EDI , DWORD PTR SS :[EBP +<Crc_Start_addr>]
00374896 03BD 06444000 ADD EDI , DWORD PTR SS :[EBP +404406]
0037489C 8DB5 5E344000 LEA ESI , DWORD PTR SS :[EBP +40345E]
003748A2 > 8B0F MOV ECX , DWORD PTR DS :[EDI ] ; Loop_Hook_Encrypt_code
003748A4 0BC9 OR ECX , ECX
003748A6 75 05 JNZ SHORT 003748AD
003748A8 E9 91000000 JMP <Disposal_Hook_code_done>
003748AD 83F8 01 CMP EAX , 1
003748B0 75 21 JNZ SHORT 003748D3
003748B2 81E1 FFFFFF7F AND ECX , 7FFFFFFF
003748B8 038D B2434000 ADD ECX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003748BE 2B8D D2434000 SUB ECX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 00400000
003748C4 8BDE MOV EBX , ESI ; 这里不会直接计算出地址,还要用call运行时解压出来
003748C6 2BD9 SUB EBX , ECX
003748C8 8959 FC MOV DWORD PTR DS :[ECX -4], EBX ; 填充hook后的地址
003748CB 66:C741 FA 90E8 MOV WORD PTR DS :[ECX -6], 0E890 ; 填充为call hookadd
003748D1 EB 60 JMP SHORT 00374933
003748D3 8BD1 MOV EDX , ECX
003748D5 81E1 FFFFFF7F AND ECX , 7FFFFFFF
003748DB 038D B2434000 ADD ECX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
003748E1 2B8D D2434000 SUB ECX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 00400000
003748E7 81E2 00000080 AND EDX , 80000000 ; 如果是call address,则值为80xxxxxx
003748ED 0BD2 OR EDX , EDX ; 如果edx=0表示是jmp addr
003748EF 75 08 JNZ SHORT <is_long_jmp> ; 不是jmp address就是25xxxxxx
003748F1 66:C741 FA 90E8 MOV WORD PTR DS :[ECX -6], 0E890 ; 如果是非0则call address
003748F7 EB 06 JMP SHORT 003748FF
003748F9 > 66:C741 FA 90E9 MOV WORD PTR DS :[ECX -6], 0E990 ; is_long_jmp
003748FF 8B57 04 MOV EDX , DWORD PTR DS :[EDI +4]
00374902 0395 F6434000 ADD EDX , DWORD PTR SS :[EBP +<UnLock_Important_Key>] ; 这里也是阴险之处,如果关键KEY不正确这里就会异常
00374908 50 PUSH EAX
00374909 8B07 MOV EAX , DWORD PTR DS :[EDI ]
0037490B 25 FFFFFF7F AND EAX , 7FFFFFFF
00374910 2BD0 SUB EDX , EAX
00374912 F7D2 NOT EDX
00374914 C1C2 10 ROL EDX , 10
00374917 0395 B2434000 ADD EDX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
0037491D 2B95 D2434000 SUB EDX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 这里计算出正确jmp [address]中的address,sub后edx=address
00374923 8B12 MOV EDX , DWORD PTR DS :[EDX ]
00374925 2BD1 SUB EDX , ECX
00374927 8951 FC MOV DWORD PTR DS :[ECX -4], EDX ; 写入加密后的地址
0037492A 33C0 XOR EAX , EAX
0037492C 48 DEC EAX
0037492D 8907 MOV DWORD PTR DS :[EDI ], EAX ; 一填充完就把相关地址填-1
0037492F 8947 04 MOV DWORD PTR DS :[EDI +4], EAX ; 地址+4处也填-1
00374932 58 POP EAX ; 0012FFE0
00374933 83C7 08 ADD EDI , 8
00374936 83F0 01 XOR EAX , 1
00374939 ^ E9 64FFFFFF JMP <Loop_Hook_Encrypt_code> :________________________________________________________________________________________________________________________________ 0037493E > 8B85 C2434000 MOV EAX , DWORD PTR SS :[EBP +4043C2] ; Disposal_Hook_code_done
00374944 0BC0 OR EAX , EAX
00374946 75 14 JNZ SHORT 0037495C
00374948 8B85 C9484000 MOV EAX , DWORD PTR SS :[EBP +4048C9]
0037494E 0BC0 OR EAX , EAX
00374950 74 0A JE SHORT 0037495C
00374952 0385 B2434000 ADD EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374958 60 PUSHAD
00374959 FFD0 CALL EAX
0037495B 61 POPAD
0037495C 8BB5 DD484000 MOV ESI , DWORD PTR SS :[EBP +4048DD] ; 准备从401000处开始计算内存中原程序的CRC值
00374962 03B5 B2434000 ADD ESI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374968 8B8D E1484000 MOV ECX , DWORD PTR SS :[EBP +4048E1] ; 计算大小48000
0037496E E8 E8020000 CALL <Calculate_CRC>
00374973 8985 CA434000 MOV DWORD PTR SS :[EBP +<save_Mem_CRC_Key>], EAX ; 保存计算后的crc值,不知道有什么用:-(
00374979 8BC5 MOV EAX , EBP
0037497B 8DB5 014A4000 LEA ESI , DWORD PTR SS :[EBP +404A01]
00374981 0146 04 ADD DWORD PTR DS :[ESI +4], EAX ; 这里准备进入八个异常了.
00374984 0146 08 ADD DWORD PTR DS :[ESI +8], EAX
00374987 83C6 20 ADD ESI , 20
0037498A 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
0037498D 83C6 20 ADD ESI , 20
00374990 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
00374993 0146 08 ADD DWORD PTR DS :[ESI +8], EAX
00374996 83C6 20 ADD ESI , 20
00374999 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
0037499C 83C6 20 ADD ESI , 20
0037499F 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
003749A2 83C6 20 ADD ESI , 20
003749A5 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
003749A8 83C6 20 ADD ESI , 20
003749AB 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
003749AE 83C6 20 ADD ESI , 20
003749B1 0146 04 ADD DWORD PTR DS :[ESI +4], EAX
003749B4 8DB5 FD494000 LEA ESI , DWORD PTR SS :[EBP +4049FD]
003749BA 0106 ADD DWORD PTR DS :[ESI ], EAX
003749BC 8D85 014B4000 LEA EAX , DWORD PTR SS :[EBP +<Last_SEHS_Disposal>]
003749C2 50 PUSH EAX
003749C3 64:FF35 0000000>PUSH DWORD PTR FS :[0]
003749CA 64:8925 0000000>MOV DWORD PTR FS :[0], ESP
003749D1 33C0 XOR EAX , EAX
003749D3 8B00 MOV EAX , DWORD PTR DS :[EAX ]
003749D5 90 NOP
003749D6 90 NOP
003749D7 CC INT3
003749D8 ^ EB FB JMP SHORT 003749D5 ; 到这里看到这里也就预告即将到入口了
到了这里,因为后面也没有什么重要的东西,我是直接在00373A5E处下断,然后过两个异常直接到OEP处了.
全部分析完后得到两个重要的信息:
Dr的全部值
DR0 0FFF90CA
DR1 0FFFCF7F
DR2 0FFF73B0
DR3 0FFFCDEF
DR6 FFFF0FF0
DR7 00000555
关键KEY:299A8442
当然其实有了关键KEY的话,就可以不用管Drx了.;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&以下是各模块代码:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
proc_Run_FUN:
003749DA > 50 PUSH EAX ; proc_Run_FUN
003749DB 8B85 E5494000 MOV EAX , DWORD PTR SS :[EBP +<hMEM334d>] ; 因为这后面是各个过程来的
003749E1 50 PUSH EAX
003749E2 E8 08000000 CALL <steal code>
003749E7 8B85 E5494000 MOV EAX , DWORD PTR SS :[EBP +<hMEM334d>]
003749ED FFE0 JMP EAX
003749EF > 60 PUSHAD ; steal code
003749F0 8B7C24 24 MOV EDI , DWORD PTR SS :[ESP +24] ; 0045F0A1
003749F4 8B7424 28 MOV ESI , DWORD PTR SS :[ESP +28] ; ESI=FUNCTION
003749F8 > 66:8B06 MOV AX , WORD PTR DS :[ESI ] ; Loop_chek_code
003749FB 3C 50 CMP AL , 50 ; 判断是否在为push eax push edi
003749FD 72 0A JB SHORT 00374A09
003749FF 3C 57 CMP AL , 57
00374A01 77 06 JA SHORT 00374A09
00374A03 8807 MOV BYTE PTR DS :[EDI ], AL ; 如果是则直接抽取一字节
00374A05 46 INC ESI
00374A06 47 INC EDI
00374A07 ^ EB EF JMP SHORT <Loop_chek_code>
00374A09 3C 6A CMP AL , 6A ; 如果是 push 0的方式则直接获取2个字节
00374A0B 75 09 JNZ SHORT 00374A16
00374A0D 66:8907 MOV WORD PTR DS :[EDI ], AX
00374A10 46 INC ESI
00374A11 46 INC ESI
00374A12 47 INC EDI
00374A13 47 INC EDI
00374A14 ^ EB E2 JMP SHORT <Loop_chek_code>
00374A16 3C 68 CMP AL , 68 ; 判断是否为push address的方式
00374A18 75 09 JNZ SHORT 00374A23
00374A1A B9 05000000 MOV ECX , 5
00374A1F F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ] ; 如果是则抽取5个字节
00374A21 ^ EB D5 JMP SHORT <Loop_chek_code>
00374A23 3C A1 CMP AL , 0A1 ; 判断是否为Mov eax,[address]
00374A25 75 09 JNZ SHORT 00374A30
00374A27 B9 05000000 MOV ECX , 5
00374A2C F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ] ; 如果是则抽取5个字节
00374A2E ^ EB C8 JMP SHORT <Loop_chek_code>
00374A30 66:3D 2BD2 CMP AX , 0D22B ; 判断是否为sub edx,edx
00374A34 75 2D JNZ SHORT 00374A63
00374A36 66:8907 MOV WORD PTR DS :[EDI ], AX ; 如果是则抽取两个字节
00374A39 46 INC ESI
00374A3A 46 INC ESI
00374A3B 47 INC EDI
00374A3C 47 INC EDI
00374A3D 8BDE MOV EBX , ESI
00374A3F AC LODS BYTE PTR DS :[ESI ]
00374A40 EB 01 JMP SHORT 00374A43
00374A42 AC LODS BYTE PTR DS :[ESI ]
00374A43 3C C3 CMP AL , 0C3
00374A45 ^ 75 FB JNZ SHORT 00374A42 ; 循环找到ret处
00374A47 4E DEC ESI
00374A48 C607 68 MOV BYTE PTR DS :[EDI ], 68 ; 改变成push address
00374A4B 8D47 0B LEA EAX , DWORD PTR DS :[EDI +B] ; ret
00374A4E 8947 01 MOV DWORD PTR DS :[EDI +1], EAX
00374A51 C647 05 68 MOV BYTE PTR DS :[EDI +5], 68
00374A55 8977 06 MOV DWORD PTR DS :[EDI +6], ESI
00374A58 C647 0A C3 MOV BYTE PTR DS :[EDI +A], 0C3
00374A5C 83C7 0B ADD EDI , 0B
00374A5F 8BF3 MOV ESI , EBX
00374A61 ^ EB 95 JMP SHORT <Loop_chek_code>
00374A63 66:3D FF74 CMP AX , 74FF ; 判断是否为push dword [reg]
00374A67 75 09 JNZ SHORT 00374A72
00374A69 B9 04000000 MOV ECX , 4 ; 如果是则抽取4个字节
00374A6E F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374A70 ^ EB 86 JMP SHORT <Loop_chek_code>
00374A72 66:3D 8BEC CMP AX , 0EC8B ; 判断是否为mov ebp,esp
00374A76 75 0C JNZ SHORT 00374A84
00374A78 B9 02000000 MOV ECX , 2 ; 如果是抽取2个字节
00374A7D F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374A7F ^ E9 74FFFFFF JMP <Loop_chek_code>
00374A84 3C E8 CMP AL , 0E8 ; 判断是否为call address
00374A86 75 25 JNZ SHORT 00374AAD
00374A88 8D47 0B LEA EAX , DWORD PTR DS :[EDI +B]
00374A8B C607 68 MOV BYTE PTR DS :[EDI ], 68 ; 如果是则改变为push address
00374A8E 8947 01 MOV DWORD PTR DS :[EDI +1], EAX ; ret
00374A91 8D46 05 LEA EAX , DWORD PTR DS :[ESI +5]
00374A94 0346 01 ADD EAX , DWORD PTR DS :[ESI +1]
00374A97 C647 05 68 MOV BYTE PTR DS :[EDI +5], 68
00374A9B 8947 06 MOV DWORD PTR DS :[EDI +6], EAX
00374A9E C647 0A C3 MOV BYTE PTR DS :[EDI +A], 0C3
00374AA2 83C6 05 ADD ESI , 5
00374AA5 83C7 0B ADD EDI , 0B
00374AA8 ^ E9 4BFFFFFF JMP <Loop_chek_code>
00374AAD 66:3D 64FF CMP AX , 0FF64
00374AB1 75 25 JNZ SHORT 00374AD8
00374AB3 807E 02 32 CMP BYTE PTR DS :[ESI +2], 32 ; 判断是否为push [edx]
00374AB7 75 09 JNZ SHORT 00374AC2
00374AB9 B9 03000000 MOV ECX , 3 ; 如果是则抽取3字节
00374ABE F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374AC0 EB 11 JMP SHORT 00374AD3
00374AC2 807E 02 35 CMP BYTE PTR DS :[ESI +2], 35 ; 判断是否为puhs [address],带前缀的
00374AC6 75 09 JNZ SHORT 00374AD1
00374AC8 B9 07000000 MOV ECX , 7 ; 如果是则抽取7字节
00374ACD F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374ACF EB 02 JMP SHORT 00374AD3
00374AD1 EB 4B JMP SHORT 00374B1E
00374AD3 ^ E9 20FFFFFF JMP <Loop_chek_code>
00374AD8 66:3D 6489 CMP AX , 8964
00374ADC 75 25 JNZ SHORT 00374B03
00374ADE 807E 02 22 CMP BYTE PTR DS :[ESI +2], 22 ; 判断是否为mov [reg],reg
00374AE2 75 09 JNZ SHORT 00374AED
00374AE4 B9 03000000 MOV ECX , 3 ; 如果是则抽取前三位,带前缀
00374AE9 F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374AEB EB 11 JMP SHORT 00374AFE
00374AED 807E 02 25 CMP BYTE PTR DS :[ESI +2], 25 ; 判断是否为mov [addr],reg
00374AF1 75 09 JNZ SHORT 00374AFC
00374AF3 B9 07000000 MOV ECX , 7 ; 如果是则抽取七位
00374AF8 F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374AFA EB 02 JMP SHORT 00374AFE
00374AFC EB 20 JMP SHORT 00374B1E
00374AFE ^ E9 F5FEFFFF JMP <Loop_chek_code>
00374B03 66:3D 83EC CMP AX , 0EC83 ; 判断是否为sub esp,val
00374B07 75 0C JNZ SHORT 00374B15
00374B09 B9 03000000 MOV ECX , 3 ; 如果是则抽取3字节
00374B0E F3:A4 REP MOVS BYTE PTR ES :[EDI ], BYTE PTR DS :[ESI ]
00374B10 ^ E9 E3FEFFFF JMP <Loop_chek_code>
00374B15 3C CC CMP AL , 0CC
00374B17 75 05 JNZ SHORT 00374B1E ; 判断指令的第一个字节是否为cc,如果是则over了
00374B19 E9 20170000 JMP <Game_Over>
00374B1E 66:3D CD03 CMP AX , 3CD
00374B22 75 05 JNZ SHORT 00374B29 ; 同样判断是否为int 3(CD 03)
00374B24 E9 15170000 JMP <Game_Over>
00374B29 C607 68 MOV BYTE PTR DS :[EDI ], 68 ; 如果都不是的话改变为push address
00374B2C 8977 01 MOV DWORD PTR DS :[EDI +1], ESI ; ret
00374B2F C647 05 C3 MOV BYTE PTR DS :[EDI +5], 0C3
00374B33 83C7 06 ADD EDI , 6
00374B36 897C24 FC MOV DWORD PTR SS :[ESP -4], EDI
00374B3A 61 POPAD
00374B3B 8B4424 DC MOV EAX , DWORD PTR SS :[ESP -24] ; ntdll.RtlFreeHeap
00374B3F C2 0800 RETN 8 00374B42 50 PUSH EAX ; HookJmp
00374B43 60 PUSHAD
00374B44 E8 00000000 CALL 00374B49
00374B49 5D POP EBP ; 0012FFE0
00374B4A 81ED 65344000 SUB EBP , 403465 ; 计算出EBP的值
00374B50 8B7C24 24 MOV EDI , DWORD PTR SS :[ESP +24] ; 取出call的来源+5
00374B54 8DB5 A01A4000 LEA ESI , DWORD PTR SS :[EBP +<Crc_Start_addr>]
00374B5A 03B5 06444000 ADD ESI , DWORD PTR SS :[EBP +404406]
00374B60 8B06 MOV EAX , DWORD PTR DS :[ESI ]
00374B62 33D2 XOR EDX , EDX
00374B64 B9 02000000 MOV ECX , 2
00374B69 F7E1 MUL ECX
00374B6B D1E8 SHR EAX , 1
00374B6D 0385 B2434000 ADD EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374B73 2B85 D2434000 SUB EAX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 00400000
00374B79 3BF8 CMP EDI , EAX
00374B7B 75 0A JNZ SHORT 00374B87
00374B7D 0AD2 OR DL , DL
00374B7F 75 04 JNZ SHORT 00374B85
00374B81 EB 09 JMP SHORT 00374B8C
00374B83 EB 02 JMP SHORT 00374B87
00374B85 EB 35 JMP SHORT 00374BBC
00374B87 83C6 08 ADD ESI , 8
00374B8A ^ EB D4 JMP SHORT 00374B60
00374B8C 8B46 04 MOV EAX , DWORD PTR DS :[ESI +4] ; 这里对call [address]的处理
00374B8F 0385 F6434000 ADD EAX , DWORD PTR SS :[EBP +<UnLock_Important_Key>]
00374B95 03BD D2434000 ADD EDI , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 00400000
00374B9B 2BBD B2434000 SUB EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374BA1 2BC7 SUB EAX , EDI
00374BA3 F7D0 NOT EAX
00374BA5 C1C0 10 ROL EAX , 10
00374BA8 0385 B2434000 ADD EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374BAE 2B85 D2434000 SUB EAX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 相减之后eax就是原iat的地址
00374BB4 8B00 MOV EAX , DWORD PTR DS :[EAX ] ; 取出IAT中第一层的加密地址
00374BB6 894424 20 MOV DWORD PTR SS :[ESP +20], EAX
00374BBA 61 POPAD
00374BBB C3 RETN
00374BBC 8B46 04 MOV EAX , DWORD PTR DS :[ESI +4] ; 这里对jmp [address]的处理
00374BBF 0385 F6434000 ADD EAX , DWORD PTR SS :[EBP +<UnLock_Important_Key>]
00374BC5 03BD D2434000 ADD EDI , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 00400000
00374BCB 2BBD B2434000 SUB EDI , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374BD1 2BC7 SUB EAX , EDI
00374BD3 F7D0 NOT EAX
00374BD5 C1C0 10 ROL EAX , 10
00374BD8 0385 B2434000 ADD EAX , DWORD PTR SS :[EBP +<IMGBASE>] ; 00400000
00374BDE 2B85 D2434000 SUB EAX , DWORD PTR SS :[EBP +<Reloc_BASE>] ; 减了之后算出jmp [address]中address的地址
00374BE4 8B00 MOV EAX , DWORD PTR DS :[EAX ] ; 取出IAT中第一层的加密地址
00374BE6 894424 24 MOV DWORD PTR SS :[ESP +24], EAX
00374BEA 61 POPAD
00374BEB 83C4 04 ADD ESP , 4 ; 因为是jmp [address]所以这里要add esp,4
00374BEE C3 RETN proc_Loaddll_failed:
00374BEF > 56 PUSH ESI ; proc_Loaddll_failed
00374BF0 8D85 5B484000 LEA EAX , DWORD PTR SS :[EBP +40485B] ; ASCII "can not found %s"
00374BF6 50 PUSH EAX
00374BF7 8D85 74484000 LEA EAX , DWORD PTR SS :[EBP +<strAPIName>] ; ASCII "RtlSetLastWin32Error"
00374BFD 50 PUSH EAX
00374BFE 8D85 2D354000 LEA EAX , DWORD PTR SS :[EBP +40352D]
00374C04 50 PUSH EAX
00374C05 8B85 2A444000 MOV EAX , DWORD PTR SS :[EBP +<APIwsPrintfA>] ; USER32.wsprintfA
00374C0B ^ E9 CAFDFFFF JMP <proc_Run_FUN>
00374C10 90 NOP
00374C11 83C4 0C ADD ESP , 0C
00374C14 6A 00 PUSH 0
00374C16 8D85 A4484000 LEA EAX , DWORD PTR SS :[EBP +4048A4] ; ASCII "warning"
00374C1C 50 PUSH EAX
00374C1D 8D85 74484000 LEA EAX , DWORD PTR SS :[EBP +<strAPIName>]
00374C23 50 PUSH EAX
00374C24 6A 00 PUSH 0
00374C26 8D85 55354000 LEA EAX , DWORD PTR SS :[EBP +403555]
00374C2C 50 PUSH EAX
00374C2D 8B85 35444000 MOV EAX , DWORD PTR SS :[EBP +<APIMsgBox>] ; USER32.MessageBoxA
00374C33 ^ E9 A2FDFFFF JMP <proc_Run_FUN>
00374C38 90 NOP
00374C39 E9 00160000 JMP <Game_Over> proc_check_CC:
00374C3E > 56 PUSH ESI ; proc_check_CC
00374C3F 51 PUSH ECX ; 检测API是否下了cc断点
00374C40 50 PUSH EAX
00374C41 8BF0 MOV ESI , EAX
00374C43 B9 01000000 MOV ECX , 1
00374C48 AC LODS BYTE PTR DS :[ESI ]
00374C49 3C CC CMP AL , 0CC
00374C4B 75 08 JNZ SHORT 00374C55
00374C4D 58 POP EAX ; 0012FFE0
00374C4E 59 POP ECX ; 0012FFE0
00374C4F 5E POP ESI ; 0012FFE0
00374C50 E9 E9150000 JMP <Game_Over>
00374C55 ^ E2 F1 LOOPD SHORT 00374C48
00374C57 58 POP EAX ; 0012FFE0
00374C58 59 POP ECX ; 0012FFE0
00374C59 5E POP ESI ; 0012FFE0
00374C5A C3 RETN
Calculate_CRC:
00374C5B > 83CA FF OR EDX , FFFFFFFF ; Calculate_CRC
00374C5E 51 PUSH ECX
00374C5F AC LODS BYTE PTR DS :[ESI ]
00374C60 32C2 XOR AL , DL
00374C62 6A 08 PUSH 8
00374C64 59 POP ECX ; 0012FFE0
00374C65 0FB6D8 MOVZX EBX , AL
00374C68 D1EB SHR EBX , 1
00374C6A 73 06 JNB SHORT 00374C72
00374C6C 81F3 2083B8ED XOR EBX , EDB88320
00374C72 ^ E2 F4 LOOPD SHORT 00374C68
00374C74 C1EA 08 SHR EDX , 8
00374C77 33D3 XOR EDX , EBX
00374C79 59 POP ECX ; 0012FFE0
00374C7A ^ E2 E2 LOOPD SHORT 00374C5E
00374C7C F7D2 NOT EDX
00374C7E 92 XCHG EAX , EDX
00374C7F C3 RETN
Game_Over:
0037623E 8B85 CE434000 MOV EAX , DWORD PTR SS :[EBP +4043CE] ; Game_Over
00376244 85C0 TEST EAX , EAX
00376246 74 07 JE SHORT 0037624F
0376248 61 POPAD
00376249 B8 00000000 MOV EAX , 0
0037624E C3 RETN
0037624F 6A 00 PUSH 0
00376251 6A 00 PUSH 0
00376253 FFB5 D6444000 PUSH DWORD PTR SS :[EBP +<727.APIExitProcess>] ; kernel32.ExitProcess
00376259 8D8D 834B4000 LEA ECX , DWORD PTR SS :[EBP +404B83]
0037625F 8DBD A01A4000 LEA EDI , DWORD PTR SS :[EBP +<727.Crc_Start_addr>]
00376265 2BCF SUB ECX , EDI
00376267 33C0 XOR EAX , EAX
00376269 F3:AA REP STOS BYTE PTR ES :[EDI ]
0037626B AB STOS DWORD PTR ES :[EDI ]
0037626C C3 RETN Greetz:
Fly.Jingulong,yock,tDasm.David.hexer,hmimys,ahao.UFO(brother).alan(sister).all of my
friends and you! 谨此献给我爱的文,love you every day!
By loveboom[DFCG][FCG][US]
439K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3j5X3#2V1x3X3y4Z5k6h3^5`.
Email:loveboom#163.com