算不上脱文,只能是手记   
到第一部分结束,我连THEMIDA的OEP都没见着,更别说把它给脱掉了。熬了一天,一点收获都没有~~~! 

突然觉得我是何等的菜,竟然连个THEMIDA都搞不定~~! 
现在把手记发出来,希望高人看了能指点一二。

//OD 载入:
005DB000 >  83EC 04         sub     esp, 4
005DB003    50              push    eax
005DB004    53              push    ebx
005DB005    E8 01000000     call    005DB00B
005DB00A    CC              int3
005DB00B    58              pop     eax
005DB00C    8BD8            mov     ebx, eax
005DB00E    40              inc     eax
005DB00F    2D 00C01800     sub     eax, 18C000
005DB014    2D 5BCD6000     sub     eax, 60CD5B
005DB019    05 50CD6000     add     eax, 60CD50
005DB01E    803B CC         cmp     byte ptr [ebx], 0CC
005DB021    75 19           jnz     short 005DB03C
005DB023    C603 00         mov     byte ptr [ebx], 0
005DB026    BB 00100000     mov     ebx, 1000
005DB02B    68 BEBDAF07     push    7AFBDBE
005DB030    68 2EDDB62E     push    2EB6DD2E
005DB035    53              push    ebx
005DB036    50              push    eax
005DB037    E8 0A000000     call    005DB046
005DB03C    83C0 14         add     eax, 14
005DB03F    894424 08       mov     dword ptr [esp+8], eax
005DB043    5B              pop     ebx
005DB044    58              pop     eax
005DB045    C3              retn

//一路F7到下面便知道是themida的壳:
004524C1    8BC5            mov     eax, ebp
004524C3    8BD4            mov     edx, esp
004524C5    60              pushad
004524C6    E8 00000000     call    004524CB
004524CB    5D              pop     ebp
004524CC    81ED B734FB09   sub     ebp, 9FB34B7
004524D2    8995 F92AFB09   mov     dword ptr [ebp+9FB2AF9], edx
004524D8    89B5 110CFB09   mov     dword ptr [ebp+9FB0C11], esi
004524DE    8985 F92FFB09   mov     dword ptr [ebp+9FB2FF9], eax
004524E4    83BD ED31FB09 0>cmp     dword ptr [ebp+9FB31ED], 0
004524EB    74 0C           je      short 004524F9
004524ED    8BE8            mov     ebp, eax
004524EF    8BE2            mov     esp, edx
004524F1    B8 01000000     mov     eax, 1
004524F6    C2 0C00         retn    0C
004524F9    8B4424 24       mov     eax, dword ptr [esp+24]
004524FD    8985 7518FB09   mov     dword ptr [ebp+9FB1875], eax
00452503    6A 45           push    45
00452505    E8 A3000000     call    004525AD
0045250A    68 9A748307     push    783749A
0045250F    E8 DF000000     call    004525F3
00452514    68 254B890A     push    0A894B25
00452519    E8 D5000000     call    004525F3
0045251E    E9 14020000     jmp     00452737

//从下面几个跳转到了N长的一段算法,themida关键代码之一:
00452B7D   /EB 04           jmp     short 00452B83
00452B7F   |0000            add     byte ptr [eax], al
00452B81   |0000            add     byte ptr [eax], al
00452B83   \E9 74060000     jmp     004531FC
00452B88    E9 08000000     jmp     <忽略1>
00452B8D    004F C4         add     byte ptr [edi-3C], cl
00452B90    FF24E9          jmp     dword ptr [ecx+ebp*8]


//我算被雷到了,全是JMP,上面一次下面一次,全是大跳转,这中方法真的是考验耐心 T_T
//N长啊~~~!,足足花了半个小时才依次下完断点,最后停在断点其中之一.

004AD079    0BC0            or      eax, eax
004AD07B  ^ 0F84 2ACEFEFF   je      00499EAB      ;这里的跳转不是最终的结束
004AD081    FF77 1C         push    dword ptr [edi+1C]
004AD084    68 9B380000     push    389B
004AD089    893424          mov     dword ptr [esp], esi

//继续查找断点~~~~~~~~过了N长时间,继续..
00499EA2    8B0424          mov     eax, dword ptr [esp]
00499EA5    81C4 04000000   add     esp, 4
00499EAB    68 436E0000     push    6E43      ;这里过到第5次出现异常,说明代码出了算法
00499EB0    893C24          mov     dword ptr [esp], edi
00499EB3    68 A32C0000     push    2CA3
00499EB8    E9 A6500000     jmp     0049EF63

//发现这里是掌控JMP算法关键点之一
0049E780    28C3            sub     bl, al
0049E782    80C3 B6         add     bl, 0B6
0049E785    80EB 50         sub     bl, 50
0049E788    0FB6C0          movzx   eax, al
0049E78B  ^ FF2487          jmp     dword ptr [edi+eax*4]            ; AION.0049E36F
0049E78E    61              popad
0049E78F    C3              retn

