这篇文章其实写了一段时间了,也有很多朋友看过的说,这篇文章里其实有很多错误的,各位凑着看吧,但愿能有点帮助,。因为这个壳的新版基本分析出来,所以把这篇旧的发出来share一下.同时旧版的下篇修复篇我不再写.就留给大家练习

某外挂程序hying外壳的一点分析(上)
【目    标】:某外挂程序
【工    具】:Olydbg1.1
【操作平台】:WINXP pro sp1 
【作    者】:loveboom[DFCG][FCG][US]
【简要说明】:
国庆也过了,自己这段时间也没写什么文章,现趁国庆之余凑上一篇文章,因外壳关系到圈内人士,所以,咱们内部成员看看就是了。没经过本人的同意,请不要随意转载哦:-).
【详细过程】:
也不多说什么了,你慢慢看吧!!…
004C559E > /E9 00000000     JMP 004C55A3                             ; 这里伪装成XPR的壳的入口
004C55A3   \60              PUSHAD
004C55A4    E8 14000000     CALL 004C55BD
004C55A9    5D              POP EBP
004C55AA    81ED 00000000   SUB EBP,0
004C55B0    6A 45           PUSH 45
004C55B2    E8 A3000000     CALL 004C565A
004C55B7    68 00000000     PUSH 0
004C55BC    90              NOP
004C55BD    58              POP EAX
004C55BE    61              POPAD                                    ; 看一下这里就知道是骗人的东西了
004C55BF  ^ E9 0DBBFEFF     JMP 004B10D1
004B10D7    5D              POP EBP                                  ; mov ebp,5b10d7
004B10D8    81ED D7000000   SUB EBP,0D7
004B10DE    8DB5 EE000000   LEA ESI,DWORD PTR SS:[EBP+EE]
004B10E4    55              PUSH EBP
004B10E5    56              PUSH ESI                                 ; 准备从4B10EE处解压代码
004B10E6    81C5 890B0000   ADD EBP,0B89
004B10EC    55              PUSH EBP                                 ; 转去4B1B89处开始解压代码
004B10ED    C3              RETN
……
004B1EA5    45              INC EBP
004B1EA6    25 1C790119     AND EAX,1901791C
004B1EAB    B8 A4C0F368     MOV EAX,68F3C0A4
004B1EB0    8132 91D56240   XOR DWORD PTR DS:[EDX],4062D591          ; 很多类似这样的解压代码
004B1EB6    B8 370C2157     MOV EAX,57210C37
004B1EBB    4F              DEC EDI
004B1EBC    B8 42487B77     MOV EAX,777B4842
004B1EC1    8D85 24ACAE31   LEA EAX,DWORD PTR SS:[EBP+31AEAC24]
004B1EC7    B8 8E336864     MOV EAX,6468338E
004B1ECC    42              INC EDX
……
004B2FE1    81EA 2A812A81   SUB EDX,812A812A
004B2FE7    FF0424          INC DWORD PTR SS:[ESP]
004B2FEA    C3              RETN                                     ; 上面的一段解压后到这里,这里返回到4B10F0处,也就是跳去刚开始解压代码的起始处+1.
……
到了这里我就知道快速到这里方法了.在程序一开始的push esi的esp中下硬件访问断点这样一下两次就会到4B2FEA处.
004B10D7    5D              POP EBP                                  ; mov ebp,5b10d7
004B10D8    81ED D7000000   SUB EBP,0D7
004B10DE    8DB5 EE000000   LEA ESI,DWORD PTR SS:[EBP+EE]
004B10E4    55              PUSH EBP
004B10E5    56              PUSH ESI                                 ; 准备从4B10EE处解压代码
004B10E6    81C5 890B0000   ADD EBP,0B89
004B10EC    55              PUSH EBP                                 ; 转去4B1B89处开始解压代码
004B10ED    C3              RETN
004B10EE    EB 5D           JMP SHORT 004B114D
004B10F0    8B45 00         MOV EAX,DWORD PTR SS:[EBP]               ; 是否已经解压的标志,这个一般是对DLL来说的
004B10F3    0BC0            OR EAX,EAX
004B10F5    74 04           JE SHORT 004B10FB                        ; 如果没有标志就跳
004B10F7    55              PUSH EBP
004B10F8    FF65 0C         JMP DWORD PTR SS:[EBP+C]
004B10FB    FF45 00         INC DWORD PTR SS:[EBP]                   ; 如果是没有解压的话,在4B1000处置一个1的标志
004B10FE    8B4424 24       MOV EAX,DWORD PTR SS:[ESP+24]
004B1102    8945 04         MOV DWORD PTR SS:[EBP+4],EAX
004B1105    8DB5 84000000   LEA ESI,DWORD PTR SS:[EBP+84]            ; 哈哈,看看这里保存了什幺东东哦.把dll的名称保存地址放到esi中
004B110B    56              PUSH ESI                                 ; 地址4B1084入栈(KERNEL32.DLL)
004B110C    FF55 78         CALL DWORD PTR SS:[EBP+78]               ; GetModuleHandleA
004B110F    8D75 1C         LEA ESI,DWORD PTR SS:[EBP+1C]            ; 把VirtualAlloc名称所在的地址传到esi中
004B1112    56              PUSH ESI
004B1113    50              PUSH EAX                                 ; 传入Kernel32的hmodule,因为windows在运行的话,程序就一定GetModuleHandleA成功的
004B1114    FF55 74         CALL DWORD PTR SS:[EBP+74]               ; 获取VirtualAlloc的地址
……
0012FF9C   004B110F  /CALL to GetModuleHandleA from xxx.004B110C
0012FFA0   004B1084  \pModule = "KERNEL32.dll"
……
0012FF98   004B1117  /CALL to GetProcAddress from xxx.004B1114
0012FF9C   77E40000  |hModule = 77E40000 (kernel32)
0012FFA0   004B101C  \ProcNameOrOrdinal = "VirtualAlloc"
0012FFA4   0012CD78
……
004B1117    8945 2C         MOV DWORD PTR SS:[EBP+2C],EAX            ; 再把取出VirtualAlloc的地址存入4B102C处
004B111A    6A 04           PUSH 4                                   ; 这幺快就要申请空间了,够直接嘛!
004B111C    68 00100000     PUSH 1000
004B1121    FF75 10         PUSH DWORD PTR SS:[EBP+10]
004B1124    6A 00           PUSH 0
004B1126    FF55 2C         CALL DWORD PTR SS:[EBP+2C]               ; 申请空间,VirtualAlloc
……
0012FF90   004B1129  /CALL to VirtualAlloc from xxx.004B1126
0012FF94   00000000  |Address = NULL
0012FF98   0001670F  |Size = 1670F (91919.)
0012FF9C   00001000  |AllocationType = MEM_COMMIT
0012FFA0   00000004  \Protect = PAGE_READWRITE
……
004B1129    50              PUSH EAX                                 ; 申请到的空间为00370000,入栈先
004B112A    8945 0C         MOV DWORD PTR SS:[EBP+C],EAX             ; 把申请到的空间保存到4B100C处
004B112D    8B5D 08         MOV EBX,DWORD PTR SS:[EBP+8]             ; 译码代码相对偏移1FFE
004B1130    03DD            ADD EBX,EBP                              ; 把RVA转换成VA=4B2FFE
004B1132    50              PUSH EAX                                 ; 刚纔申请的址址00370000,用于存放解压的代码
004B1133    53              PUSH EBX                                 ; 源地址4B2FFE入栈
004B1134    E8 18000000     CALL 004B1151                ;这里解压代码
……
004B115B    8B7424 20       MOV ESI,DWORD PTR SS:[ESP+20]            ; 源地址入esi
004B115F    8B7C24 24       MOV EDI,DWORD PTR SS:[ESP+24]            ; 目标地址370000入edi
……
解压完毕,到这里.
004B1139    5A              POP EDX                                  ; 解压完毕,把申请的地址370000放到edx中
004B113A    52              PUSH EDX
004B113B    55              PUSH EBP
004B113C    8D85 DE000000   LEA EAX,DWORD PTR SS:[EBP+DE]            ; 把4B10DE 放到eax中
004B1142    C600 EB         MOV BYTE PTR DS:[EAX],0EB                ; [eax]中存放0EB,也就是近距离的跳
004B1145    C640 01 10      MOV BYTE PTR DS:[EAX+1],10               ; 这里还在改代码
004B1149    8B45 30         MOV EAX,DWORD PTR SS:[EBP+30]            ; 改完后,把4B1030处的东西保存到[ebp+74]处
004B114C    8945 74         MOV DWORD PTR SS:[EBP+74],EAX            ; 4B1074保存00EC6915
004B114F  - FFE2            JMP EDX                                  ; 改完后跳去刚才解压的那个地方
00370000    E8 24000000     CALL 00370029                            ; JMP EDX到这里
00370005    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]
……
00370027   /EB 24           JMP SHORT 0037004D
00370029   |64:FF35 0000000>PUSH DWORD PTR FS:[0]                    ; 准备异常了
00370030   |EB 12           JMP SHORT 00370044
00370032   |90              NOP
00370033   |9C              PUSHFD
00370034   |74 03           JE SHORT 00370039
00370036   |75 01           JNZ SHORT 00370039
00370038   |90              NOP
00370039   |810C24 00010000 OR DWORD PTR SS:[ESP],100                ; 不小心进来了晕,再来
00370040   |9D              POPFD
……
00370041    90              NOP
00370042  ^ EB F4           JMP SHORT 00370038                       ; 这里单步异常了
……
00370158  ^\EB E6           JMP SHORT 00370140
0037015A    E8 24000000     CALL 00370183                            ; 类似这样的代码就要小心了,不要乱要f7哦,这样的代码我的对付方法是:因壳是用的宏,所以我们看到几个后就可以找到规律的,找到了规律就好办嘛。
0037015F    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]             ; 直接在这里下断,后面类似这样的也可以用这种方法解决
00370163    8B00            MOV EAX,DWORD PTR DS:[EAX]
……
0037313B    E8 00000000     CALL 00373140
00373140    5A              POP EDX                                  ; EDX=373140过了N个宏之后到了这里,本来想用脚本跑到这里来,但怕后面的CRC,所以还是慢慢的跟到这里
00373141    81EA 9E1B4000   SUB EDX,401B9E
……
0037314D    90              NOP
0037314E    90              NOP
0037314F    5D              POP EBP                                  ; POP imageBase,4B1000
00373150    EB 4A           JMP SHORT 0037319C
00373152  ^ EB DF           JMP SHORT 00373133
00373154    43              INC EBX
00373155    90              NOP
00373156    90              NOP
00373157    90              NOP
00373158    58              POP EAX
00373159  ^ 7D F4           JGE SHORT 0037314F
0037315B    EB 01           JMP SHORT 0037315E
0037315D    90              NOP
0037315E  ^ 7C EF           JL SHORT 0037314F
00373160    90              NOP
00373161    58              POP EAX
00373162    9C              PUSHFD
00373163    05 E6FFFFFF     ADD EAX,-1A
00373168    9D              POPFD
00373169    FFE0            JMP EAX                                  ; JMP 00373158
0037316B    90              NOP
……
00373178    B9 03000000     MOV ECX,3
0037317D    EB 4A           JMP SHORT 003731C9
……
003731A8    8D75 74         LEA ESI,DWORD PTR SS:[EBP+74]            ; GetProcAddress的地址入esi
……
003731D5    8DBA 020F4100   LEA EDI,DWORD PTR DS:[EDX+410F02]        ; EDI=003824A4
这个版本的壳,垃圾代码真多哦。跟的时候千万要小心一点
00373226    50              PUSH EAX                                 ; eax=003730F3又是来这幺一招,晕倒,已经有好几个这样的东西了
……
00373205    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]       ; 从3824a4处开始替换三次DWORD代码
……
00373252    56              PUSH ESI                                             ; push 4B1080
……
0037355E    6A 00           PUSH 0                                               ; push 0
00373560    FF95 060F4100   CALL DWORD PTR SS:[EBP+410F06]                       ; GetModuleHandleA
00373566    EB 01           JMP SHORT 00373569
00373568    90              NOP
00373569    68 C2100000     PUSH 10C2
0037356E    E8 01000000     CALL 00373574
00373573    90              NOP
00373574    68 24080E68     PUSH 680E0824
00373579    68 90908344     PUSH 44839090
0037357E  - FFE4            JMP ESP                                              ; 跳去12ff90处
……
00373581    8985 120F4100   MOV DWORD PTR SS:[EBP+410F12],EAX                    ; 把GetModuleHandleA获取到的地址4000000入3824b4处
……
0037359E    6A 04           PUSH 4                                               ; 这里再次分配空间
003735A0    68 00100000     PUSH 1000
003735A5    68 00100000     PUSH 1000
003735AA    6A 00           PUSH 0
003735AC    FF95 0E0F4100   CALL DWORD PTR SS:[EBP+410F0E]                       ; VirtualAlloc
……
0012FF8C   003735B2  /CALL to VirtualAlloc from 003735AC
0012FF90   00000000  |Address = NULL
0012FF94   00001000  |Size = 1000 (4096.)
0012FF98   00001000  |AllocationType = MEM_COMMIT
0012FF9C   00000004  \Protect = PAGE_READWRITE
……
003735B2    8985 49184100   MOV DWORD PTR SS:[EBP+411849],EAX        ; 分配的空间390000入382DEB
003735B8    68 003C070A     PUSH 0A073C00
003735BD    68 9FFC0D75     PUSH 750DFC9F
……
0037445B    8BFE            MOV EDI,ESI                              ; 加载数据到373763
0037445D    B9 46040000     MOV ECX,446                              ; size 446
00374462    AC              LODS BYTE PTR DS:[ESI]                   ; 把取出的数据放到al中
00374463    90              NOP
……
0037448E    90              NOP
0037448F    90              NOP
00374490    32C1            XOR AL,CL
00374492    90              NOP
……
003744A7    90              NOP
003744A8    90              NOP
003744A9    C0C0 04         ROL AL,4
……
003744D9    AA              STOS BYTE PTR ES:[EDI]                   ; 从373763处开始译码,大小为446
003744DA  ^ E2 86           LOOPD SHORT 00374462
……
003744DD    33C0            XOR EAX,EAX                              ; 解压后,又准备异常了
003744DF    64:FF30         PUSH DWORD PTR FS:[EAX]
003744E2    64:8920         MOV DWORD PTR FS:[EAX],ESP
003744E5    0F0B            UD2
……
0012FF9C   0012FFE0  Pointer to next SEH record
0012FFA0   00373712  SE handler
 ……
