算不上脱文,只能是手记
到第一部分结束,我连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 不知道什么时候是个头~~
先去吃东西了~~
//下会继续看第二部分.
[课程]Linux pwn 探索篇!