//N长时间后发现结束跳转地址:
0049A3B2    35 8E32914C     xor     eax, 4C91328E
0049A3B7    2D 4307170B     sub     eax, 0B170743
0049A3BC    01C3            add     ebx, eax
0049A3BE    58              pop     eax
0049A3BF    55              push    ebp
0049A3C0    52              push    edx
0049A3C1    BA B9222218     mov     edx, 182222B9
0049A3C6    81EA 947A133D   sub     edx, 3D137A94
0049A3CC    E9 1A060000     jmp     0049A9EB
0049A3D1    68 FE2F0000     push    2FFE
0049A3D6    890424          mov     dword ptr [esp], eax
0049A3D9    B0 0B           mov     al, 0B
0049A3DB    88C2            mov     dl, al
0049A3DD    E9 E51D0000     jmp     0049C1C7
0049A3E2    61              popad    ;这里结束
0049A3E3    9D              popfd
0049A3E4    C3              retn

//依次加载相关DLL文件

刚刚发现,它会一次按下的地址解开
004C311D    68 8F42020A     push    0A02428F
004C3122  ^ E9 AD52FDFF     jmp     004983D4
004C3127    68 7A43020A     push    0A02437A
004C312C  ^ E9 A352FDFF     jmp     004983D4
004C3131    68 3146020A     push    0A024631
004C3136  ^ E9 9952FDFF     jmp     004983D4
004C313B    68 FE48020A     push    0A0248FE
004C3140  ^ E9 8F52FDFF     jmp     004983D4
004C3145    68 D949020A     push    0A0249D9
004C314A  ^ E9 8552FDFF     jmp     004983D4
004C314F    68 224C020A     push    0A024C22
004C3154  ^ E9 7B52FDFF     jmp     004983D4
004C3159    68 E64C020A     push    0A024CE6
004C315E  ^ E9 7152FDFF     jmp     004983D4

//在内存发现了相关DLL
004C30AD  67 00 00 00 C4 82 5A 48 55 53 45 52 33 32 2E 64  g...ZHUSER32.d
004C30BD  6C 6C 00 41 44 56 41 50 49 33 32 2E 64 6C 6C 00  ll.ADVAPI32.dll.
004C30CD  4E 54 44 4C 4C 2E 64 6C 6C 00 00 00 00 00 00 00  NTDLL.dll.......

//找到了出口,只需要按F9 ^_^,不用在为那大段算法代码头疼
//估计下面这一段是解开IAT表的,没仔细看,只是每调用一个DLL就执行这个,推测的.
00452DBE    83BD 6B3BFB09 0>cmp     dword ptr [ebp+9FB3B6B], 0
00452DC5    75 10           jnz     short 00452DD7
00452DC7    C74424 1C 00000>mov     dword ptr [esp+1C], 0
00452DCF    8DB5 D43FFB09   lea     esi, dword ptr [ebp+9FB3FD4]
00452DD5    FFE6            jmp     esi
00452DD7    56              push    esi
00452DD8    AD              lods    dword ptr [esi]
00452DD9    034424 28       add     eax, dword ptr [esp+28]
00452DDD    97              xchg    eax, edi
00452DDE    8BDF            mov     ebx, edi
00452DE0    8A85 3919FB09   mov     al, byte ptr [ebp+9FB1939]
00452DE6    84C0            test    al, al
00452DE8    74 04           je      short 00452DEE
00452DEA    3A07            cmp     al, byte ptr [edi]
00452DEC    75 4C           jnz     short 00452E3A
00452DEE    57              push    edi
00452DEF    32C0            xor     al, al
00452DF1    AE              scas    byte ptr es:[edi]
00452DF2  ^ 75 FD           jnz     short 00452DF1
00452DF4    5E              pop     esi
00452DF5    2BFB            sub     edi, ebx
00452DF7    52              push    edx
00452DF8    FC              cld
00452DF9    33C9            xor     ecx, ecx
00452DFB    49              dec     ecx
00452DFC    8BD1            mov     edx, ecx
00452DFE    33C0            xor     eax, eax
00452E00    33DB            xor     ebx, ebx
00452E02    AC              lods    byte ptr [esi]
00452E03    32C1            xor     al, cl
00452E05    8ACD            mov     cl, ch
00452E07    8AEA            mov     ch, dl
00452E09    8AD6            mov     dl, dh
00452E0B    B6 08           mov     dh, 8
00452E0D    66:D1EB         shr     bx, 1
00452E10    66:D1D8         rcr     ax, 1
00452E13    73 09           jnb     short 00452E1E
00452E15    66:35 4150      xor     ax, 5041
00452E19    66:81F3 4954    xor     bx, 5449
00452E1E    FECE            dec     dh
00452E20  ^ 75 EB           jnz     short 00452E0D
00452E22    33C8            xor     ecx, eax
00452E24    33D3            xor     edx, ebx
00452E26    4F              dec     edi
00452E27  ^ 75 D5           jnz     short 00452DFE
00452E29    F7D2            not     edx
00452E2B    F7D1            not     ecx
00452E2D    8BC2            mov     eax, edx
00452E2F    C1C0 10         rol     eax, 10
00452E32    66:8BC1         mov     ax, cx
00452E35    5A              pop     edx
00452E36    3BD0            cmp     edx, eax
00452E38    74 0F           je      short 00452E49
00452E3A    5E              pop     esi
00452E3B    83C6 04         add     esi, 4
00452E3E    FF85 B52CFB09   inc     dword ptr [ebp+9FB2CB5]
00452E44  ^ E9 6FFFFFFF     jmp     00452DB8