出现一次0异常后,连续了1311个INT3异常(Crazy).
好了,终于到了光明的地方
00375347    90              NOP
00375348    880431          MOV BYTE PTR DS:[ECX+ESI],AL
0037534B  ^ E2 F6           LOOPD SHORT 00375343
0037534D    64:8F05 0000000>POP DWORD PTR FS:[0]    ;直接在这里下断,然后忽略全部异常
00375354    58              POP EAX
……
003754D6    83C4 04         ADD ESP,4
003754D9    8B85 060F4100   MOV EAX,DWORD PTR SS:[EBP+410F06]        ; kernel32.GetModuleHandleA
……
00381DF2    6A 00           PUSH 0                                   ; push 0
00381DF4    50              PUSH EAX                                 ; push GetModuleHandleA
00381DF5    8B85 49184100   MOV EAX,DWORD PTR SS:[EBP+411849]        ; 刚才申请的空间地址390000
00381F4A    50              PUSH EAX                                 ; push 390000
00381F4B    E8 08000000     CALL 00381F58                            ; 这里进去就是检查API,和把API放到390000那个段里去,变成push api,ret的方式
00381F50    8B85 49184100   MOV EAX,DWORD PTR SS:[EBP+411849]
00381F56    FFE0            JMP EAX
00381F58    60              PUSHAD
00381F59    8B7C24 24       MOV EDI,DWORD PTR SS:[ESP+24]
00381F5D    8B7424 28       MOV ESI,DWORD PTR SS:[ESP+28]            ; 开始检查API函数
……
00381F64    3C 50           CMP AL,50
00381F66    E9 55030000     JMP 003822C0                  ;改成jmp 就不会检测API了,
00381F6B    90              NOP
……
003822C0    C607 68         MOV BYTE PTR DS:[EDI],68                 ; 填成push api
003822C3    8977 01         MOV DWORD PTR DS:[EDI+1],ESI
003822C6    C647 05 C3      MOV BYTE PTR DS:[EDI+5],0C3              ; 这里改成retn
003822CA    83C7 06         ADD EDI,6
003822CD    897C24 FC       MOV DWORD PTR SS:[ESP-4],EDI
003822D1    837C24 2C 00    CMP DWORD PTR SS:[ESP+2C],0
003822D6    EB 18           JMP SHORT 003822F0            ;这里再次改成jmp,也就是让它直接push api的方式或者直接跳去相关的DLL中找到API
003822D8    8BCE            MOV ECX,ESI
……
00381F50    8B85 49184100   MOV EAX,DWORD PTR SS:[EBP+411849]        ; 这里就是跳去刚纔存放API的那个申请空间里
00381F56    FFE0            JMP EAX                                  ; 跳去GetModuleHandleA
00381F58    60              PUSHAD
……
003754EB    8BF0            MOV ESI,EAX                              ; 获取到的hmodule入esi,第一次取kernel32.dll的
003754ED    8985 3A104100   MOV DWORD PTR SS:[EBP+41103A],EAX        ; 把hInstance(77E40000)入3825dc处
003754F3    8D9D 48104100   LEA EBX,DWORD PTR SS:[EBP+411048]
……
00375662    8DBD 26154100   LEA EDI,DWORD PTR SS:[EBP+411526]        ; 把"CloseHandle"的地址382ad4传入edi中
00375668    51              PUSH ECX                                 ; push 21
……
0038232D    60              PUSHAD                                   ; 循环在dll中找到所要找的API
0038232E    8B75 08         MOV ESI,DWORD PTR SS:[EBP+8]
……..
003823E5    61              POPAD
003823E6    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
003823E9    C9              LEAVE
003823EA    C2 0800         RETN 8       ;找到后返回去
第一次在KERNEL32.DLL中要找的API有:
0012FF9C   00382AC8  ASCII "CloseHandle"
0012FF9C   00382AC8  ASCII "CreateFileA"
0012FF9C   00382AC8  ASCII "CreateFileMappingA"
0012FF9C   00382AC8  ASCII "CreateThread"
0012FF9C   00382AC8  ASCII "DeleteFileA"
0012FF9C   00382AC8  ASCII "DeviceIoControl"
0012FF9C   00382AC8  ASCII "ExitProcess"
0012FF9C   00382AC8  ASCII "FindResourceA"
0012FF9C   00382AC8  ASCII "GetCommandLineA"
0012FF9C   00382AC8  ASCII "GetFileSize"
0012FF9C   00382AC8  ASCII "GetCurrentProcess"
0012FF9C   00382AC8  ASCII "GetCurrentProcessId"
0012FF9C   00382AC8  ASCII "GetCurrentThread"
0012FF9C   00382AC8  ASCII "GetModuleHandleA"
0012FF9C   00382AC8  ASCII "GetModuleFileNameA"
0012FF9C   00382AC8  ASCII "GetTempPathA"
0012FF9C   00382AC8  ASCII "GetVersion"
0012FF9C   00382AC8  ASCII "lstrcmpA"
0012FF9C   00382AC8  ASCII "LoadResource"
0012FF9C   00382AC8  ASCII "MapViewOfFile"
0012FF9C   00382AC8  ASCII "ReadProcessMemory"
0012FF9C   00382AC8  ASCII "ResetEvent"
0012FF9C   00382AC8  ASCII "SetEvent"
0012FF9C   00382AC8  ASCII "SetLastError"
0012FF9C   00382AC8  ASCII "SetThreadPriority"
0012FF9C   00382AC8  ASCII "TerminateThread"
0012FF9C   00382AC8  ASCII "UnmapViewOfFile"
0012FF9C   00382AC8  ASCII "VirtualAllocEx"
0012FF9C   00382AC8  ASCII "VirtualFree"
0012FF9C   00382AC8  ASCII "VirtualProtect"
0012FF9C   00382AC8  ASCII "WaitForSingleObject"
0012FF9C   00382AC8  ASCII "WriteProcessMemory"
0012FF9C   00382AC8  ASCII "WriteFile"

……
0037569D    0FB64B FF       MOVZX ECX,BYTE PTR DS:[EBX-1]
003756A1    8903            MOV DWORD PTR DS:[EBX],EAX               ; 取出的API入[EBX]中
003756A3    03D9            ADD EBX,ECX
003756A5    43              INC EBX
003756A6    59              POP ECX
003756A7  ^ E2 A2           LOOPD SHORT 0037564B                     ; 如果没有取完就跳去回去继续
003756A9    8DB5 8A0F4100   LEA ESI,DWORD PTR SS:[EBP+410F8A]        ; mov esi,"user32.dll"
……..
003757FE    56              PUSH ESI                                 ; 准备处理USER32。DLL中要取的API了
003757FF    90              NOP
……….
0037581E    90              NOP
0037581F    8B85 060F4100   MOV EAX,DWORD PTR SS:[EBP+410F06]        ; 第一次用GetModuleHandleA来判断相关的DLL有没有加载
00375825    90              NOP
00375826    90              NOP
00375827    90              NOP
00375828    90              NOP
00375829    90              NOP
0037582A    90              NOP
0037582B    E9 C2C50000     JMP 00381DF2                             ; 这里也就是jmp api调用相关的API
00375830    90              NOP
00375831    0BC0            OR EAX,EAX                               ; 如果GetModuleHandleA失败的话,说明内存中并没有加载相关的DLL
00375833    75 34           JNZ SHORT 00375869                       ; 如果已经加载了相关的DLL就跳去下一步取DLL中相关的API
00375835    56              PUSH ESI                                 ; 因为user32.dll并没有加载所以壳用LoadLibrary来加载这个DLL
00375836    90              NOP
00375855    90              NOP
00375856    8B85 0A0F4100   MOV EAX,DWORD PTR SS:[EBP+410F0A]        ; LoadLibraryA
0037585C    90              NOP
0037585D    90              NOP
0037585E    90              NOP
0037585F    90              NOP
00375860    90              NOP
00375861    90              NOP
00375862    E9 8BC50000     JMP 00381DF2                             ; 看这里又跳去执行API,记住先,JMP 00381DF2就是执行API,我们没必要去跟了
00375867    90              NOP
00375868    90              NOP
00375869    8BF0            MOV ESI,EAX                              ; 加载后的DLL的hmodule入esi中
0037586B    8D9D 960F4100   LEA EBX,DWORD PTR SS:[EBP+410F96]
00375871    6A 0A           PUSH 0A
00375873    59              POP ECX                                  ; mov ecx,0a,又有动作了,这里就是循环取0A个相关的API
00375874    8DBD 26154100   LEA EDI,DWORD PTR SS:[EBP+411526]
0037587A    53              PUSH EBX
……
003758B6    AA              STOS BYTE PTR ES:[EDI]                   ; 又是这一招来取API
003758B7    5B              POP EBX
003758B8    8DBD 26154100   LEA EDI,DWORD PTR SS:[EBP+411526]
………
003758F8    8903            MOV DWORD PTR DS:[EBX],EAX               ; 取到的API (eax)入[ebx]
003758FA    03D9            ADD EBX,ECX
003758FC    43              INC EBX
003758FD    59              POP ECX
003758FE    49              DEC ECX
003758FF  ^ 0F85 6FFFFFFF   JNZ 00375874                             ; 如果没有取完就下一步
00375905    8DB5 49124100   LEA ESI,DWORD PTR SS:[EBP+411249]
……..
00375905    8DB5 49124100   LEA ESI,DWORD PTR SS:[EBP+411249]        ; 现在取WS2_32.DLL中的API了
0037590B    90              NOP
…………
00375A7B    8B85 060F4100   MOV EAX,DWORD PTR SS:[EBP+410F06]        ; GetModuleHandleA
00375A81    90              NOP
00375A82    90              NOP
00375A83    90              NOP
00375A84    90              NOP
00375A85    90              NOP
00375A86    90              NOP
00375A87    E9 66C30000     JMP 00381DF2
00375A8C    90              NOP
00375A8D    0BC0            OR EAX,EAX                               ; 同样判断有没有加载DLL,没有就先LoadLibraryA
00375A8F    75 34           JNZ SHORT 00375AC5
00375A91    56              PUSH ESI
……
00375ACD    B9 04000000     MOV ECX,4                                ; 这次取4个API
要取的4 个API分别为:
00375B29    8903            MOV DWORD PTR DS:[EBX],EAX               ; WS2_32.WSASend
00375B29    8903            MOV DWORD PTR DS:[EBX],EAX               ; WS2_32.WSARecv
00375B29    8903            MOV DWORD PTR DS:[EBX],EAX               ; WS2_32.send
00375B29    8903            MOV DWORD PTR DS:[EBX],EAX               ; WS2_32.recv

