这个的Armadillo壳怪怪的,是不是用了SDK
软件名称: ICC7 for AVR V7.03
软件类别: AVR单片机C编译集成开发器
应用平台: Win9x/NT/2000/XP
开 发 商:
df7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3W2E0j5h3N6W2j5%4u0S2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1j5`.
软件介绍: AVR单片机C编译集成开发器
下载地址: ftp://ftp.imagecraft.com/pub/pub/iccv7avr_demo.exe
【脱壳经验】:Armadillo壳只脱过《魔法转换(Magic Converter)》V4.3正式版,并成功。
【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
首先用PEiD v0.93查壳得:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
运行软件用Windows任务管理器和LordPE并没发现双进程。
这里使用修改版OllyDbg中已更改Class为Explorer的调试器,
因为如果不这样就算用IsDebug插件去掉OllyDbg的调试器标志,已会使OD异常退出。
设置OllyDbg忽略所有其它异常选项。
―――――――――――――――――――――――――――――――――
一、寻找OEP+解码Dump
载入程序:
00691B53 >/$ 55 push ebp
00691B54 |. 8BEC mov ebp,esp
00691B56 |. 6A FF push -1
00691B58 |. 68 F8BE6B00 push iccavrid.006BBEF8
00691B5D |. 68 90186900 push iccavrid.00691890 ; SE 句柄安装
00691B62 |. 64:A1 00000000 mov eax,dword ptr fs:[0]
00691B68 |. 50 push eax
00691B69 |. 64:8925 00000000 mov dword ptr fs:[0],esp
00691B70 |. 83EC 58 sub esp,58
00691B73 |. 53 push ebx
00691B74 |. 56 push esi
00691B75 |. 57 push edi
00691B76 |. 8965 E8 mov dword ptr ss:[ebp-18],esp
00691B79 |. FF15 88616B00 call near dword ptr ds:[<&KERNEL32.GetVersion>; kernel32.GetVersion
寻找OEP我采用F8老实跟踪的方法,跟到以下
00F7DE04 FF76 04 push dword ptr ds:[esi+4]
00F7DE07 8B50 74 mov edx,dword ptr ds:[eax+74]
00F7DE0A 3350 4C xor edx,dword ptr ds:[eax+4C]
00F7DE0D FF76 08 push dword ptr ds:[esi+8]
00F7DE10 3350 28 xor edx,dword ptr ds:[eax+28]
00F7DE13 6A 00 push 0
00F7DE15 FF76 0C push dword ptr ds:[esi+C]
00F7DE18 2BCA sub ecx,edx
00F7DE1A FFD1 call near ecx ; iccavrid.00401000
到00401000后,感觉好象不是OEP,但以前的教程都基本上的找到call edx这类的就到OEP了
大家帮忙判断一下。
00401000 A1 10F65600 mov eax,dword ptr ds:[56F610]
00401005 C1E0 02 shl eax,2
00401008 A3 14F65600 mov dword ptr ds:[56F614],eax
0040100D 57 push edi
0040100E 51 push ecx
0040100F 33C0 xor eax,eax
00401011 BF CCF55800 mov edi,iccavrid.0058F5CC
00401016 B9 E4595B00 mov ecx,iccavrid.005B59E4
0040101B 3BCF cmp ecx,edi
0040101D 76 05 jbe short iccavrid.00401024
0040101F 2BCF sub ecx,edi
00401021 FC cld
00401022 F3:AA rep stos byte ptr es:[edi]
00401024 59 pop ecx
00401025 5F pop edi
00401026 52 push edx
00401027 6A 00 push 0
00401029 E8 E6C61600 call iccavrid.0056D714 ;//实际上是加密了的GetModuleHandleA
0040102E 8BD0 mov edx,eax
00401030 E8 C7F01500 call iccavrid.005600FC
00401035 5A pop edx
到这里就当00401000为OEP吧!运行LordPE,完全Dump出子进程
―――――――――――――――――――――――――――――――――
二、输入表
我说它是不是用了SDK就在这里,因为输入表放的内存区块很怪。
重载程序
按照论坛上的教程使用he GetModuleHandle断点找到输入表加密位置
00F6524C FF15 B840F800 call near dword ptr ds:[F840B8] ; kernel32.GetModuleHandleA
00F65252 8B0D 3C1EF900 mov ecx,dword ptr ds:[F91E3C]
00F65258 89040E mov dword ptr ds:[esi+ecx],eax
00F6525B A1 3C1EF900 mov eax,dword ptr ds:[F91E3C]
00F65260 391C06 cmp dword ptr ds:[esi+eax],ebx
00F65263 75 16 jnz short 00F6527B
00F65265 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00F6526B 50 push eax
00F6526C FF15 B842F800 call near dword ptr ds:[F842B8] ; kernel32.LoadLibraryA
00F65272 8B0D 3C1EF900 mov ecx,dword ptr ds:[F91E3C]
00F65278 89040E mov dword ptr ds:[esi+ecx],eax
00F6527B A1 3C1EF900 mov eax,dword ptr ds:[F91E3C]
00F65280 391C06 cmp dword ptr ds:[esi+eax],ebx
00F65283 0F84 2F010000 je 00F653B8 ;//Magic Jump! 修改为:jmp 00E6AE2A ★
00F65289 33C9 xor ecx,ecx
00F6528B 8B07 mov eax,dword ptr ds:[edi]
00F6528D 3918 cmp dword ptr ds:[eax],ebx
00F6528F 74 06 je short 00F65297
00F65291 41 inc ecx
00F65292 83C0 0C add eax,0C
00F65295 ^ EB F6 jmp short 00F6528D
然后下断00401000,中断后查看输入表的确没加密了。
0056D6E4 - FF25 6C7F3700 jmp near dword ptr ds:[377F6C] ; kernel32.GetFileSize
0056D6EA - FF25 50783700 jmp near dword ptr ds:[377850] ; kernel32.GetFileTime
0056D6F0 - FF25 D0783700 jmp near dword ptr ds:[3778D0] ; kernel32.GetFileType
0056D6F6 - FF25 EC723700 jmp near dword ptr ds:[3772EC] ; kernel32.GetFullPathNameA
0056D6FC - FF25 90803700 jmp near dword ptr ds:[378090] ; ntdll.RtlGetLastWin32Error
0056D702 - FF25 287A3700 jmp near dword ptr ds:[377A28] ; kernel32.GetLocalTime
0056D708 - FF25 447A3700 jmp near dword ptr ds:[377A44] ; kernel32.GetLocaleInfoA
0056D70E - FF25 78733700 jmp near dword ptr ds:[377378] ; kernel32.GetModuleFileNameA
0056D714 - FF25 C07E3700 jmp near dword ptr ds:[377EC0] ; kernel32.GetModuleHandleA
0056D71A - FF25 3C7D3700 jmp near dword ptr ds:[377D3C] ; kernel32.GetOEMCP
0056D720 - FF25 247D3700 jmp near dword ptr ds:[377D24] ; kernel32.GetOverlappedResult
0056D726 - FF25 AC733700 jmp near dword ptr ds:[3773AC] ; kernel32.GetPrivateProfileIntA
0056D72C - FF25 04813700 jmp near dword ptr ds:[378104] ; kernel32.GetPrivateProfileStringA
0056D732 - FF25 7C783700 jmp near dword ptr ds:[37787C] ; kernel32.GetProcAddress
0056D738 - FF25 F8743700 jmp near dword ptr ds:[3774F8] ; kernel32.GetProfileStringA
00377350 77F1B605 GDI32.SetWinMetaFileBits
00377354 77EF94AD GDI32.SetWindowOrgEx
00377358 77F245B9 GDI32.StartDocA
0037735C 00F666E2
00377360 77F06AA6 GDI32.StartPage
00377364 77EFC6FC GDI32.StretchBlt
00377368 7C80EA66 kernel32.FileTimeToLocalFileTime
0037736C 00F665A5
00377370 7C865A14 kernel32.SetCommMask
00377374 77EFC449 GDI32.TextOutA
00377378 7C80B357 kernel32.GetModuleFileNameA
0037737C 77EF89AF GDI32.UnrealizeObject
但是你们看它地址,相对于基地址00400000是负的啊!这个在ImportREC中怎么填RVA啊!
搞了很久了,到底是不是用了SDK将软件是壳完全融合成一体了啊!
是不是真得脱不了了啊!
大虾帮兄弟一把吧!
LuYe
2005-10-11
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课