一个小程序,学习学习
!- 目标为Armadillo保护
!- 保护系统级别为 (专业版)
!- <所用到的保护模式有>
屏蔽调试器
使用输入表乱序模式
使用策略代码拼接模式
使用 Nanomites 处理模式
!- <备份密钥设置>
固定的备份密钥
!- <目标程序压缩设置>
较好 / 较慢 的压缩方式
!- <其它保护设置>
47BB6D80 Version 5.42 20-02-2008
!- 共使用的时间 00h 00m 01s 688ms
OD载入,隐藏OD
00993000 > 60 pushad <==打开程序直接停在这.
00993001 E8 00000000 call 00993006
00993006 5D pop ebp
00993007 50 push eax
00993008 51 push ecx
00993009 0FCA bswap edx
0099300B F7D2 not edx
0099300D 9C pushfd
0099300E F7D2 not edx
00993010 0FCA bswap edx
00993012 EB 0F jmp short 00993023
下断点:bp OpenMutexA,F9运行,
7C80EA1B > 8BFF mov edi, edi <==断在这里
7C80EA1D 55 push ebp
7C80EA1E 8BEC mov ebp, esp
7C80EA20 51 push ecx
7C80EA21 51 push ecx
7C80EA22 837D 10 00 cmp dword ptr [ebp+10], 0
7C80EA26 56 push esi
7C80EA27 0F84 66530300 je 7C843D93
看下椎栈
0012F6F8 0096853A /CALL 到 OpenMutexA 来自 FlyWoool.00968534
0012F6FC 001F0001 |Access = 1F0001
0012F700 00000000 |Inheritable = FALSE
0012F704 0012FD54 \MutexName = "9D0::DA28095786" <==看到0012FD54,记住.
0012F708 7EDAC47D
Ctrl+G 到00401000处,汇编以下代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 7CFD1200 push 12FD54 == 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B4B2A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 E9 33F7A577 jmp kernel32.OpenMutexA
00401000新建EIP,F9执行.停在kernel32.OpenMutexA中断,
取消断点,取消00401000处修改.
避开IAT加密
下断点:he GetModuleHandleA, 55次F9后出现异常.按确定后shift+F9.看堆栈
00129440 01286655 /CALL 到 GetModuleHandleA 来自 0128664F
00129444 012B2BA8 \pModule = "kernel32.dll"
00129448 012B3B54 ASCII "VirtualAlloc" <==注意这个
0012944C 4C73F890
00129440 01286673 /CALL 到 GetModuleHandleA 来自 0128666D
00129444 012B2BA8 \pModule = "kernel32.dll"
00129448 012B3B48 ASCII "VirtualFree" <==注意这个
0012944C 4C73F890
0012918C 01268CD7 /CALL 到 GetModuleHandleA 来自 01268CD1
00129190 00129308 \pModule = "kernel32.dll" <===可以取消断点,Alt+F9返回了
00129194 00000000
01268CD7 8B55 F4 mov edx, dword ptr [ebp-C] <==返回到这里
01268CDA 8B0D 84FF2B01 mov ecx, dword ptr [12BFF84]
01268CE0 890491 mov dword ptr [ecx+edx*4], eax
01268CE3 8B55 F4 mov edx, dword ptr [ebp-C]
01268CE6 A1 84FF2B01 mov eax, dword ptr [12BFF84]
01268CEB 833C90 00 cmp dword ptr [eax+edx*4], 0
01268CEF 75 5F jnz short 01268D50
01268CF1 8B4D F8 mov ecx, dword ptr [ebp-8]
01268CF4 8B51 08 mov edx, dword ptr [ecx+8]
01268CF7 83E2 02 and edx, 2
01268CFA 74 3B je short 01268D37
01268CFC B8 1C000000 mov eax, 1C
01268D01 C1E0 02 shl eax, 2
01268D04 8B0D 04DB2B01 mov ecx, dword ptr [12BDB04] ; FlyWoool.009A3390
01268D0A 8B15 04DB2B01 mov edx, dword ptr [12BDB04] ; FlyWoool.009A3390
01268D10 8B35 04DB2B01 mov esi, dword ptr [12BDB04] ; FlyWoool.009A3390
01268D16 8B5E 24 mov ebx, dword ptr [esi+24]
01268D19 339A 94000000 xor ebx, dword ptr [edx+94]
01268D1F 331C01 xor ebx, dword ptr [ecx+eax]
01268D22 83E3 10 and ebx, 10
01268D25 F7DB neg ebx
01268D27 1BDB **b ebx, ebx
01268D29 F7DB neg ebx
01268D2B 0FB6C3 movzx eax, bl
01268D2E 85C0 test eax, eax
01268D30 75 05 jnz short 01268D37
01268D32 ^ E9 15FFFFFF jmp 01268C4C
01268D37 8D8D C8FEFFFF lea ecx, dword ptr [ebp-138]
01268D3D 51 push ecx
01268D3E FF15 88002B01 call dword ptr [12B0088] ; kernel32.LoadLibraryA
01268D22 83E3 10 and ebx, 10
01268D25 F7DB neg ebx
01268D27 1BDB **b ebx, ebx
01268D29 F7DB neg ebx
01268D2B 0FB6C3 movzx eax, bl
01268D2E 85C0 test eax, eax
01268D30 75 05 jnz short 01268D37
01268D32 ^ E9 15FFFFFF jmp 01268C4C
01268D37 8D8D C8FEFFFF lea ecx, dword ptr [ebp-138]
01268D3D 51 push ecx
01268D3E FF15 88002B01 call dword ptr [12B0088] ; kernel32.LoadLibraryA
01268D44 8B55 F4 mov edx, dword ptr [ebp-C]
01268D47 8B0D 84FF2B01 mov ecx, dword ptr [12BFF84]
01268D4D 890491 mov dword ptr [ecx+edx*4], eax
01268D50 8B55 F4 mov edx, dword ptr [ebp-C]
01268D53 A1 84FF2B01 mov eax, dword ptr [12BFF84]
01268D58 833C90 00 cmp dword ptr [eax+edx*4], 0
01268D5C 75 05 jnz short 01268D63 <===这里NOP掉
01268D5E ^ E9 E9FEFFFF jmp 01268C4C
01268D63 C785 BCFEFFFF 0>mov dword ptr [ebp-144], 0
01268D6D C785 C0FEFFFF 0>mov dword ptr [ebp-140], 0
01268D77 8B4D F8 mov ecx, dword ptr [ebp-8]
01268D7A 8B51 04 mov edx, dword ptr [ecx+4]
01268D7D 8995 C4FEFFFF mov dword ptr [ebp-13C], edx
01268D83 EB 0F jmp short 01268D94
01268D85 8B85 C4FEFFFF mov eax, dword ptr [ebp-13C]
01268D8B 83C0 0C add eax, 0C
向下查找两个连续的Salc指令
01268FA7 ^\E9 80FEFFFF jmp 01268E2C
01268FAC 8B0D 04DB2B01 mov ecx, dword ptr [12BDB04] ; FlyWoool.009A3390
01268FB2 8B15 04DB2B01 mov edx, dword ptr [12BDB04] ; FlyWoool.009A3390
01268FB8 A1 04DB2B01 mov eax, dword ptr [12BDB04]
01268FBD 8B35 04DB2B01 mov esi, dword ptr [12BDB04] ; FlyWoool.009A3390
01268FC3 8B76 28 mov esi, dword ptr [esi+28]
01268FC6 33B0 94000000 xor esi, dword ptr [eax+94]
01268FCC 3372 6C xor esi, dword ptr [edx+6C]
01268FCF 3371 0C xor esi, dword ptr [ecx+C]
01268FD2 8B4D F4 mov ecx, dword ptr [ebp-C]
01268FD5 8B15 84FF2B01 mov edx, dword ptr [12BFF84]
01268FDB 33348A xor esi, dword ptr [edx+ecx*4]
01268FDE 8B45 F4 mov eax, dword ptr [ebp-C]
01268FE1 8B0D 84FF2B01 mov ecx, dword ptr [12BFF84]
01268FE7 893481 mov dword ptr [ecx+eax*4], esi
01268FEA ^ E9 5DFCFFFF jmp 01268C4C
01268FEF EB 03 jmp short 01268FF4 <==这里F2下断,F9运行到这里
01268FF1 D6 salc
01268FF2 D6 salc
01268FF3 8F ??? ; 未知命令
01268FF4 8B15 E4702C01 mov edx, dword ptr [12C70E4]
01268FFA 8995 B4FDFFFF mov dword ptr [ebp-24C], edx
01269000 83BD B4FDFFFF 0>cmp dword ptr [ebp-24C], 0
01269007 74 36 je short 0126903F
01269009 8B85 B4FDFFFF mov eax, dword ptr [ebp-24C]
0126900F 8338 00 cmp dword ptr [eax], 0
01269012 74 2B je short 0126903F
F9运行,断在01268FEF后将Magic JMP恢复到修改前的代码,IAT加密已被避开
去除时间校验,取消01268FEF处的断点,下硬件断点:he GetTickCount F9运行
7C80929C > BA 0000FE7F mov edx, 7FFE0000 <==停在这里Alt+F9返回
7C8092A1 8B02 mov eax, dword ptr [edx]
7C8092A3 F762 04 mul dword ptr [edx+4]
返回到这里:
01289AE7 8985 64D7FFFF mov dword ptr [ebp-289C], eax <== 时间1到[ebp-289C]
01289AED 8B85 48D6FFFF mov eax, dword ptr [ebp-29B8]
01289AF3 8985 68D7FFFF mov dword ptr [ebp-2898], eax
01289AF9 8BB5 60D7FFFF mov esi, dword ptr [ebp-28A0]
01289AFF 6BF6 03 imul esi, esi, 3
01289B02 E8 49750000 call 01291050
01289B07 F7D8 neg eax
01289B09 1BC0 **b eax, eax
01289B0B 83E0 02 and eax, 2
01289B0E 83C0 01 add eax, 1
01289B11 0FAFF0 imul esi, eax
01289B14 8B8D 68D7FFFF mov ecx, dword ptr [ebp-2898]
第二次中断后Alt+F9返回在此:
01289CBF 2B85 64D7FFFF sub eax, dword ptr [ebp-289C] < == 时间2减[ebp-289C]的时间1,得到间隔
01289CC5 3D B80B0000 cmp eax, 0BB8
01289CCA 76 12 jbe short 01289CDE <==== 改为jmp short 01289CDE F7单步一次
01289CCC 8B95 98D7FFFF mov edx, dword ptr [ebp-2868]
01289CD2 81F2 C31C724B xor edx, 4B721CC3
01289CD8 8995 98D7FFFF mov dword ptr [ebp-2868], edx
01289CDE 8B85 48D6FFFF mov eax, dword ptr [ebp-29B8] <== 来到此处,取消断点及恢复01289CCA处修改
01289CE4 8985 ACABFFFF mov dword ptr [ebp+FFFFABAC], eax
01289CEA 8B8D ACABFFFF mov ecx, dword ptr [ebp+FFFFABAC]
01289CF0 51 push ecx
01289CF1 E8 1EF80000 call 01299514
找OEP
下断点:bp CreateThread Shift+F9中断后发现返回的是程序空间,取消断点,Alt+F9返回
7C810637 > 8BFF mov edi, edi <==返回到这里. 取消断点,Alt+F9返回
7C810639 55 push ebp
7C81063A 8BEC mov ebp, esp
7C81063C FF75 1C push dword ptr [ebp+1C]
7C81063F FF75 18 push dword ptr [ebp+18]
7C810642 FF75 14 push dword ptr [ebp+14]
7C810645 FF75 10 push dword ptr [ebp+10]
7C810648 FF75 0C push dword ptr [ebp+C]
7C81064B FF75 08 push dword ptr [ebp+8]
7C81064E 6A FF push -1
7C810650 E8 D7FDFFFF call CreateRemoteThread
7C810655 5D pop ebp
7C810656 C2 1800 retn 18
7C810659 33ED xor ebp, ebp
7C81065B 53 push ebx
7C81065C 50 push eax
7C81065D 6A 00 push 0
01274435 50 push eax <==Alt+F9返回
01274436 FF15 5C022B01 call dword ptr [12B025C] ; kernel32.CloseHandle
0127443C 5E pop esi
0127443D 5B pop ebx
0127443E 8BE5 mov esp, ebp
01274440 5D pop ebp
01274441 C3 retn <==返回到 01290564 F7跟进
01274442 CC int3
01274443 CC int3
01290564 83C4 04 add esp, 4 <==跟到这里
01290567 B9 B8D42B01 mov ecx, 12BD4B8
0129056C E8 2FBAFBFF call 0124BFA0
01290571 0FB6C0 movzx eax, al
01290574 85C0 test eax, eax
01290576 74 0C je short 01290584
01290578 6A 01 push 1
0129057A B9 B8D42B01 mov ecx, 12BD4B8
0129057F E8 DCA1FCFF call 0125A760
01290584 C705 38972B01 8>mov dword ptr [12B9738], 12B3C8C ; ASCII "彖渧`8eュ闇v`8eュ隃v`8exitProcess"
0129058E B9 04C62B01 mov ecx, 12BC604
01290593 E8 B82EFBFF call 01243450
01290598 C745 F0 0000000>mov dword ptr [ebp-10], 0
0129059F 8D4D E8 lea ecx, dword ptr [ebp-18]
012905A2 51 push ecx
012905A3 68 90062901 push 1290690
012905A8 FF15 74D12B01 call dword ptr [12BD174]
012905AE 83C4 08 add esp, 8
012905B1 8B15 1CDB2B01 mov edx, dword ptr [12BDB1C] ; FlyWoool.00400000
012905B7 8955 E4 mov dword ptr [ebp-1C], edx
012905BA B8 22000000 mov eax, 22
012905BF C1E0 02 shl eax, 2
012905C2 8B0D 04DB2B01 mov ecx, dword ptr [12BDB04] ; FlyWoool.009A3390
012905C8 8B15 04DB2B01 mov edx, dword ptr [12BDB04] ; FlyWoool.009A3390
012905CE 8B35 04DB2B01 mov esi, dword ptr [12BDB04] ; FlyWoool.009A3390
向下查找最近的一个Retn
01290668 6A 00 push 0
0129066A 8B45 08 mov eax, dword ptr [ebp+8]
0129066D 8B48 0C mov ecx, dword ptr [eax+C]
01290670 51 push ecx
01290671 8B55 F4 mov edx, dword ptr [ebp-C]
01290674 2B55 DC sub edx, dword ptr [ebp-24]
01290677 FFD2 call edx <== 进OEP的Call,此处F2下断点,F9断下后F7跟进
01290679 8945 FC mov dword ptr [ebp-4], eax
0129067C 8B45 FC mov eax, dword ptr [ebp-4]
0129067F 5E pop esi
01290680 8BE5 mov esp, ebp
01290682 5D pop ebp
01290683 C3 retn <== 这里,向上查看call edx
01290684 CC int3
01290685 CC int3
01290686 CC int3
01290687 CC int3
01290688 CC int3
OEP: 一片大红
004E215C 6A 60 push 60 <====停在这里,一片大红......这里是OEP吗?
004E215E 68 40BC6500 push 0065BC40
004E2163 E8 2C120000 call 004E3394
004E2168 BF 94000000 mov edi, 94
004E216D 8BC7 mov eax, edi
004E216F E8 6CD0FFFF call 004DF1E0
004E2174 8965 E8 mov dword ptr [ebp-18], esp
004E2177 8BF4 mov esi, esp
004E2179 893E mov dword ptr [esi], edi
004E217B 56 push esi
004E217C FF15 F4414801 call dword ptr [14841F4] ; kernel32.GetVersionExA
004E2182 8B4E 10 mov ecx, dword ptr [esi+10]
004E2185 890D 7CD79300 mov dword ptr [93D77C], ecx
004E218B 8B46 04 mov eax, dword ptr [esi+4]
004E218E A3 88D79300 mov dword ptr [93D788], eax
004E2193 8B56 08 mov edx, dword ptr [esi+8]
004E2196 8915 8CD79300 mov dword ptr [93D78C], edx
004E219C 8B76 0C mov esi, dword ptr [esi+C]
004E219F 81E6 FF7F0000 and esi, 7FFF
004E21A5 8935 80D79300 mov dword ptr [93D780], esi
004E21AB 83F9 02 cmp ecx, 2
004E21AE 74 0C je short 004E21BC
004E21B0 81CE 00800000 or esi, 8000
004E21B6 8935 80D79300 mov dword ptr [93D780], esi
004E21BC C1E0 08 shl eax, 8
004E21BF 03C2 add eax, edx
004E21C1 A3 84D79300 mov dword ptr [93D784], eax
004E21C6 33F6 xor esi, esi
004E21C8 56 push esi
004E21C9 8B3D E8474801 mov edi, dword ptr [14847E8] ; kernel32.GetModuleHandleA
找到OEP后,
用ArmInlinev0.96f分别修复Strategic Code Splicing(策略代码拼接)和Import Table Elimination(输入表混淆)。全是自动的。然后用LodePE-DLX全部Dump出该进程(只有一个,因为被转成单进程了)。
抓取正确的输入表
打开ImportREC1.6f选择程序进程,我参照ArmInlinev0.96f重建的IAT基址 填入后,会自动变,无法保留我输入的RVA数值 和Size大小
按 ArmInlinev0.96f 自动给出的数值,转存后,运行程序,出现自校验.
接下来怎么去除自校验,小菜,不会了还请老师们给指点一下,
不知道这个OEP找的对不对.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课