……
00375B31    8DB5 72124100   LEA ESI,DWORD PTR SS:[EBP+411272]        ; 好了,现在取ADVAPI32.DLL中的api
……..
00375B31    8DB5 72124100   LEA ESI,DWORD PTR SS:[EBP+411272]        ; 好了,现在取ADVAPI32.DLL中的api
……
00375CF9    6A 08           PUSH 8
00375CFB    59              POP ECX                                  ; 在ADVAPI32。DLL里取8个API
这幺八个:
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.CloseServiceHandle
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.ControlService
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.CreateServiceA
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.DeleteService
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.OpenSCManagerA
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.OpenServiceA
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.QueryServiceStatus
00375D53    8903            MOV DWORD PTR DS:[EBX],EAX               ; ADVAPI32.StartServiceA
……
00375D7B    8B85 E60F4100   MOV EAX,DWORD PTR SS:[EBP+410FE6]        ; 取完后,开始GetForegroundWindow,一看这个就知道干什幺了吧:-)
00375D81    90              NOP
00375D82    90              NOP
……
00375E3D    8B85 CB0F4100   MOV EAX,DWORD PTR SS:[EBP+410FCB]        ; BT用EnableWindow来反跟踪
00375E43    90              NOP
00375E44    90              NOP
……
00375E70    8B85 04114100   MOV EAX,DWORD PTR SS:[EBP+411104]        ; kernel32.GetCurrentThread
00375E76    90              NOP
00375E77    90              NOP
00375E78    90              NOP
00375E79    90              NOP
00375E7A    90              NOP
00375E7B    90              NOP
00375E7C    E9 71BF0000     JMP 00381DF2
……
00375EA6    8B85 B4114100   MOV EAX,DWORD PTR SS:[EBP+4111B4]        ; kernel32.SetThreadPriority
00375EAC    90              NOP
……
0012FF98   00375EB9  /CALL to SetThreadPriority
0012FF9C   FFFFFFFE  |hThread = FFFFFFFE
0012FFA0   00000002  \Priority = THREAD_PRIORITY_HIGHEST
……
00375EB9    50              PUSH EAX
00375EBA    52              PUSH EDX
00375EBB    51              PUSH ECX
00375EBC    EB 01           JMP SHORT 00375EBF
00375EBE    90              NOP
00375EBF    0F31            RDTSC
00375EC1    8BC8            MOV ECX,EAX                              ; RDTSC时间反跟踪
……..
00375ECD    90              NOP
00375ECE    E8 38000000     CALL 00375F0B
00375ED3    90              NOP
进去看看有啥东西:
00375F0E    68 C2100000         PUSH 10C2
00375F13    E8 01000000         CALL 00375F19
00375F18    90                  NOP
00375F19    68 24080E68         PUSH 680E0824
00375F1E    68 90908344         PUSH 44839090
00375F23    FFE4                JMP ESP
00375F25    90                  NOP
00375F26    C3                  RETN

0012FF86    834424 08 0E        ADD DWORD PTR SS:[ESP+8],0E
0012FF8B    68 185F3700         PUSH 375F18
0012FF90    C2 1000             RETN 10
……
00375EDB    90                  NOP
00375EDC    E8 46000000         CALL 00375F27                            ; 里面全部是垃圾来的/lh
00375EE1    90                  NOP
……
00375EF4    0F31                RDTSC
00375EF6    83C4 04             ADD ESP,4
00375EF9    2BC1                SUB EAX,ECX
00375EFB    3D 00000200         CMP EAX,20000                            ; 这里进行比较,如果小于20000就说明程序在跟踪
00375F00    76 04               JBE SHORT 00375F06                       ; 这里一定要跳
……
00375F3B    8B85 120F4100       MOV EAX,DWORD PTR SS:[EBP+410F12]        ; IMAGEBASE(40000)入EAX
00375F41    0340 3C             ADD EAX,DWORD PTR DS:[EAX+3C]            ; 定位PE位置
……
00376093    8B40 50             MOV EAX,DWORD PTR DS:[EAX+50]            ; sizeof image(C5AFA) 入EAX
00376096    3385 260F4100       XOR EAX,DWORD PTR SS:[EBP+410F26]        ; [EBP+410F26]=[003824C8]=E033EF
0037609C    90                  NOP
……
003761EA    90                  NOP
003761EB    8B8D 020F4100       MOV ECX,DWORD PTR SS:[EBP+410F02]        ; MOV ECX,EC6915
003761F1    3BC1                CMP EAX,ECX
003761F3    8DB5 29144100       LEA ESI,DWORD PTR SS:[EBP+411429]        ; MOV ESI,3829CB
003761F9    46                  INC ESI
……
003763A0    56                  PUSH ESI                                 ; PUSH \\.NTICE
003763A1    90                  NOP
003763A2    90                  NOP
003763A3    90                  NOP
003763A4    90                  NOP
003763A5    90                  NOP
003763A6    90                  NOP
003763A7    90                  NOP
003763A8    90                  NOP
003763A9    90                  NOP
003763AA    8D85 314E4000       LEA EAX,DWORD PTR SS:[EBP+404E31]        ; 准备检查调试器
003763B0    90                  NOP
……
003763BF    90                  NOP
003763C0    90                  NOP
003763C1    8B85 55104100       MOV EAX,DWORD PTR SS:[EBP+411055]        ; kernel32.CreateFileA
003763C7    90                  NOP
……
003763D9    0F31                RDTSC                                    ; 检查过程还不忘记用RDTSC的方法来反跟踪
003763DB    8BC8                MOV ECX,EAX
……
0037640D    90                  NOP
0037640E    0F31                RDTSC
00376410    83C4 04             ADD ESP,4
00376413    2BC1                SUB EAX,ECX
00376415    3D 00000200         CMP EAX,20000
0037641A    76 04               JBE SHORT 00376420                       ; 如果检查到就over了
0037641C    83C4 0C             ADD ESP,0C
0037641F    C3                  RETN                                     ; 跳去OVER处
……
00376455    83F8 FF             CMP EAX,-1
00376458    74 05               JE SHORT 0037645F                        ; 如果通过CreateFileA的方法没有找到的话就跳
0037645A    E9 F5CC0000         JMP 00383154                             ; 如果检查到调试器就跳去over处
0037645F    56                  PUSH ESI
00376461   /EB 06               JMP SHORT 00376469
00376463   |F6D0                NOT AL                                   ; 每执行完一次不忘记把字符给去掉,好样的
00376465   |8846 FF             MOV BYTE PTR DS:[ESI-1],AL
00376468   |AC                  LODS BYTE PTR DS:[ESI]
00376469   \0AC0                OR AL,AL
0037646B  ^ 75 F6               JNZ SHORT 00376463                       ; 如果没有擦完则继续
0037646D    5E                  POP ESI
0037647D    0F31                RDTSC                                    ; 还在用时间的方法检测调试器
0037647F    8BC8                MOV ECX,EAX
00376481    90                  NOP
……
003764B2    0F31                RDTSC
003764B4    83C4 04             ADD ESP,4
003764B7    2BC1                SUB EAX,ECX
003764B9    3D 00000200         CMP EAX,20000
003764BE    76 04               JBE SHORT 003764C4                       ; 这里同上
003764C0    83C4 0C             ADD ESP,0C
003764C3    C3                  RETN
……
003764F9    0BC9                OR ECX,ECX                               ; 如果没有检测完还要回去检测,
003764FB  ^ 0F85 50FEFFFF       JNZ 00376351
检测了八九次
00376501    8CC9                MOV CX,CS
00376503    32C9                XOR CL,CL
00376505    0BC9                OR ECX,ECX
00376507    0F84 01080000       JE 00376D0E            ;默认这里跳的,晕,这里又是跳去检测有没有调试器
……
00376DBE    90                  NOP
00376DBF    8B85 060F4100       MOV EAX,DWORD PTR SS:[EBP+410F06]        ; kernel32.GetModuleHandleA
00376DC5    90                  NOP
……
0012FF9C   00376DD1  /CALL to GetModuleHandleA
0012FFA0   00376D95  \pModule = "ntdll.dll"
……
00376F68    90                  NOP
00376F69    E9 84AE0000         JMP 00381DF2                             ; 跳去取NTDLL。DLL里所需的API
00376F6E    90                  NOP
第一次就是取ZwInformationThread
003770BD    90            NOP
003770BE    8BF8          MOV EDI,EAX                              ; ntdll.ZwSetInformationThread
003770C0    50            PUSH EAX
003770C1    52            PUSH EDX
003770C2    51            PUSH ECX
003770C3    EB 01         JMP SHORT 003770C6
003770C5    90            NOP
003770C6    0F31          RDTSC
003770C8    8BC8          MOV ECX,EAX                              ; 很多这样的检测调试器的宏哦
003770CA    90            NOP
……
00377174    6A 00         PUSH 0                    ;又是反调试器用的.
………..
00377162    8B85 0411410>MOV EAX,DWORD PTR SS:[EBP+411104]        ; kernel32.GetCurrentThread先获取当前线程信息,然后搞破坏
00377168    90           NOP
00377169    90           NOP
0037716A    90           NOP  
0037716B    90           NOP
0037716C    90           NOP
0037716D    90           NOP
0037716E    E9 7FAC0000  JMP 00381DF2
00377173    90           NOP
00377176    6A 00         PUSH 0
00377178    6A 11         PUSH 11
0037717A    50            PUSH EAX
0037717B    8D85 E85B4000 LEA EAX,DWORD PTR SS:[EBP+405BE8]
00377181    50            PUSH EAX
00377182    8BC7          MOV EAX,EDI                              ; ntdll.ZwSetInformationThread
00377184    E9 69AC0000   JMP 00381DF2
……
0037718A    8D1D C9174100 LEA EBX,DWORD PTR DS:[4117C9]
00377190    833C2B 00     CMP DWORD PTR DS:[EBX+EBP],0             ; Text section vsize
……
003771CC    8D042B          LEA EAX,DWORD PTR DS:[EBX+EBP]
003771FA    8B48 08         MOV ECX,DWORD PTR DS:[EAX+8]      ;text section vsize 40000
00377225    8B70 04         MOV ESI,DWORD PTR DS:[EAX+4]        ;text section voffset
00377255    03B5 120F4100   ADD ESI,DWORD PTR SS:[EBP+410F12]        ; text section start address
00377288    8BFE            MOV EDI,ESI
003772B4    8D85 E4144100   LEA EAX,DWORD PTR SS:[EBP+4114E4]      ;382A86
003772E3    50              PUSH EAX
0037730E    51              PUSH ECX
00377338    56              PUSH ESI
00377366    E8 D19F0000     CALL 0038133C          ;对text段解压
00377395    53              PUSH EBX
003773C3    6A 04           PUSH 4
003773EE    68 00100000     PUSH 1000
00377418    FF342B          PUSH DWORD PTR DS:[EBX+EBP]
0037741B    6A 00           PUSH 0
0037741D    8D85 FE634000   LEA EAX,DWORD PTR SS:[EBP+4063FE]
00377423    50              PUSH EAX
……..
00377573    8B85 0E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F0E]        ; kernel32.VirtualAlloc
00377579    E9 74A80000     JMP 00381DF2
……
0012FF8C   003779A0  /CALL to VirtualAlloc
0012FF90   00000000  |Address = NULL
0012FF94   000A8000  |Size = A8000 (688128.)
0012FF98   00001000  |AllocationType = MEM_COMMIT
0012FF9C   00000004  \Protect = PAGE_READWRITE
003779D4    8BF0               MOV ESI,EAX                              ; 申请到的空间9B0000入esi
003779FE    8BC3               MOV EAX,EBX                              ; 4117c9
00377A2B    03C5               ADD EAX,EBP                              ; eax==382d68
00377A56    8B78 04            MOV EDI,DWORD PTR DS:[EAX+4]             ; mov edi,1000
00377A84    03BD 120F4100      ADD EDI,DWORD PTR SS:[EBP+410F12]        ; 转换成VA 401000
00377AB5    56                 PUSH ESI                                 ; push 9b0000
00377AE2    57                 PUSH EDI                                 ; push 401000
00377B17    8D85 9E654000      LEA EAX,DWORD PTR SS:[EBP+40659E]        ; EAX==377b40
00377B21    50                 PUSH EAX
00377B2E    8B85 7E0F4100      MOV EAX,DWORD PTR SS:[EBP+410F7E]        ; 4b1151
进入4b1151 后发现还是在解压数据.
00377B39    90              NOP
00377B3A    E9 B3A20000     JMP 00381DF2                             ; 跳去解压数据处,是面是DEPACK(apLib)的代码
00377B3F    90              NOP