//上面的JMP依次调用结束后来到CALL
004C43BE    E8 0B000000     call    004C43CE
004C43C3    C9              leave
004C43C4  ^ 75 9E           jnz     short 004C4364
004C43C6    D020            shl     byte ptr [eax], 1
004C43C8    6E              outs    dx, byte ptr es:[edi]
004C43C9    A0 6E205C47     mov     al, byte ptr [475C206E]
004C43CE    5E              pop     esi
004C43CF    81C6 AA700000   add     esi, 70AA
004C43D5    66:BF 1F43      mov     di, 431F
004C43D9    33DB            xor     ebx, ebx
004C43DB    E9 08000000     jmp     004C43E8

//这里的代码有必要贴出来,因为它好象特征点.
004C5506    C685 3919FB09 5>mov     byte ptr [ebp+9FB1939], 52
004C550D    68 077BE4AD     push    ADE47B07
004C5512    FFB5 6529FB09   push    dword ptr [ebp+9FB2965]
004C5518    FF95 CD26FB09   call    dword ptr [ebp+9FB26CD]
004C551E    8985 695E020A   mov     dword ptr [ebp+A025E69], eax
004C5524    C685 3919FB09 5>mov     byte ptr [ebp+9FB1939], 52
004C552B    68 E5002E90     push    902E00E5
004C5530    FFB5 6529FB09   push    dword ptr [ebp+9FB2965]
004C5536    FF95 CD26FB09   call    dword ptr [ebp+9FB26CD]          ; AION.00452B95
004C553C    8985 655E020A   mov     dword ptr [ebp+A025E65], eax
004C5542    C685 3919FB09 5>mov     byte ptr [ebp+9FB1939], 52
004C5549    68 3512BFB9     push    B9BF1235
004C554E    FFB5 6529FB09   push    dword ptr [ebp+9FB2965]
004C5554    FF95 CD26FB09   call    dword ptr [ebp+9FB26CD]
004C555A    8985 2109FB09   mov     dword ptr [ebp+9FB0921], eax
004C5560    C685 3919FB09 5>mov     byte ptr [ebp+9FB1939], 52
004C5567    68 34107898     push    98781034
004C556C    FFB5 6529FB09   push    dword ptr [ebp+9FB2965]
004C5572    FF95 CD26FB09   call    dword ptr [ebp+9FB26CD]
004C5578    8985 5D1FFB09   mov     dword ptr [ebp+9FB1F5D], eax
004C557E    C685 3919FB09 5>mov     byte ptr [ebp+9FB1939], 52
004C5585    68 D4DB05C0     push    C005DBD4
004C558A    FFB5 6529FB09   push    dword ptr [ebp+9FB2965]
004C5590    FF95 CD26FB09   call    dword ptr [ebp+9FB26CD]

//中间忽略几处,忘记把它记录下来了,这个大家注意一下就会发现,就是VM再VM
//OD里碰到异常
004CE194    33C0            xor     eax, eax
004CE196    8B8D D92FFB09   mov     ecx, dword ptr [ebp+9FB2FD9]  ;断点如果不断在这里CALL里代码无

法解开
004CE19C    40              inc     eax
004CE19D    0F3F            ???                                      ; 未知命令
004CE19F    07              pop     es
004CE1A0    0B648F 05       or      esp, dword ptr [edi+ecx*4+5]
004CE1A4    0000            add     byte ptr [eax], al
004CE1A6    0000            add     byte ptr [eax], al
004CE1A8    83C4 04         add     esp, 4
004CE1AB    E8 09000000     call    004CE1B9