……
00377B69    8B0C2B          MOV ECX,DWORD PTR DS:[EBX+EBP]           ; push size?? A8000
00377B96    56              PUSH ESI                                 ; push 9b0000,这个步骤就是要把相关的数据还原回去
00377BC1    51              PUSH ECX
00377BC2    C1E9 02         SHR ECX,2                                ; ecx=2a000把解压出来的东西再施加到401000开始的地方
00377BC5    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
ECX=0002A000 (decimal 172032.)
DS:[ESI]=[009B0000]=00401004
ES:[EDI]=[00401000]=0609B0A1
……
00377BC7    59              POP ECX
00377BC8    83E1 03         AND ECX,3
00377BCB    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
ECX=00000000 (decimal 0.)
DS:[ESI]=[00A58000]=???                    ;这里为什幺会这样??我不知道,请教各位高手了.
ES:[EDI]=[004A9000]=00

00377BF6    5E              POP ESI                                  ; 009B0000
操作完毕,开始释放原来申请的空间.
00377CF6    90              NOP
00377CF7    8B85 F9114100   MOV EAX,DWORD PTR SS:[EBP+4111F9]        ; kernel32.VirtualFree
00377CFD    90              NOP
……
0012FF90   00377D0A  /CALL to VirtualFree
0012FF94   009B0000  |Address = 009B0000
0012FF98   00000000  |Size = 0
0012FF9C   00008000  \FreeType = MEM_RELEASE
……
00377D64    83C3 0C         ADD EBX,0C                               ; 4117c9+0c
00377190    833C2B 00       CMP DWORD PTR DS:[EBX+EBP],0             ; [382D77]==7584
003771CC    8D042B          LEA EAX,DWORD PTR DS:[EBX+EBP]           ; mov eax,382d77
003771FA    8B48 08         MOV ECX,DWORD PTR DS:[EAX+8]             ; mov ecx,1e84
00377225    8B70 04         MOV ESI,DWORD PTR DS:[EAX+4]             ; mov esi,A9A7C
00377255    03B5 120F4100   ADD ESI,DWORD PTR SS:[EBP+410F12]        ; 转成VA
00377288    8BFE            MOV EDI,ESI                              ; 把转成的VA(4A9A7C)入EDI
003772B4    8D85 E4144100   LEA EAX,DWORD PTR SS:[EBP+4114E4]        ; mov eax,382a86
00377366    E8 D19F0000     CALL 0038133C              ; 4A9A7C进行解压代码:
……
003773EE    68 00100000     PUSH 1000                                ; 准备分配空间了
……
00377573    8B85 0E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F0E]        ; kernel32.VirtualAlloc
00377579    E9 74A80000     JMP 00381DF2                             ; 进行分配空间
0012FF8C   003779A0  /CALL to VirtualAlloc
0012FF90   00000000  |Address = NULL
0012FF94   00007584  |Size = 7584 (30084.)
0012FF98   00001000  |AllocationType = MEM_COMMIT
0012FF9C   00000004  \Protect = PAGE_READWRITE
……
00377B2C    90              NOP
00377B2D    90              NOP
00377B2E    8B85 7E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F7E]        ; xxx.004B1151
00377B34    90              NOP
00377B35    90              NOP
00377B36    90              NOP
00377B37    90              NOP
00377B38    90              NOP
00377B39    90              NOP
00377B3A    E9 B3A20000     JMP 00381DF2                             ; 再次进去译码
00377B3F    90              NOP
……
00377BC2    C1E9 02         SHR ECX,2
00377BC5    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>; 解开4A9A7C处的代码
00377BC7    59              POP ECX                                  ; 作者用了几次这个宏
00377BC8    83E1 03         AND ECX,3
00377BCB    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>; 把代码放到41000处
00377BCD    90              NOP
……
00377CF5    90              NOP
00377CF6    90              NOP
00377CF7    8B85 F9114100   MOV EAX,DWORD PTR SS:[EBP+4111F9]        ; kernel32.VirtualFree
00377CFD    90              NOP                                      ; 解压完毕同上,释放空间
00377CFE    90              NOP
……
00377D90    8DB5 BD694000   LEA ESI,DWORD PTR SS:[EBP+4069BD]
00377EE5    87E6            XCHG ESI,ESP                             ; 从377F5F处解开一段代码
00377EE7    B9 8C7D0000     MOV ECX,7D8C                             ; 解压大小为7d8c
00377EEC    58              POP EAX
00377EED    90              NOP
00377EF3    F6D0            NOT AL
00377F00    50              PUSH EAX
00377F07    44              INC ESP
00377F0D  ^\E2 DD           LOOPD SHORT 00377EEC                     ; 如果没有解压完则跳上去继续

……
00377F11    6A 04           PUSH 4
00377F13    68 00100000     PUSH 1000
00377F18    68 00200000     PUSH 2000
00377F1D    6A 00           PUSH 0
……
00377F3F    8B85 0E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F0E]        ; kernel32.VirtualAlloc
00377F45    90              NOP                                      ; 又分配一个空间
0012FF90   00377F52  /CALL to VirtualAlloc
0012FF94   00000000  |Address = NULL
0012FF98   00002000  |Size = 2000 (8192.)
0012FF9C   00001000  |AllocationType = MEM_COMMIT
0012FFA0   00000004  \Protect = PAGE_READWRITE
……
00377F52    8985 51184100   MOV DWORD PTR SS:[EBP+411851],EAX        ; 分配的空间地址3F0000入[382DF3]
00377F58    83A5 55184100 0>AND DWORD PTR SS:[EBP+411855],0
00377F5F    8B85 420F4100   MOV EAX,DWORD PTR SS:[EBP+410F42]        ; mov eax,1
……
00377F92    0BC0            OR EAX,EAX
00377F94    0F85 AF090000   JNZ 00378949                             ; 判断eax是否为0不为0则跳,这里也就是判断IAT有没有加密.因为前面已经是1也就说明IAT是加密了的.
……
0037897C    0395 620F4100   ADD EDX,DWORD PTR SS:[EBP+410F62]
00378982    8B3A            MOV EDI,DWORD PTR DS:[EDX]               ; 判断IAT?
00378AD3    0BFF            OR EDI,EDI
00378AD5    75 05           JNZ SHORT 00378ADC            ;没处理完IAT则跳
00378AD7    E9 89370000     JMP 0037C265                ;处理完毕这里跳走
00378ADC    83C2 05         ADD EDX,5
……
00378C2E    8BF2            MOV ESI,EDX                              ; DLL名称入esi第一次是ADVAPI32.DLL
00378C30    56              PUSH ESI
……
00378C4F    90              NOP
00378C50    90              NOP
00378C51    8B85 060F4100   MOV EAX,DWORD PTR SS:[EBP+410F06]        ; kernel32.GetModuleHandleA
00378C57    90              NOP                                      ; 先用GetModuleHandleA判断目标DLL有没有加载
……
00378C64    0BC0            OR EAX,EAX
00378C66    75 3D           JNZ SHORT 00378CA5                       ; 如果已经加载则下一步,否则先用LoadLibraryA加载DLL,前面跟过就发现,这个DLL已经加载了.
00378C68    56              PUSH ESI                                 ; push dll的名字
……..
00378C89    8B85 0A0F4100   MOV EAX,DWORD PTR SS:[EBP+410F0A]        ; LoadLibraryA
00378C8F    90              NOP                                      ; 加载dll
……
00378C9A    90              NOP
00378C9B    90              NOP
00378C9C    0BC0            OR EAX,EAX                               ; 如果加载成功就下一步
00378C9E    75 05           JNZ SHORT 00378CA5
00378CA0    E9 34A40000     JMP 003830D9                             ; 如果加载失败跳去over 处
00378CA5    EB 26           JMP SHORT 00378CCD
00378CDA    68 E8EB6B3C     PUSH 3C6BEBE8
……
00378F0F    8BF0            MOV ESI,EAX                              ; 获取到的hmodule入esi
00378F11    0BC9            OR ECX,ECX
00378F13    0F85 A5070000   JNZ 003796BE
00378F19    8BCF            MOV ECX,EDI
……
0037906A    8B3A            MOV EDI,DWORD PTR DS:[EDX]
0037906C    03BD 120F4100   ADD EDI,DWORD PTR SS:[EBP+410F12]        ; RVA转换成VA49a210
00379072    83C2 04         ADD EDX,4
00379075    51              PUSH ECX
00379076    0FB602          MOVZX EAX,BYTE PTR DS:[EDX]
00379079    0BC0            OR EAX,EAX
……
003793C8    61              POPAD
003793C9    8D95 26154100   LEA EDX,DWORD PTR SS:[EBP+411526]        ; 第一次取RegQueryValueExA入EDX
……
0037951D    90              NOP
0037951E    52              PUSH EDX                                 ; PUSH API NAME
0037951F    56              PUSH ESI                                 ; PUSH hModule
00379520    90              NOP
……
00379540    8B85 FE0E4100   MOV EAX,DWORD PTR SS:[EBP+410EFE]        ; 3824a0
00379546    90              NOP
00379547    90              NOP
00379548    90              NOP
00379549    90              NOP
0037954A    90              NOP
0037954B    90              NOP
0037954C    E9 A1880000     JMP 00381DF2                             ; GetProcAddress
00379551    90              NOP
00379552    90              NOP
00379553    E8 FC8E0000     CALL 00382454                            ; 判断相关的api  有没有下断点,只比较一位而已
00379558    90              NOP
……..
003796A7    8907            MOV DWORD PTR DS:[EDI],EAX               ; 把api入到相关的位置,第一个就是RegQueryValueExA
EAX=77DA2410 (ADVAPI32.RegQueryValueExA)
DS:[0049A210]=00000000

003796A9    5A              POP EDX
003796AA    0FB642 FF       MOVZX EAX,BYTE PTR DS:[EDX-1]
003796AE    03D0            ADD EDX,EAX
003796B0    42              INC EDX
003796B1    59              POP ECX
003796B2    49              DEC ECX
003796B3  ^ 0F85 B1F9FFFF   JNZ 0037906A                             ; 如果没有取完就回去继续
第二次取Oleaut32.dll,因为这个DLL一开始没载加载,所以这次要先加载的。
到了加载这个DLL的时候就要小心了:
0012FF9C   00378C9C  /CALL to LoadLibraryA
0012FFA0   00383CE7  \FileName = "wsock32.dll"
……
00378F0F    8BF0                 MOV ESI,EAX                              ; 获取到的hmodule入esi
00378F11    0BC9                 OR ECX,ECX
00378F13    0F85 A5070000        JNZ 003796BE                             ; 加载上面的那个DLL后到这里就会跳了,前面几上DLL都没有跳的
00378F19    8BCF                 MOV ECX,EDI
00378F1B    68 00FE98C7          PUSH C798FE00
……
003796BE    8BCF                 MOV ECX,EDI                              ; 重新定位iat
003796C0    81E1 FFFFFF7F        AND ECX,7FFFFFFF
003796C6    51                   PUSH ECX
003796C7    52                   PUSH EDX
……
0037981A    6A 04                PUSH 4                                   ; 准备分配空间
0037981C    68 00100000          PUSH 1000
00379821    51                   PUSH ECX
00379822    6A 00                PUSH 0
00379844    8B85 0E0F4100        MOV EAX,DWORD PTR SS:[EBP+410F0E]        ; kernel32.VirtualAlloc
0037984A    90                   NOP
0037984B    90                   NOP
0037984C    90                   NOP
0037984D    90                   NOP
0037984E    90                   NOP
0037984F    90                   NOP
00379850    E9 9D850000          JMP 00381DF2                             ; 跳去分配空间
00379856    8985 5E0F4100        MOV DWORD PTR SS:[EBP+410F5E],EAX        ; 分配好的空间AB0000放到[382500]处
0037985C    5A                   POP EDX
0037985D    59                   POP ECX
0037985E    60                   PUSHAD
0037985F    90                   NOP
……
003799AE    8BD8                 MOV EBX,EAX                              ; 把分配好的空间在EBX里也放一个
003799B0    EB 17                JMP SHORT 003799C9
003799B2    8B3A                 MOV EDI,DWORD PTR DS:[EDX]
003799B4    03BD 120F4100        ADD EDI,DWORD PTR SS:[EBP+410F12]        ; 把RVA换成VA,第一次是49a818
003799BA    891F                 MOV DWORD PTR DS:[EDI],EBX               ; 晕哦,这里想破坏IAT
003799BC    83C3 20              ADD EBX,20
003799BF    0FB642 04            MOVZX EAX,BYTE PTR DS:[EDX+4]
003799C3    03D0                 ADD EDX,EAX
003799C5    83C2 06              ADD EDX,6
003799C8    49                   DEC ECX
003799C9    0BC9                 OR ECX,ECX
003799CB  ^ 75 E5                JNZ SHORT 003799B2                       ; 没有破坏完就回去继续破坏
……
00379A34    66:C707 FF35         MOV WORD PTR DS:[EDI],35FF               ; 准备填充真正的API到刚才分配的空间里
00379A39    90                   NOP
……
00379B87    90                   NOP
00379B88    C747 06 81342400     MOV DWORD PTR DS:[EDI+6],243481          ; XOR DWORD PTR [ESP],XORKEY
00379B8F    90                   NOP
……
00379CDE    8947 02              MOV DWORD PTR DS:[EDI+2],EAX             ; 准备放入返回字符串
00379CE1    90                   NOP
00379D0E    C647 0D C3           MOV BYTE PTR DS:[EDI+D],0C3        ;放入RET
00379D12    52                   PUSH EDX                                 ; 这里又准备用时间来检查调试器
……
00379E87    8947 09              MOV DWORD PTR DS:[EDI+9],EAX             ; XORKEY
00379E8A    5A                   POP EDX
00379E8B    83C7 20              ADD EDI,20
00379E8E    49                   DEC ECX
00379E8F    0BC9                 OR ECX,ECX
00379E91  ^ 0F85 6DFBFFFF        JNZ 00379A04          ;如果没有“填满”代码则继续破坏.
……
0037AE28    8B85 56114100        MOV EAX,DWORD PTR SS:[EBP+411156]        ; 比较字符串
0037AE2E    90                   NOP
……
0012FF8C   0037AE3A  /CALL to lstrcmpA
0012FF90   00382986  |String1 = "LoadLibraryA"
0012FF94   00382AC8  \String2 = "WSACleanup"
0012FF98   00382AC8  ASCII "WSACleanup"
……
0037AE3B    85C0                 TEST EAX,EAX
0037AE3D    75 0B                JNZ SHORT 0037AE4A                       ; 比较如果不同就跳
又在找,找有没有要特殊加密的api??
看看这个表有什幺东西要“关照”的。
003828A5  58 44 4C 4C 2E 44 4C 4C 00 46 75 6E 63 32 46 75  XDLL.DLL.Func2Fu
003828B5  6E 63 00 54 65 73 74 44 65 62 75 67 00 45 6E 43  nc.TestDebug.EnC
003828C5  72 79 70 74 00 44 65 43 72 79 70 74 00 43 52 43  rypt.DeCrypt.CRC
003828D5  00 54 65 73 74 42 6D 70 00 43 72 65 61 74 65 44  .TestBmp.CreateD
003828E5  69 61 6C 6F 67 50 61 72 61 6D 41 00 44 69 61 6C  ialogParamA.Dial
003828F5  6F 67 42 6F 78 50 61 72 61 6D 41 00 44 65 62 75  ogBoxParamA.Debu
00382905  67 42 72 65 61 6B 00 45 78 69 74 50 72 6F 63 65  gBreak.ExitProce
00382915  73 73 00 46 72 65 65 52 65 73 6F 75 72 63 65 00  ss.FreeResource.
00382925  47 65 74 50 72 6F 63 41 64 64 72 65 73 73 00 47  GetProcAddress.G
00382935  65 74 56 65 72 73 69 6F 6E 00 47 65 74 4D 6F 64  etVersion.GetMod
00382945  75 6C 65 48 61 6E 64 6C 65 41 00 47 65 74 43 75  uleHandleA.GetCu
00382955  72 72 65 6E 74 50 72 6F 63 65 73 73 00 47 65 74  rrentProcess.Get
00382965  43 75 72 72 65 6E 74 50 72 6F 63 65 73 73 49 64  CurrentProcessId
00382975  00 47 65 74 43 6F 6D 6D 61 6E 64 4C 69 6E 65 41  .GetCommandLineA
00382985  00 4C 6F 61 64 4C 69 62 72 61 72 79 41 00 4C 6F  .LoadLibraryA.Lo
00382995  63 6B 52 65 73 6F 75 72 63 65 00 53 65 6E 64 4D  ckResource.SendM
003829A5  65 73 73 61 67 65 41 00 73 65 6E 64 00 72 65 63  essageA.send.rec
003829B5  76 00                                            v.
……
0037B124    85C0                 TEST EAX,EAX
0037B126    75 0B                JNZ SHORT 0037B133                       ; 第二次没找到跳
0037B128    8D85 09FE4000        LEA EAX,DWORD PTR SS:[EBP+40FE09]
0037B16E    5A                   POP EDX
0037B16F    85C0                 TEST EAX,EAX
0037B171    75 0B                JNZ SHORT 0037B17E                       ; 第三次没有找到
0037B1B9    5A                   POP EDX
0037B1BA    85C0                 TEST EAX,EAX
0037B1BC    75 0B                JNZ SHORT 0037B1C9                       ; 第四次比较
0037B204    5A                   POP EDX
0037B205    85C0                 TEST EAX,EAX
0037B207    75 0B                JNZ SHORT 0037B214                       ; 第五次
0037B209    8D85 67FE4000        LEA EAX,DWORD PTR SS:[EBP+40FE67]
0037B250    85C0                 TEST EAX,EAX                             ; 第六次
0037B252    75 0B                JNZ SHORT 0037B25F
……
0037B3A1   /E9 4C6A0000          JMP 00381DF2                             ; 这里有点不同,这次不是返回下面一两行的
0037B3A6  -|E9 8BC55052          JMP 52887936
0037B3AB   |51                   PUSH ECX
一共十六次,分别比较这幺几个API
LoadLibraryA
GetProcAddress
GetVersion
GetModuleHandleA
GetCurrentProcess
GetCurrentProcessId
GetCommandLineA
Lockresource
FreeResource
ExitProcess
DialogBoxParamA
CreateDialogParamA
SendMessageA
Send
recv
DebugBreak
……
0037BB1B    52                   PUSH EDX                                 ; 如果没有找到就开始获取API
0037BB1C    56                   PUSH ESI
0037BB3C    90                   NOP
0037BB3D    8B85 FE0E4100        MOV EAX,DWORD PTR SS:[EBP+410EFE]
0037BB43    90                   NOP
0037BB44    90                   NOP
0037BB45    90                   NOP
0037BB46    90                   NOP
0037BB47    90                   NOP
0037BB48    90                   NOP
0037BB49    E9 A4620000          JMP 00381DF2                             ; 进入获取API
0037BB4E    90                   NOP
0037BB4F    8B9D 51184100        MOV EBX,DWORD PTR SS:[EBP+411851]        ; 第二层复位位IMAGEBASE(003F0000)
0037BB55    039D 55184100        ADD EBX,DWORD PTR SS:[EBP+411855]        ; 第二层复位位相对地址
0037BB5C    6A 00                PUSH 0
0037BB5E    50                   PUSH EAX
0037BB5F    53                   PUSH EBX
0037BB60    E8 F3630000          CALL 00381F58                            ; 获取API地址变成push API的方式,如果没有改前面的代码壳还会先抽代码到壳里
0037BB65    2B85 51184100        SUB EAX,DWORD PTR SS:[EBP+411851]
0037BB6B    8985 55184100        MOV DWORD PTR SS:[EBP+411855],EAX
0037BB71    60                   PUSHAD
0037BB72    3D C01F0000          CMP EAX,1FC0                             ; 检查够不够空间放东西,如果不够就再申请一段空间
0037BB77    0F86 8A010000        JBE 0037BD07                             ; 我们这里够了,所以壳这里跳
0037BB7D    6A 04                PUSH 4
0037BB7F    68 00100000          PUSH 1000                                ; 一般看到这样的东西就知道十有九是分配空间来的
0037BB84    68 00200000          PUSH 2000
0037BB89    6A 00                PUSH 0
0037BB8B    8D85 58A74000        LEA EAX,DWORD PTR SS:[EBP+40A758]
0037BB91    50                   PUSH EAX
0037BB92    8B85 0E0F4100        MOV EAX,DWORD PTR SS:[EBP+410F0E]
0037BB98    E9 55620000          JMP 00381DF2                             ; 跳去分配空间
0037BB9D    EB 64                JMP SHORT 0037BC03
0037BE57    5B                   POP EBX
0037BE58    8BC3                 MOV EAX,EBX
0037BE5A    3347 09              XOR EAX,DWORD PTR DS:[EDI+9]
……
0037BFAC    8947 1C              MOV DWORD PTR DS:[EDI+1C],EAX            ; 还在向里面填垃圾
0037BFAF    5A                   POP EDX
0037C258    59                   POP ECX
0037C259    49                   DEC ECX
0037C25A  ^ 0F85 39DCFFFF        JNZ 00379E99                             ; 如果没有操作完成还要回去继续
0037C260  ^\E9 1DC7FFFF          JMP 00378982
0037C265    E8 0A000000  CALL 0037C274                            ; 处理IAT完毕到这里
……
0037C293    90           NOP
0037C294    8B85 060F410>MOV EAX,DWORD PTR SS:[EBP+410F06]        ; 获取NTDLL.dll的hmodule
0037C29A    90           NOP
0037C29B    90           NOP
0037C29C    90           NOP
0037C29D    90           NOP
0037C29E    90           NOP
0037C29F    90           NOP
0037C2A0    E9 4D5B0000  JMP 00381DF2                             ; GetModuleHandleA
……
0037C3F5    0BC0         OR EAX,EAX                               ; 因为我的系统是XP,所以这里不会跳的
0037C3F7    0F84 E709000>JE 0037CDE4                              ; 如果获取NTDLL。DLL失败则跳去下一步,不知道这里是不是去加win9x的路呢
0037C43C    90           NOP
0037C43D    8B85 FE0E410>MOV EAX,DWORD PTR SS:[EBP+410EFE]        ; 跳去ZwQueryInformationProcess
0037C443    90           NOP
0037C444    90           NOP
0037C445    90           NOP
0037C446    90           NOP
0037C447    90           NOP
0037C448    90           NOP
0037C449    E9 A4590000  JMP 00381DF2                             ; GetProcAddress
0037C44E    90           NOP
0037C44F    68 00FE9804  PUSH 498FE00
……
0037C59E    0BC0         OR EAX,EAX                               ; ntdll.ZwQueryInformationProcess
0037C5A0    0F84 3E08000>JE 0037CDE4                              ; 这里判断有没有取到那个API,如果没有取到则跳
……
0037C5CD    90           NOP
0037C5CE    8B85 DC10410>MOV EAX,DWORD PTR SS:[EBP+4110DC]        ; kernel32.GetCurrentProcess
0037C5D4    90           NOP                                      ; 获取当前的Process,看到这里就知道他想做了吧
……
0037C72F    8BF8            MOV EDI,EAX
0037C731    50              PUSH EAX
0037C732    8BC4            MOV EAX,ESP
……
0037C883    6A 00           PUSH 0                                   ; 到了这里还不忘记放炸弹
0037C885    6A 04           PUSH 4
……
0037C9D6    50              PUSH EAX
0037C9D7    6A 07           PUSH 7
0037CB28    57              PUSH EDI
0037CB29    FFD6            CALL ESI                                 ; ntdll.ZwQueryInformationProcess
……
0037CC7A    58              POP EAX
0037CC7B    0BC0            OR EAX,EAX
0037CC7D    0F84 61010000   JE 0037CDE4                              ; 这里判断上面的API有没有起作用
0037CC83    0F31            RDTSC
0037CC85    25 FF0F0000     AND EAX,0FFF
0037CC8A    05 00100000     ADD EAX,1000
…..
0037CF39    8BF4            MOV ESI,ESP
0037CF3B    8BFC            MOV EDI,ESP
……
0037D1E0    F3:AB           REP STOS DWORD PTR ES:[EDI]
0037D1E2    68 00010000     PUSH 100                    ;length
……
0037D336    56              PUSH ESI                  ;缓冲地址
0037D337    8B85 120F4100   MOV EAX,DWORD PTR SS:[EBP+410F12]        ; hmodule
0037D33D    90              NOP
……
0037D48C    50              PUSH EAX                                 ; xxx.00400000
0037D4AD    8B85 28114100   MOV EAX,DWORD PTR SS:[EBP+411128]        ; kernel32.GetModuleFileNameA
0037D4B3    90              NOP
0037D4B4    90              NOP
0037D4B5    90              NOP
0037D4B6    90              NOP
0037D4B7    90              NOP
0037D4B8    90              NOP
0037D4B9    E9 34490000     JMP 00381DF2                             ; Run API
……
0012FE94   0037D4BF  /CALL to GetModuleFileNameA
0012FE98   00400000  |hModule = 00400000 (xxx)
0012FE9C   0012FEA4  |PathBuffer = 0012FEA4
0012FEA0   00000100  \BufSize = 100 (256.)
……
0037D60E    6A 00           PUSH 0
0037D610    68 80000000     PUSH 80
0037D615    6A 03           PUSH 3
0037D617    6A 00           PUSH 0
0037D619    6A 03           PUSH 3
0037D61B    68 00000080     PUSH 80000000
0037D620    56              PUSH ESI                                 ; push 文件名
0037D621    8D85 9AC04000   LEA EAX,DWORD PTR SS:[EBP+40C09A]
0037D627    50              PUSH EAX
0037D628    8B85 55104100   MOV EAX,DWORD PTR SS:[EBP+411055]        ; kernel32.CreateFileA
0037D62E    E9 BF470000     JMP 00381DF2                             ; Run API
……
0012FE84   0037D63C  /CALL to CreateFileA
0012FE88   0012FEA4  |FileName = "xxxxxxxx.exe"            ;为了引起公愤而去掉了.
0012FE8C   80000000  |Access = GENERIC_READ
0012FE90   00000003  |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012FE94   00000000  |pSecurity = NULL
0012FE98   00000003  |Mode = OPEN_EXISTING
0012FE9C   00000080  |Attributes = NORMAL
0012FEA0   00000000  \hTemplateFile = NULL
……
0037D63C    8BD8            MOV EBX,EAX                              ; hFile=40 to ebx
0037D63E    81C4 00010000   ADD ESP,100
0037D644    6A 00           PUSH 0
0037D646    53              PUSH EBX                                 ; push hfile
……
0037D667    8B85 CF104100   MOV EAX,DWORD PTR SS:[EBP+4110CF]        ; kernel32.GetFileSize
0037D66D    90              NOP                                      ; 获取文件大小
0037D66E    90              NOP
0037D66F    90              NOP
0037D670    90              NOP
0037D671    90              NOP
0037D672    90              NOP
0037D673    E9 7A470000     JMP 00381DF2                             ; Run API
……
0012FF98   0037D679  /CALL to GetFileSize
0012FF9C   00000040  |hFile = 00000040 (window)
0012FFA0   00000000  \pFileSizeHigh = NULL
……
0037D678    90              NOP
0037D679    8985 160F4100   MOV DWORD PTR SS:[EBP+410F16],EAX        ; 文件大小入[3824B8]处
0037D67F    6A 00           PUSH 0
0037D681    FFB5 160F4100   PUSH DWORD PTR SS:[EBP+410F16]           ; 文件大小入栈
0037D687    6A 00           PUSH 0
0037D689    6A 02           PUSH 2
0037D68B    6A 00           PUSH 0
0037D68D    53              PUSH EBX                                 ; push hFile
0037D6AE    8B85 62104100   MOV EAX,DWORD PTR SS:[EBP+411062]        ; kernel32.CreateFileMappingA
0037D6B4    90              NOP
0037D6B5    90              NOP
0037D6B6    90              NOP
0037D6B7    90              NOP
0037D6B8    90              NOP
0037D6B9    90              NOP
0037D6BA    E9 33470000     JMP 00381DF2                             ; 把文件影射到内存中
0037D6BF    90              NOP
0037D6C0    8985 1A0F4100   MOV DWORD PTR SS:[EBP+410F1A],EAX        ; hMap==44
0037D6C6    6A 00           PUSH 0
0037D6C8    6A 00           PUSH 0
0037D6CA    6A 00           PUSH 0
0037D6CC    6A 04           PUSH 4
0037D6CE    FFB5 1A0F4100   PUSH DWORD PTR SS:[EBP+410F1A]           ; push hmap
0037D6D4    8D85 4CC14000   LEA EAX,DWORD PTR SS:[EBP+40C14C]
0037D6DA    50              PUSH EAX
0037D6DB    8B85 6E114100   MOV EAX,DWORD PTR SS:[EBP+41116E]        ; kernel32.MapViewOfFile
……
0012FF8C   0037D6EE  /CALL to MapViewOfFile
0012FF90   00000044  |hMapObject = 00000044 (window)
0012FF94   00000004  |AccessMode = FILE_MAP_READ
0012FF98   00000000  |OffsetHigh = 0
0012FF9C   00000000  |OffsetLow = 0
0012FFA0   00000000  \MapSize = 0
……
0037D6EE    8985 1E0F4100   MOV DWORD PTR SS:[EBP+410F1E],EAX        ; pMap==AF0000
0037D6F4    53              PUSH EBX                                 ; push hfile
0037D6F5    8B40 3C         MOV EAX,DWORD PTR DS:[EAX+3C]            ; 定位PE部分 e_lfanew
0037D6F8    8B8D 160F4100   MOV ECX,DWORD PTR SS:[EBP+410F16]        ; 文件大小入ecx
0037D6FE    2BC8            SUB ECX,EAX
0037D700    8BB5 1E0F4100   MOV ESI,DWORD PTR SS:[EBP+410F1E]
0037D706    03F0            ADD ESI,EAX                              ; 把RVA转换成VA
0037D708    E8 CD360000     CALL 00380DDA                            ; 计算CRC 的值
0037D70D    5B              POP EBX
0037D70E    3385 260F4100   XOR EAX,DWORD PTR SS:[EBP+410F26]
0037D714    C1C8 03         ROR EAX,3
0037D717    8BF0            MOV ESI,EAX                              ; CRC值为6D478F72
0037D719    8B85 1E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F1E]
……
0037D86E    0340 3C         ADD EAX,DWORD PTR DS:[EAX+3C]            ; 把CRC值保存在PE头减4的位置:-)
0037D871    8B78 FC         MOV EDI,DWORD PTR DS:[EAX-4]             ; 文件原来计算好的CRC值(6D478F72)
0037D874    FFB5 1E0F4100   PUSH DWORD PTR SS:[EBP+410F1E]
……
0037D897    90              NOP
0037D898    90              NOP
0037D899    90              NOP
0037D89A    8B85 D8114100   MOV EAX,DWORD PTR SS:[EBP+4111D8]        ; kernel32.UnmapViewOfFile
0037D8A0    90              NOP                                      ; 取完CRC的值后,关闭对象
……
0037D8AB    90              NOP
0037D8AC    FFB5 1A0F4100   PUSH DWORD PTR SS:[EBP+410F1A]           ; push hmap
0037D8B2    90              NOP
…….
0037D8D1    90              NOP
0037D8D2    8B85 48104100   MOV EAX,DWORD PTR SS:[EBP+411048]        ; kernel32.CloseHandle
0037D8D8    90              NOP
……
0012FF9C   0037D917  /CALL to CloseHandle
0012FFA0   00000040  \hObject = 00000040 (window)      ;hFile
……
0037D916    90              NOP
0037D917    8B85 4A0F4100   MOV EAX,DWORD PTR SS:[EBP+410F4A]        ; 判断是否要进行CRC检测
……
0037DA6C    83F8 01         CMP EAX,1
0037DA6F    75 08           JNZ SHORT 0037DA79                       ; 不要进行CRC检测就跳
0037DA71    3BF7            CMP ESI,EDI
0037DA73    0F85 DB560000   JNZ 00383154                             ; 如果两个CRC相等就不跳,不等就完了
0037DA79    80BD C0164100 0>CMP BYTE PTR SS:[EBP+4116C0],0           ;里面的值为DF,判断是否对CALL和JMP处理过???
0037DA80    75 05           JNZ SHORT 0037DA87            ;因为我们这里程序是处理过的,所以这里会跳,跳完后还是到下一步(jmp 0037E2B8)
0037DA82    E9 31080000     JMP 0037E2B8
……
0037DA87    8BB5 41174100   MOV ESI,DWORD PTR SS:[EBP+411741]        ; 准备从401000处开始搜索有没有0E9或是0E8
0037DA8D    03B5 120F4100   ADD ESI,DWORD PTR SS:[EBP+410F12]        ; TO VA  401000
0037DBE2    8B8D 45174100   MOV ECX,DWORD PTR SS:[EBP+411745]        ; mov ecx,10b0
0037DD37    83E9 05         SUB ECX,5                                ; 10b0-5
0037DD3A    E9 6D050000     JMP 0037E2AC
0037DD3F    66:8B06         MOV AX,WORD PTR DS:[ESI]                 ; 每次取两个第一次比较是不是0E8如果不是则跳
0037DD42    3C E8           CMP AL,0E8
0037DD44    0F85 C0010000   JNZ 0037DF0A                             ; 不等就跳
0037DD4A    8B46 01         MOV EAX,DWORD PTR DS:[ESI+1]             ; 同样判断是不是E8,如果则取其后四位,然后判断其后一们是否为DF如果是则进行处理
0037DD4D    C1C0 08         ROL EAX,8
0037DD50    3A85 C0164100   CMP AL,BYTE PTR SS:[EBP+4116C0]
0037DD56    0F85 A3010000   JNZ 0037DEFF                             ; 如果不符合条件则跳
0037DD5C    6A 00           PUSH 0
0037DD75    68 C5C18E05     PUSH 58EC1C5
0037DEF6    2B85 120F4100   SUB EAX,DWORD PTR SS:[EBP+410F12]        ; 0E8和E9的处理情况一样,先shr 8然后减去基址
0037DEFC    2946 01         SUB DWORD PTR DS:[ESI+1],EAX
0037DEFF    83C6 04         ADD ESI,4
0037DF02    83E9 04         SUB ECX,4
0037DF05    E9 A0030000     JMP 0037E2AA
0037DF0A    3C E9           CMP AL,0E9                               ; 跳下来比较是不是0E9,如果不是则再跳
0037DF0C    0F85 C0010000   JNZ 0037E0D2
0037DF12    8B46 01         MOV EAX,DWORD PTR DS:[ESI+1]             ; 如果找到则把E9后面的四位移到EAX中
0037DF15    C1C0 08         ROL EAX,8
0037DF18    3A85 C0164100   CMP AL,BYTE PTR SS:[EBP+4116C0]          ; 这里比较E9后的第一位是不是为DF
0037DF1E    0F85 A3010000   JNZ 0037E0C7                             ; 如果不是则跳
0037DF24    6A 00           PUSH 0
0037DF53    68 C5C18E05     PUSH 58EC1C5
0037E0BE    2B85 120F410>SUB EAX,DWORD PTR SS:[EBP+410F12]        ; 把取出的值取反后减去imgbase
0037E0C4    2946 01      SUB DWORD PTR DS:[ESI+1],EAX             ; 然后把计算后的值填回去
0037E0C7    83C6 04      ADD ESI,4                                ; 因为上面已经处理过,所以是加4
0037E0CA    83E9 04      SUB ECX,4
0037E0CD    E9 D8010000  JMP 0037E2AA
0037E0D2    3C 0F        CMP AL,0F                                ; 比较低位是不是0f,不是则跳
0037E0D4    0F85 D001000>JNZ 0037E2AA
0037E0DA    80FC 7F      CMP AH,7F                                ; 比较高位是不是7F,
0037E0DD    0F86 C701000>JBE 0037E2AA
0037E0E3    80FC 90      CMP AH,90
0037E0E6   /0F83 BE01000>JNB 0037E2AA
0037E0EC   |8B46 02      MOV EAX,DWORD PTR DS:[ESI+2]             ; 判断是不是远程条件判断0f84之类的,如果是则处理
0037E0EF   |C1C0 08      ROL EAX,8
0037E0F2   |3A85 C016410>CMP AL,BYTE PTR SS:[EBP+4116C0]          ; 同样这里再次判断是不是DF
0037E0F8   |0F85 A601000>JNZ 0037E2A4
…..
0037E2AB    49           DEC ECX
0037E2AC    81F9 0000008>CMP ECX,80000000                         ; 这里我不明白cmp cex,0不行吗/???
0037E2B2  ^ 0F82 87FAFFF>JB 0037DD3F
处理完,到这里了
0037E40E    8B85 4A114100   MOV EAX,DWORD PTR SS:[EBP+41114A]        ; kernel32.GetVersion
0037E414    E9 D9390000     JMP 00381DF2
……
0037E423    8985 15144100   MOV DWORD PTR SS:[EBP+411415],EAX        ; MOV 3829B7,A280105
……
0037E449    8B85 DC104100   MOV EAX,DWORD PTR SS:[EBP+4110DC]        ; kernel32.GetCurrentProcess
0037E44F    90              NOP
……
0037E5AA    8985 1D144100   MOV DWORD PTR SS:[EBP+41141D],EAX        ; ProcID(-1) to 3829BF
……
0037E5D0    8B85 EF104100   MOV EAX,DWORD PTR SS:[EBP+4110EF]        ; kernel32.GetCurrentProcessId
0037E5D6    90              NOP
……
0037E5E2    8985 21144100   MOV DWORD PTR SS:[EBP+411421],EAX        ; Current Process ID (BE0)
EAX=00000BE0
SS:[003829C3]=00000000
……
0037E73E    8B85 BE104100   MOV EAX,DWORD PTR SS:[EBP+4110BE]        ; kernel32.GetCommandLineA
0037E744    E9 A9360000     JMP 00381DF2
……
0037E755    8985 25144100   MOV DWORD PTR SS:[EBP+411425],EAX        ; 获取的命令行入[3829C7]
0037E75B    6A 00           PUSH 0
……
EAX=00141EE0
SS:[003829C7]=00000000
……
0037E77D    8B85 16114100   MOV EAX,DWORD PTR SS:[EBP+411116]        ; kernel32.GetModuleHandleA
0037E783    90              NOP
……
0012FF9C   0037E78F  /CALL to GetModuleHandleA
0012FFA0   00000000  \pModule = NULL
……
0037E8DE    8985 19144100   MOV DWORD PTR SS:[EBP+411419],EAX        ; hmodule(400000)
EAX=00400000 (xxx.00400000), ASCII "MZP"
SS:[003829BB]=00000000
……
0037EA8F    8B85 62104100   MOV EAX,DWORD PTR SS:[EBP+411062]        ; kernel32.CreateFileMappingA
0037EA95    90              NOP
0012FF88   0037EAA1  /CALL to CreateFileMappingA
0012FF8C   FFFFFFFF  |hFile = FFFFFFFF
0012FF90   00000000  |pSecurity = NULL
0012FF94   00000004  |Protection = PAGE_READWRITE
0012FF98   00000000  |MaximumSizeHigh = 0
0012FF9C   00000100  |MaximumSizeLow = 100
0012FFA0   00382B00  \MapName = "ShellTmpMap"
……
0037EAA1    83F8 00         CMP EAX,0                                ; 如果获取失败则跳
0037EAA4    0F84 AA460000   JE 00383154
0037EAAA    8985 C1164100   MOV DWORD PTR SS:[EBP+4116C1],EAX        ; hMap=40
EAX=00000040
SS:[00382C63]=00000000
……
0037EADC    8B85 6E114100   MOV EAX,DWORD PTR SS:[EBP+41116E]        ; kernel32.MapViewOfFile
0037EAE2    90              NOP
……
0037EAE8   /E9 05330000     JMP 00381DF2
0037EAED   |90              NOP
0037EAEE   |8985 D1164100   MOV DWORD PTR SS:[EBP+4116D1],EAX        ; pMapping=AF0000
……
0037EB03    8B85 15144100   MOV EAX,DWORD PTR SS:[EBP+411415]
0037EB09    3D 00000080     CMP EAX,80000000
0037EB0E    73 19           JNB SHORT 0037EB29                       ; 判断系统是Win9x还是winnt,我们这里是Windows xp所以不会跳
0037EB10    64:FF35 3000000>PUSH DWORD PTR FS:[30]                   ; 这里和IsDebuggerPresent的效果一样,检测RING 3级调试器
0037EB17    58              POP EAX
0037EB18    0FB658 02       MOVZX EBX,BYTE PTR DS:[EAX+2]            ; 我们自己也可以这样写d fs:[30]+2
0037EB1C    0ADB            OR BL,BL
0037EB1E    0F85 30460000   JNZ 00383154                             ; 如果发现了调试器跳去OVER处
0037EB24    E9 77010000     JMP 0037ECA0                             ; 跳去NT部分
……
0037ECA0    8BB5 3A0F4100   MOV ESI,DWORD PTR SS:[EBP+410F3A]
0037ECA6    0BF6            OR ESI,ESI
0037ECA8    0F84 EA020000   JE 0037EF98                              ; 这里跳下去
……
0037EF98    8CC9            MOV CX,CS
0037EF9A    32C9            XOR CL,CL
0037EF9C    0BC9            OR ECX,ECX
0037EF9E    0F84 7F010000   JE 0037F123                              ; 这里跳的话就去了int1异常了
……
0037F136    64:FF35 0000000>PUSH DWORD PTR FS:[0]
0037F13D    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
0037F144    33C0            XOR EAX,EAX
0037F146    CD 01           INT 1                                    ; int 1异常
0037F148    40              INC EAX
0037F149    40              INC EAX
0037F14A    0BC0            OR EAX,EAX
0037F14C    64:8F05 0000000>POP DWORD PTR FS:[0]
0037F153    58              POP EAX
0037F154    0F84 FA3F0000   JE 00383154
……
0037F2E3    8B85 6E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F6E]        ; 判断有没有hook jmp
0037F2E9    0BC0            OR EAX,EAX
0037F2EB    0F84 2A040000   JE 0037F71B                              ; 如果没有则跳
……
0037F2F6    8DB5 991B4000   LEA ESI,DWORD PTR SS:[EBP+401B99]
Address=0037313B
ESI=00000000
……
0037F44B    03F0            ADD ESI,EAX
EAX=00012BFA
ESI=0037313B
……
0037F44B    03F0            ADD ESI,EAX
0037F44D    68 DBF0C5C8     PUSH C8C5F0DB
0037F452    8B1E            MOV EBX,DWORD PTR DS:[ESI]               ; 用来运算的值??[385D35]=94A1C
0037F454    68 6B39764F     PUSH 4F76396B
0037F459    039D 120F4100   ADD EBX,DWORD PTR SS:[EBP+410F12]        ; 把hook表的项目转换成VA(494a1c)
0037F45F    68 D936FBC8     PUSH C8FB36D9
……
0012FF94    31C9            XOR ECX,ECX                              ; 把那个让代码放到ESP中的人给B了^_^
0012FF96    890E            MOV DWORD PTR DS:[ESI],ECX               ; 清除存放表中的数据
0012FF98    83C6 04         ADD ESI,4                                ; 取esi+4的地址到[EBX]中
0012FF9B    8933            MOV DWORD PTR DS:[EBX],ESI               ; 把第一层的地址放到目标程序中
0012FF9D    0FB70E          MOVZX ECX,WORD PTR DS:[ESI]              ; 取地ESI所在在地址的第一位入ecx
0012FFA0    46              INC ESI
0012FFA1    46              INC ESI
0012FFA2    C3              RETN
;----------------------------------------------------------------------------
;这里也就是把壳已经抽空的JMP TABEL填上加密的地址
;----------------------------------------------------------------------------
0037F70B    2956 02         SUB DWORD PTR DS:[ESI+2],EDX             ; 对MAINFORM的重定位进行处理
0037F70E    015E 02         ADD DWORD PTR DS:[ESI+2],EBX
0037F711    0FB706          MOVZX EAX,WORD PTR DS:[ESI]
0037F714    03F0            ADD ESI,EAX
0037F716    49              DEC ECX
0037F717    0BC9            OR ECX,ECX
0037F719  ^ 75 F0           JNZ SHORT 0037F70B
……