//SHTFT+F9忽略,不然程序会终止:
004CE1B9    098D 3D34FB09   or      dword ptr [ebp+9FB343D], ecx //断点
004CE1BF    59              pop     ecx
004CE1C0    66:BF 1311      mov     di, 1113
004CE1C4    83FB FF         cmp     ebx, -1
004CE1C7    0F84 1E000000   je      004CE1EB
004CE1CD    0FBFD1          movsx   edx, cx
004CE1D0    C785 D11DFB09 0>mov     dword ptr [ebp+9FB1DD1], 1
004CE1DA    8BBD 3D23FB09   mov     edi, dword ptr [ebp+9FB233D]
004CE1E0    E9 1A010000     jmp     004CE2FF
004CE1E5    89BD 4934FB09   mov     dword ptr [ebp+9FB3449], edi
004CE1EB    E9 7F000000     jmp     004CE26F
004CE1F0    0F8C 06000000   jl      004CE1FC
004CE1F6    8B95 7D34FB09   mov     edx, dword ptr [ebp+9FB347D]
004CE1FC    8B4C24 0C       mov     ecx, dword ptr [esp+C]
004CE200    C781 A4000000 F>mov     dword ptr [ecx+A4], -1
004CE20A    8381 B8000000 0>add     dword ptr [ecx+B8], 4
004CE211    33C0            xor     eax, eax
004CE213    C3              retn

//OD下面的异常再次结束程序:
004CE2B5    B9 0A000000     mov     ecx, 0A
004CE2BA    B8 04D75548     mov     eax, 4855D704
004CE2BF    05 6481F70D     add     eax, 0DF78164
004CE2C4    BB 65D48586     mov     ebx, 8685D465
004CE2C9    BA 40B63400     mov     edx, 34B640
004CE2CE    81EA E85F3400   sub     edx, 345FE8
004CE2D4    ED              in      eax, dx    ;异常在这里
004CE2D5    81FB 68584D56   cmp     ebx, 564D5868