0037F5AE    8B9D 120F4100   MOV EBX,DWORD PTR SS:[EBP+410F12]        ; imgbase入ebx
……
0037F71B    6A 04           PUSH 4                                   ; 准备分配空间,因为iat 是已经加密的,所以会到这里
0037F71D    68 00100000     PUSH 1000
0037F722    68 00100000     PUSH 1000
0037F727    6A 00           PUSH 0
0037F748    90              NOP
0037F749    8B85 0E0F4100   MOV EAX,DWORD PTR SS:[EBP+410F0E]        ; kernel32.VirtualAlloc
0037F74F    90              NOP
……
0012FF84   0037F75B  /CALL to VirtualAlloc
0012FF88   00000000  |Address = NULL
0012FF8C   00001000  |Size = 1000 (4096.)
0012FF90   00001000  |AllocationType = MEM_COMMIT
0012FF94   00000004  \Protect = PAGE_READWRITE
……
0037F75B    8985 860F4100   MOV DWORD PTR SS:[EBP+410F86],EAX        ; 分配好的空间b00000入到[00382528]处
0037F761    8185 860F4100 0>ADD DWORD PTR SS:[EBP+410F86],1000
0037F76B    64:FF35 3000000>PUSH DWORD PTR FS:[30]                   ; 不知道什么用的:-(.
0037F8C2    85C0            TEST EAX,EAX
0037F8C4    78 12           JS SHORT 0037F8D8
0037F8C6    8B40 0C         MOV EAX,DWORD PTR DS:[EAX+C]
0037F8C9    8B40 0C         MOV EAX,DWORD PTR DS:[EAX+C]
0037F8CC    C740 20 0010000>MOV DWORD PTR DS:[EAX+20],1000      ;抗DUMP用的,改成1000,如果不用纠正大小的话就会提示大小为1000
0037F8D3   /E9 AF010000     JMP 0037FA87                             ; 跳去VirtualProtect
0037F8D8    6A 00           PUSH 0
0037F8E3    8D85 6AE34000   LEA EAX,DWORD PTR SS:[EBP+40E36A]
0037F8ED    50              PUSH EAX
0037F8FA    8B85 060F4100   MOV EAX,DWORD PTR SS:[EBP+410F06]        ; kernel32.GetModuleHandleA
0037F906   /E9 E7240000     JMP 00381DF2
0037F90B   |90              NOP
0037F90C   |85D2            TEST EDX,EDX
0037F90E   |0F89 73010000   JNS 0037FA87
0037F914   |837A 08 FF      CMP DWORD PTR DS:[EDX+8],-1
0037F918   |0F85 69010000   JNZ 0037FA87
0037F91E   |8B52 04         MOV EDX,DWORD PTR DS:[EDX+4]
0037F921   |C742 50 0010000>MOV DWORD PTR DS:[EDX+50],1000    ;ANTI dump
0037F928   |64:FF35 2000000>PUSH DWORD PTR FS:[20]
0037F92F   |58              POP EAX

……
0037FAB8    8B85 06124100   MOV EAX,DWORD PTR SS:[EBP+411206]        ; kernel32.VirtualProtect
0037FABE    90              NOP
……
0012FF80   0037FACA  /CALL to VirtualProtect
0012FF84   00400000  |Address = xxx.00400000
0012FF88   00001000  |Size = 1000 (4096.)
0012FF8C   00000004  |NewProtect = PAGE_READWRITE
0012FF90   0012FF94  \pOldProtect = 0012FF94
……
0037FACA    83C4 04         ADD ESP,4
0037FACD    0BC0            OR EAX,EAX
0037FACF    0F84 5E010000   JE 0037FC33                              ; 判断操作有没有成功,没有成功则跳
0037FAD5    8B95 120F4100   MOV EDX,DWORD PTR SS:[EBP+410F12]        ; mov EDX,400000
0037FADB    0352 3C         ADD EDX,DWORD PTR DS:[EDX+3C]            ; 定位pe部分
0037FADE    8B42 30         MOV EAX,DWORD PTR DS:[EDX+30]            ; BaseOfData(97000)入eax

……
0037FC2F    90              NOP
0037FC30    8942 2C         MOV DWORD PTR DS:[EDX+2C],EAX            ; BASEOFDATA放到40012c处
0037FC33    8DB5 94144100   LEA ESI,DWORD PTR SS:[EBP+411494]
0037FC39    8BFE            MOV EDI,ESI
0037FC3B    B9 4F000000     MOV ECX,4F
0037FC40    EB 05           JMP SHORT 0037FC47
0037FC42    AC              LODS BYTE PTR DS:[ESI]                   ; 这里还原出秘密消息:-)
0037FC43    2C 80           SUB AL,80
0037FC45    AA              STOS BYTE PTR ES:[EDI]
0037FC46    49              DEC ECX
0037FC47    0BC9            OR ECX,ECX
0037FC49  ^ 75 F7           JNZ SHORT 0037FC42
0037FC58   /EB 05           JMP SHORT 0037FC5F
0037FC5A   |AC              LODS BYTE PTR DS:[ESI]                   ; 显示完之后再擦除掉
0037FC5B   |04 80           ADD AL,80
0037FC5D   |AA              STOS BYTE PTR ES:[EDI]
0037FC5E   |49              DEC ECX
0037FC5F   \0BC9            OR ECX,ECX
0037FC61  ^ 75 F7           JNZ SHORT 0037FC5A
0037FC63    8B85 520F4100   MOV EAX,DWORD PTR SS:[EBP+410F52]
0037FC69    83F8 01         CMP EAX,1
0037FC6C    75 45           JNZ SHORT 0037FCB3                       ; 这里不是知道是什么标志来的,下面,下面只是一个SetTimer而已
0037FC6E    8D85 700D4100   LEA EAX,DWORD PTR SS:[EBP+410D70]
0037FC74    50              PUSH EAX                                 ; 382312
0037FC75    68 D0070000     PUSH 7D0
0037FC7A    68 14030000     PUSH 314
0037FC7F    6A 00           PUSH 0
0037FCA1    8B85 26104100   MOV EAX,DWORD PTR SS:[EBP+411026]        ; USER32.SetTimer
……
0012FF90   0037FCB3  /CALL to SetTimer
0012FF94   00000000  |hWnd = NULL
0012FF98   00000314  |TimerID = 314 (788.)
0012FF9C   000007D0  |Timeout = 2000. ms
0012FFA0   00382312  \Timerproc = 00382312
……
0037FCB3    83BD 720F4100 0>CMP DWORD PTR SS:[EBP+410F72],0          ; 这里又是什么值来的哦???
0037FCBA    74 2F           JE SHORT 0037FCEB
0037FCBC    8B8D 120F4100   MOV ECX,DWORD PTR SS:[EBP+410F12]        ; mov ecx,400000
0037FCC2    2B8D 360F4100   SUB ECX,DWORD PTR SS:[EBP+410F36]
0037FCC8    8DBD 991B4000   LEA EDI,DWORD PTR SS:[EBP+401B99]
0037FCCE    03BD 720F4100   ADD EDI,DWORD PTR SS:[EBP+410F72]         ; 这里相加后的值就是壳执行程序代码的开始地址,我的这个为00385E69
0037FCD4    8DB5 991B4000   LEA ESI,DWORD PTR SS:[EBP+401B99]
0037FCDA    03B5 760F4100   ADD ESI,DWORD PTR SS:[EBP+410F76]
0037FCE0    AD              LODS DWORD PTR DS:[ESI]
0037FCE1    EB 04           JMP SHORT 0037FCE7
0037FCE3    010C38          ADD DWORD PTR DS:[EAX+EDI],ECX
0037FCE6    AD              LODS DWORD PTR DS:[ESI]
0037FCE7    0BC0            OR EAX,EAX
0037FCE9  ^ 75 F8           JNZ SHORT 0037FCE3
0037FCEB    8B85 720F4100   MOV EAX,DWORD PTR SS:[EBP+410F72]
……
0037FCEB    8B85 720F4100   MOV EAX,DWORD PTR SS:[EBP+410F72]
0037FE40    0385 120F4100   ADD EAX,DWORD PTR SS:[EBP+410F12]        ; 换成VA 412d2e
0037FF95    894424 EC       MOV DWORD PTR SS:[ESP-14],EAX            ; xxx.00412D2E
0037FFC6    896C24 E8       MOV DWORD PTR SS:[ESP-18],EBP
0037FFF7    83A5 560F4100 0>AND DWORD PTR SS:[EBP+410F56],0
00380015    33C0            XOR EAX,EAX                              ; xxx.00412D2E
00380044    8DB5 991B4000   LEA ESI,DWORD PTR SS:[EBP+401B99]
00380061    B9 65F30000     MOV ECX,0F365
00380093    C1E9 02         SHR ECX,2
00380096    EB 08           JMP SHORT 003800A0
00380098    AD              LODS DWORD PTR DS:[ESI]
00380099    3185 560F4100   XOR DWORD PTR SS:[EBP+410F56],EAX        ; 计算最后的CR KEY=D3A1E72D

0038009F    49              DEC ECX
003800A0    0BC9            OR ECX,ECX
003800A2  ^ 75 F4           JNZ SHORT 00380098                       ;如果没有计算完则继续
003800D7    E8 48000000     CALL 00380124                            ; 这里进去一个int 3异常
003800DC    8B4C24 0C       MOV ECX,DWORD PTR SS:[ESP+C]
003800E0    FF81 B8000000   INC DWORD PTR DS:[ECX+B8]
003800E6    33C0            XOR EAX,EAX
003800E8    3341 04         XOR EAX,DWORD PTR DS:[ECX+4]
003800EB    0341 08         ADD EAX,DWORD PTR DS:[ECX+8]
003800EE    3341 0C         XOR EAX,DWORD PTR DS:[ECX+C]
003800F1    0341 10         ADD EAX,DWORD PTR DS:[ECX+10]
003800F4    0181 B0000000   ADD DWORD PTR DS:[ECX+B0],EAX
003800FA    60              PUSHAD
003800FB    8D71 04         LEA ESI,DWORD PTR DS:[ECX+4]
003800FE    8BA9 B4000000   MOV EBP,DWORD PTR DS:[ECX+B4]
00380104    8DBD 6D184100   LEA EDI,DWORD PTR SS:[EBP+41186D]
0038010A    81C7 08010000   ADD EDI,108
00380110    B9 06000000     MOV ECX,6
00380115    83BD 220F4100 0>CMP DWORD PTR SS:[EBP+410F22],0
0038011C    75 02           JNZ SHORT 00380120
0038011E    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00380120    61              POPAD
00380121    33C0            XOR EAX,EAX
00380123    C3              RETN
00380124    33C9            XOR ECX,ECX
00380126    64:FF31         PUSH DWORD PTR FS:[ECX]
00380129    64:8921         MOV DWORD PTR FS:[ECX],ESP
0038012C    CC              INT3
0038012D    90              NOP
0038012E    64:8F01         POP DWORD PTR FS:[ECX]
00380131    83C4 04         ADD ESP,4
00380134    8985 560F4100   MOV DWORD PTR SS:[EBP+410F56],EAX
0038013A    8B85 220F4100   MOV EAX,DWORD PTR SS:[EBP+410F22]
0038028F    0BC0            OR EAX,EAX
00380291    0F85 57040000   JNZ 003806EE
……
00380558    8DBD 8FF44000   LEA EDI,DWORD PTR SS:[EBP+40F48F]      
0038055E    B9 00000000     MOV ECX,0
00380563    AD              LODS DWORD PTR DS:[ESI]
00380564   /E9 71010000     JMP 003806DA
003806DA    0BC0            OR EAX,EAX
003806DC  ^ 0F85 87FEFFFF   JNZ 00380569                             ; 没处理完则继续
……
00380569    03C1            ADD EAX,ECX
0038056B    68 033C0101     PUSH 1013C03
00380570    8946 FC         MOV DWORD PTR DS:[ESI-4],EAX
00380573    68 2CBF3C57     PUSH 573CBF2C
00380578    25 FFFFFF7F     AND EAX,7FFFFFFF                         ; 去掉前面的80xxxx
0038057D    68 62A73AA1     PUSH A13AA762
00380582    8BC8            MOV ECX,EAX
00380584    68 6204EF04     PUSH 4EF0462
00380589    0385 120F4100   ADD EAX,DWORD PTR SS:[EBP+410F12]        ; 转换为VA401256
0038058F    52              PUSH EDX                                 ; xxx.00400100
现在又进堆栈里执行代码:
0012FF94    89FB            MOV EBX,EDI                              ; 把那个让代码放到ESP中的人给B了^_^
0012FF96    29C3            SUB EBX,EAX                              ; 清除存放表中的数据
0012FF98    8958 FC         MOV DWORD PTR DS:[EAX-4],EBX             ; 取esi+4的地址到[EBX]中
0012FF9B    66:C740 FA 90E8 MOV WORD PTR DS:[EAX-6],0E890            ; 把第一层的地址放到目标程序中
0012FFA1    C3              RETN