//这段代码感觉比较有意思
004CEA5B   /E9 0C000000     jmp     004CEA6C
004CEA60   |1029            adc     byte ptr [ecx], ch
004CEA62   |6A 68           push    68
004CEA64   |B4 A9           mov     ah, 0A9
004CEA66   |77 57           ja      short 004CEABF
004CEA68   |B0 D7           mov     al, 0D7
004CEA6A   |41              inc     ecx
004CEA6B   |48              dec     eax
004CEA6C   \81EE 52915C18   sub     esi, 185C9152
004CEA72    81F6 B15E7F57   xor     esi, 577F5EB1
004CEA78    66:8BD3         mov     dx, bx
004CEA7B    81C6 10BC0153   add     esi, 5301BC10
004CEA81    56              push    esi
004CEA82    E8 0B000000     call    004CEA92
004CEA87    9B              wait
004CEA88    6C              ins     byte ptr es:[edi], dx
004CEA89    AE              scas    byte ptr es:[edi]
004CEA8A    1323            adc     esp, dword ptr [ebx]
004CEA8C    98              cwde
004CEA8D    881E            mov     byte ptr [esi], bl
004CEA8F    BF 6610BA97     mov     edi, 97BA1066
004CEA94    AD              lods    dword ptr [esi]
004CEA95    90              nop
004CEA96    47              inc     edi
004CEA97    5F              pop     edi
004CEA98    8F0403          pop     dword ptr [ebx+eax]
004CEA9B    E9 06000000     jmp     004CEAA6
004CEAA0  ^ 7D B9           jge     short 004CEA5B
004CEAA2  ^ 74 D0           je      short 004CEA74
004CEAA4    A6              cmps    byte ptr [esi], byte ptr es:[edi>
004CEAA5    BA E9060000     mov     edx, 6E9
004CEAAA    008416 BEFF7E4F add     byte ptr [esi+edx+4F7EFFBE], al
004CEAB1    83E8 03         sub     eax, 3
004CEAB4    BF 8EDAAB1A     mov     edi, 1AABDA8E
004CEAB9    48              dec     eax
004CEABA    80C5 ED         add     ch, 0ED
004CEABD    81F8 D493FFFF   cmp     eax, FFFF93D4
004CEAC3    0F85 17000000   jnz     004CEAE0
004CEAC9    60              pushad    //F4到这里就跳出循环
004CEACA    80E7 FC         and     bh, 0FC  //下面代码解开
004CEACD    61              popad
004CEACE    E9 23000000     jmp     004CEAF6

//再次贴出这样反感的代码:
004D0E30  ^\E9 E81DFBFF     jmp     00482C1D
004D0E35    68 7826030A     push    0A032678
004D0E3A  ^ E9 DE1DFBFF     jmp     00482C1D
004D0E3F    68 6128030A     push    0A032861
004D0E44  ^ E9 D41DFBFF     jmp     00482C1D
004D0E49    68 C029030A     push    0A0329C0
004D0E4E  ^ E9 CA1DFBFF     jmp     00482C1D
004D0E53    68 CE2C030A     push    0A032CCE
004D0E58  ^ E9 C01DFBFF     jmp     00482C1D
004D0E5D    68 5D2E030A     push    0A032E5D
004D0E62  ^ E9 B61DFBFF     jmp     00482C1D
004D0E67    68 D92F030A     push    0A032FD9
004D0E6C  ^ E9 AC1DFBFF     jmp     00482C1D
004D0E71    68 AB31030A     push    0A0331AB
004D0E76  ^ E9 A21DFBFF     jmp     00482C1D
004D0E7B    68 6233030A     push    0A033362
004D0E80  ^ E9 981DFBFF     jmp     00482C1D
004D0E85    68 0E3D030A     push    0A033D0E
004D0E8A  ^ E9 8E1DFBFF     jmp     00482C1D
004D0E8F    68 003E030A     push    0A033E00
004D0E94  ^ E9 841DFBFF     jmp     00482C1D
004D0E99    68 9940030A     push    0A034099
004D0E9E  ^ E9 7A1DFBFF     jmp     00482C1D
004D0EA3    68 D548030A     push    0A0348D5
004D0EA8  ^ E9 701DFBFF     jmp     00482C1D
004D0EAD    68 0252030A     push    0A035202
004D0EB2  ^ E9 661DFBFF     jmp     00482C1D
004D0EB7    68 605B030A     push    0A035B60
004D0EBC  ^ E9 5C1DFBFF     jmp     00482C1D
004D0EC1    68 DA5E030A     push    0A035EDA
004D0EC6  ^ E9 521DFBFF     jmp     00482C1D
004D0ECB    68 815F030A     push    0A035F81
004D0ED0  ^ E9 481DFBFF     jmp     00482C1D
004D0ED5    68 2860030A     push    0A036028
004D0EDA  ^ E9 3E1DFBFF     jmp     00482C1D
004D0EDF    68 B860030A     push    0A0360B8
004D0EE4  ^ E9 341DFBFF     jmp     00482C1D
004D0EE9    68 5E64030A     push    0A03645E
004D0EEE  ^ E9 2A1DFBFF     jmp     00482C1D
004D0EF3    68 B866030A     push    0A0366B8
004D0EF8  ^ E9 201DFBFF     jmp     00482C1D
004D0EFD    68 616A030A     push    0A036A61
004D0F02  ^ E9 161DFBFF     jmp     00482C1D
004D0F07    68 AF6E030A     push    0A036EAF
004D0F0C  ^ E9 0C1DFBFF     jmp     00482C1D
004D0F11    68 3271030A     push    0A037132
004D0F16  ^ E9 021DFBFF     jmp     00482C1D
004D0F1B    68 2F73030A     push    0A03732F
004D0F20  ^ E9 F81CFBFF     jmp     00482C1D
004D0F25    68 1E7E030A     push    0A037E1E
004D0F2A  ^ E9 EE1CFBFF     jmp     00482C1D  //不用管F2断在这里

//不贴了下面又来了~~~!和上面一样的解密调用.

//需要注意的函数,就是分配地址空间:
7C809AE1 >  8BFF            mov     edi, edi
7C809AE3    55              push    ebp
7C809AE4    8BEC            mov     ebp, esp
7C809AE6    FF75 14         push    dword ptr [ebp+14]
7C809AE9    FF75 10         push    dword ptr [ebp+10]
7C809AEC    FF75 0C         push    dword ptr [ebp+C]
7C809AEF    FF75 08         push    dword ptr [ebp+8]
7C809AF2    6A FF           push    -1
7C809AF4    E8 09000000     call    VirtualAllocEx  ;下次直接下段点在这里省了不少
7C809AF9    5D              pop     ebp
7C809AFA    C2 1000         retn    10

//中间忽略了足足两个小时的跟踪,其中这里面主要为VM和两大段代码组成
第一部分就是那长长的算法代码,第二部分就是我说的与IAT有关的那段代码,调用的次数会很平常
可能与IAT表没关系了.

//从下面三段过后开始进入文件头校验:
004DF2B9    33DC            xor     ebx, esp
004DF2BB    7B E0           jpo     short 004DF29D
004DF2BD    BA 89B746BA     mov     edx, BA46B789
004DF2C2    D85F 82         fcomp   dword ptr [edi-7E]
004DF2C5    E3 1B           jecxz   short 004DF2E2
004DF2C7    06              push    es
004DF2C8    D8F6            fdiv    st, st(6)
004DF2CA    FC              cld
004DF2CB    5B              pop     ebx
004DF2CC    29FE            sub     esi, edi
004DF2CE    FC              cld
004DF2CF    5B              pop     ebx
004DF2D0    40              inc     eax
004DF2D1    BA D85F6BEB     mov     edx, EB6B5FD8
004DF2D6    1B2D 9C373171   sbb     ebp, dword ptr [7131379C]

004E6C64    B8 C37B040A     mov     eax, 0A047BC3
004E6C69    03C5            add     eax, ebp
004E6C6B    FFE0            jmp     eax

004E6EBA    81EA E960B161   sub     edx, 61B160E9
004E6EC0    8BB5 911BFB09   mov     esi, dword ptr [ebp+9FB1B91]
004E6EC6    8BC1            mov     eax, ecx
004E6EC8    E9 07000000     jmp     004E6ED4

//终于接上了,因为这里可以直接下内存断点获得,但是,这样的方法通常不是一直管用.
//下面是校验PE头:
//从代码段末一直向代码段首检测,检测差值是1000:
004FA599    66:8138 4D5A    cmp     word ptr [eax], 5A4D   //检测是否是DOS头
004FA59E    0F85 12000000   jnz     004FA5B6
004FA5A4    0FB750 3C       movzx   edx, word ptr [eax+3C] //在偏移3C处是否PE头
004FA5A8    03D0            add     edx, eax
004FA5AA    813A 50450000   cmp     dword ptr [edx], 4550
004FA5B0    0F84 0A000000   je      004FA5C0
004FA5B6    2D 00100000     sub     eax, 1000 //不是就再减1000
004FA5BB  ^ E9 D9FFFFFF     jmp     004FA599
004FA5C0    8BC8            mov     ecx, eax
004FA5C2    8985 E912FB09   mov     dword ptr [ebp+9FB12E9], eax     ; 保存基地址
004FA5C8    0340 3C         add     eax, dword ptr [eax+3C]
004FA5CB    0FB750 06       movzx   edx, word ptr [eax+6]            ; 区段数
004FA5CF    8995 CD12FB09   mov     dword ptr [ebp+9FB12CD], edx
004FA5D5    8B50 50         mov     edx, dword ptr [eax+50]
004FA5D8    8995 D915FB09   mov     dword ptr [ebp+9FB15D9], edx     ; 镜像大小
004FA5DE    05 F8000000     add     eax, 0F8
004FA5E3    8B50 0C         mov     edx, dword ptr [eax+C]           ; 代码段VOFFSET
004FA5E6    03D1            add     edx, ecx
004FA5E8    8995 F109FB09   mov     dword ptr [ebp+9FB09F1], edx     ; 代码段内存地址
004FA5EE    0350 08         add     edx, dword ptr [eax+8]
004FA5F1    8995 CD06FB09   mov     dword ptr [ebp+9FB06CD], edx     ; 代码段内存大小
004FA5F7    64:8F05 0000000>pop     dword ptr fs:[0]                 ; 0012FF9C
004FA5FE    83C4 04         add     esp, 4

//F8跟到下面
004FA6AC    09BA B5890226   or      dword ptr [edx+260289B5], edi
004FA6B2    C785 292EFB09 0>mov     dword ptr [ebp+9FB2E29], 0
004FA6BC    8995 E131FB09   mov     dword ptr [ebp+9FB31E1], edx
004FA6C2    57              push    edi
004FA6C3    8BC3            mov     eax, ebx
004FA6C5    5E              pop     esi
004FA6C6    FFB5 F91FFB09   push    dword ptr [ebp+9FB1FF9]
004FA6CC    B8 A69D4A05     mov     eax, 54A9DA6
004FA6D1    FF95 4D20FB09   call    dword ptr [ebp+9FB204D]      ;调用SetEvent设置事件
004FA6D7    8BBD FD25FB09   mov     edi, dword ptr [ebp+9FB25FD]
004FA6DD    6A 00           push    0
004FA6DF    FF95 4D1DFB09   call    dword ptr [ebp+9FB1D4D]    ;等待事件结束
004FA6E5    8BC0            mov     eax, eax        ;JMP下面的代码被解开
004FA6E7    EB 78           jmp     short 004FA761
004FA6E9    0362 2D         add     esp, dword ptr [edx+2D]
004FA6EC    ED              in      eax, dx
004FA6ED    68 D1038ABE     push    BE8A03D1
004FA6F2    8B9D E75EFB09   mov     ebx, dword ptr [ebp+9FB5EE7]
004FA6F8    6E              outs    dx, byte ptr es:[edi]
004FA6F9    EF              out     dx, eax
004FA6FA    C41F            les     ebx, fword ptr [edi]
004FA6FC    8AB2 0FCE787E   mov     dh, byte ptr [edx+7E78CE0F]


//再次进入N长的由JMP构成的算法中.在代码段下内存断点,实在没心思跟了~~!
//不跟不行了,F9后代码自动结束~~!估计是检测到调试

//等待结束~~~T_T:
004EA9E1   \7B EB           jpo     short 004EA9CE
004EA9E3    F2:             prefix repne:
004EA9E4    FFB5 1106FB09   push    dword ptr [ebp+9FB0611]
004EA9EA    8985 DD26FB09   mov     dword ptr [ebp+9FB26DD], eax
004EA9F0    FF95 6517FB09   call    dword ptr [ebp+9FB1765]          ; kernel32.WaitForSingleObject

//抓出点代码来:
00503155    C785 B440060A 3>mov     dword ptr [ebp+A0640B4], 1013F
0050315F    8D8D E641060A   lea     ecx, dword ptr [ebp+A0641E6]
00503165    898D 6530FB09   mov     dword ptr [ebp+9FB3065], ecx
0050316B    8BB5 9117FB09   mov     esi, dword ptr [ebp+9FB1791]
00503171    C785 2527FB09 5>mov     dword ptr [ebp+9FB2725], 6558

//后面普遍是
SetEvent和Sleep,不小心就会挂掉 T_T.需要说明的是不要下内存断点,不然会挂掉.

//一段段像下面的解密代码调用,看这就头疼,这段开始要注意的是,必要的时候手动跟一下,不然会挂掉:
//在这期间会有查找进程的举动.
00509313    68 D4AC060A     push    0A06ACD4
00509318  ^ E9 FD47FAFF     jmp     004ADB1A
0050931D    68 73B0060A     push    0A06B073
00509322  ^ E9 F347FAFF     jmp     004ADB1A
00509327    68 8FB3060A     push    0A06B38F
0050932C  ^ E9 E947FAFF     jmp     004ADB1A

//下面是比较驱动
0050E9BE    68 F7FC060A     push    0A06FCF7
0050E9C3  ^ E9 0C9AF8FF     jmp     004983D4
0050E9C8    68 F9FF060A     push    0A06FFF9
0050E9CD  ^ E9 029AF8FF     jmp     004983D4
0050E9D2    68 8002070A     push    0A070280
0050E9D7  ^ E9 F899F8FF     jmp     004983D4
0050E9DC    68 0804070A     push    0A070408
0050E9E1  ^ E9 EE99F8FF     jmp     004983D4
0050E9E6    68 8F05070A     push    0A07058F
0050E9EB  ^ E9 E499F8FF     jmp     004983D4
0050E9F0    68 5707070A     push    0A070757
0050E9F5  ^ E9 DA99F8FF     jmp     004983D4
0050E9FA    68 E908070A     push    0A0708E9
0050E9FF  ^ E9 D099F8FF     jmp     004983D4  ;
0050EA04    68 3D0B070A     push    0A070B3D
0050EA09  ^ E9 C699F8FF     jmp     004983D4  ; 程序会被终止
0050EA0E    68 A90C070A     push    0A070CA9
0050EA13  ^ E9 BC99F8FF     jmp     004983D4  ; 程序会被终止
0050EA18    68 2C12070A     push    0A07122C
0050EA1D  ^ E9 B299F8FF     jmp     004983D4
0050EA22    68 5D14070A     push    0A07145D
0050EA27  ^ E9 A899F8FF     jmp     004983D4


//估计是比较驱动,文件基本上全是在RING0权限的驱动文件
004DD691    882E            mov     byte ptr [esi], ch
004DD693    E0 52           loopdne short 004DD6E7
004DD695    0985 2D00FB09   or      dword ptr [ebp+9FB002D], eax
004DD69B    5A              pop     edx
004DD69C    8038 5C         cmp     byte ptr [eax], 5C
004DD69F    0F84 0B000000   je      004DD6B0
004DD6A5    8BF8            mov     edi, eax
004DD6A7    8038 2F         cmp     byte ptr [eax], 2F
004DD6AA  ^ 0F85 8FFFFFFF   jnz     004DD63F
004DD6B0    40              inc     eax
004DD6B1    0F80 00000000   jo      004DD6B7
004DD6B7    8B95 0534FB09   mov     edx, dword ptr [ebp+9FB3405]
004DD6BD    83BD F6D7030A 0>cmp     dword ptr [ebp+A03D7F6], 0
004DD6C4    0F84 A2010000   je      004DD86C

//读取
004DD8EE    90              nop
004DD8EF    B2 02           mov     dl, 2
004DD8F1    FF95 02D8030A   call    dword ptr [ebp+A03D802]          ; kernel32.IsBadReadPtr

//比较:
004DDA21    030A            add     ecx, dword ptr [edx]
004DDA23    899D 8932FB09   mov     dword ptr [ebp+9FB3289], ebx
004DDA29    FF95 E6D7030A   call    dword ptr [ebp+A03D7E6]          ; kernel32.lstrcmpiA


//下面是依次调用过的文件:
ntoskrnl.exe
hal.dll
kdcom.dll
bootvid.dll
acpi.dll
wmilib.sys
pci.sys
isapnp.sys
compbatt.sys
battc.sys
intelide.sys
pciidex.sys
pcmcia.sys
mountmgr.sys
ftdisk.sys
acpies.sys
......不举了蛮多地~~


//在这个比较字符串的地方发现了个很有趣的东西
7C80BB3A    56              push    esi
7C80BB3B    6A FF           push    -1
7C80BB3D    53              push    ebx
7C80BB3E    6A FF           push    -1
7C80BB40    FF75 08         push    dword ptr [ebp+8]
7C80BB43    BE 01000040     mov     esi, 40000001
7C80BB48    56              push    esi
7C80BB49    E8 57E9FFFF     call    GetThreadLocale
7C80BB4E    50              push    eax
7C80BB4F    E8 B3150000     call    CompareStringA

//堆栈中是这么样子的.原来比较驱动是在找些不太寻常的东西啊~~!
0012FF20   00000804  |LocaleId = 804
0012FF24   40000001  |CmpOptions = NORM_IGNORECASE|40000000
0012FF28   0050E996  |String1 = "HanOlly.sys"
0012FF2C   FFFFFFFF  |Count1 = FFFFFFFF (-1.)
0012FF30   02348D16  |String2 = "ntdll.dll"
0012FF34   FFFFFFFF  \Count2 = FFFFFFFF (-1.)

//查找的驱动为:
ntice.sys
iceext.sys
syser.sys
hanolly.sys

//也就是每次都会去比较设定好的非法程序,每次都会获取一次系统信息,这里用到的函数是
NT内核的一个函数,不知道在kernel里有没有给我们提供,如果没有就算了.^_^又于前段时间
整理ntdll.dll的函数,好象记得~~!

//再次到这里等待~~!最怕这样的,一不小心就挂掉了.
005111C0    26:3A62 7E      cmp     ah, byte ptr es:[edx+7E]
005111C4    B4 17           mov     ah, 17
005111C6    5F              pop     edi
005111C7    0FB7DA          movzx   ebx, dx
005111CA    6A 00           push    0
005111CC    FF95 4D1DFB09   call    dword ptr [ebp+9FB1D4D]
005111D2    8BC0            mov     eax, eax
005111D4  ^ EB F4           jmp     short 005111CA

//这里会终止进程;
00456C24    83BD 1C4FFB09 0>cmp     dword ptr [ebp+9FB4F1C], 0  ;修改内存中5为0
00456C2B    0F84 3E000000   je      00456C6F
00456C31    60              pushad
00456C32    0F87 06000000   ja      00456C3E
00456C38    8B95 D927FB09   mov     edx, dword ptr [ebp+9FB27D9]
00456C3E    8B85 F907FB09   mov     eax, dword ptr [ebp+9FB07F9]
00456C44    61              popad
00456C45    FFB5 8D05FB09   push    dword ptr [ebp+9FB058D]
00456C4B    E8 11000000     call    00456C61
00456C50    6F              outs    dx, dword ptr es:[edi]
00456C51    55              push    ebp
00456C52    A8 80           test    al, 80
00456C54    6D              ins     dword ptr es:[edi], dx
00456C55    EC              in      al, dx
00456C56    EA 8C824456 65F>jmp     far FF65:5644828C
00456C5D    DF85 4AE9F55B   fild    word ptr [ebp+5BF5E94A]
00456C63    FF95 590AFB09   call    dword ptr [ebp+9FB0A59]          ; 终止进程


//再一次解密出解密索引:
005115D8    68 AA2F070A     push    0A072FAA
005115DD  ^ E9 F26DF8FF     jmp     004983D4
005115E2    68 DD32070A     push    0A0732DD
005115E7  ^ E9 E86DF8FF     jmp     004983D4
005115EC    68 A333070A     push    0A0733A3
005115F1  ^ E9 DE6DF8FF     jmp     004983D4  ;终止程序
005115F6    68 FE3C070A     push    0A073CFE
005115FB  ^ E9 D46DF8FF     jmp     004983D4
00511600    68 713F070A     push    0A073F71
00511605  ^ E9 CA6DF8FF     jmp     004983D4

//又一次解密出了索引,但是程序出错了~~!
0051566A   /E9 06110000     jmp     00516775
0051566F   |68 EC69070A     push    0A0769EC
00515674  ^|E9 A184F9FF     jmp     004ADB1A
00515679   |68 506C070A     push    0A076C50
0051567E  ^|E9 9784F9FF     jmp     004ADB1A
00515683   |68 976E070A     push    0A076E97
00515688  ^|E9 8D84F9FF     jmp     004ADB1A
0051568D   |68 996F070A     push    0A076F99
00515692  ^|E9 8384F9FF     jmp     004ADB1A
00515697   |68 8F72070A     push    0A07728F
0051569C  ^|E9 7984F9FF     jmp     004ADB1A
005156A1   |68 AE74070A     push    0A0774AE
005156A6  ^|E9 6F84F9FF     jmp     004ADB1A

//目前还连OEP都没到~~~ T_T 不知道什么时候是个头~~
先去吃东西了~~

//下会继续看第二部分.