0038086A    03B5 120F4100   ADD ESI,DWORD PTR SS:[EBP+410F12]        ; 401000(开始地址)
00380870    8B8D 45174100   MOV ECX,DWORD PTR SS:[EBP+411745]        ; 198c(SIZE)
00380876    E8 5F050000     CALL 00380DDA                            ; 又进行CRC检测
0038087B    8985 2A0F4100   MOV DWORD PTR SS:[EBP+410F2A],EAX        ; 检测的值为2A954338(每次不一定相等)
00380881    8BC5            MOV EAX,EBP                              ; EBP=FFFF715A2
00380883    8DB5 6D184100   LEA ESI,DWORD PTR SS:[EBP+41186D]        ; 382E0F
00380889    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
0038088C    0146 08         ADD DWORD PTR DS:[ESI+8],EAX
0038088F    83C6 20         ADD ESI,20
00380892    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
00380895    83C6 20         ADD ESI,20
00380898    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
0038089B    0146 08         ADD DWORD PTR DS:[ESI+8],EAX
0038089E    83C6 20         ADD ESI,20
003808A1    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
003808A4    83C6 20         ADD ESI,20
003808A7    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
003808AA    83C6 20         ADD ESI,20
003808AD    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
003808B0    83C6 20         ADD ESI,20
003808B3    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
003808B6    83C6 20         ADD ESI,20
003808B9    0146 04         ADD DWORD PTR DS:[ESI+4],EAX
003808BC    8DB5 69184100   LEA ESI,DWORD PTR SS:[EBP+411869]
003808C2    0106            ADD DWORD PTR DS:[ESI],EAX
003808C4    8D85 8D194100   LEA EAX,DWORD PTR SS:[EBP+41198D]
……
00380A1A    64:FF35 0000000>PUSH DWORD PTR FS:[0]                    ; 又来int3异常了
00380A21    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00380A28    33C0            XOR EAX,EAX
00380A2A    8B00            MOV EAX,DWORD PTR DS:[EAX]
00380A2C    90              NOP
00380A2D    90              NOP
00380A2E    CC              INT3
到了这里后,还有几个异常,不过感觉没什么有价值的东西,再则,可能这段时间又要忙了,所以先写个上篇,有空再写下篇。现在我们可以直接在抽代码处下段就行了。
OEP代码的找回和文件的修复,如果有时间就尽快写,没时间我也没有办法了:-(.
在最后,我要特别感谢xxx(名字就不说了),如果没有他写的那篇文章的话,我的可能就没有信心跟这个壳,还有就是在壳的很多部分不懂的东西,也是从他那里学到的,真心感谢!!!

上篇完

Greetz:

Fly,Jingulong,yock,tDasm,David,ahao,vcasm,UFO(brother),alan(sister),heXpe,hexer, all of my friends and you!

                            By loveboom[DFCG][FCG]
                            Email:bmd2chen#tom.com