![]() |
"Armadillo 3.6主程序IAT处理" |
上次对IAT处理有误,近几天有空专门对其进行了分析,而且为此还安装了WINXP。发现Armadillo 3.6和3.7处理IAT方法一样,但是操作系统不同IAT位置不一样,以WIN2k为最难。win2k下IAT位置到012c1000处不在文件内存映像范围内,所以对其IAT修复还要处理位置问题。下面是分析笔记,不当之处请指点。 用OllyDBG加载,在命令窗口输入bp DebugActiveProcess。断下后察看堆栈窗口: 0012DA9C 00487DDB /CALL 到 DebugActiveProcess 来自 Armadill.00487DD5 0012DAA0 0000057C \ProcessId = 57C 0012DAA4 0012FF04 0012DAA8 00000000 进程ID为57C.另外打开一个ollydbg程序,附加到57C这个进程,OK。 按ALT+F9会来到入口处,修改入口指令EB FE为60 E8(第一步记下的),结果: 004A2000 >PUSHAD 004A2001 CALL Armadill.004A2006 004A2006 POP EBP 004A2007 PUSH EAX 004A2008 PUSH ECX 004A2009 JMP SHORT Armadill.004A201A 设置bp OpenMutexA断点,断下后取消。 察看堆栈窗口: 0012F574 004797F1 /CALL 到 OpenMutexA 来自 Armadill.004797EB 0012F578 001F0001 |Access = 1F0001 0012F57C 00000000 |Inheritable = FALSE 0012F580 0012FBB4 \MutexName = "57C::DAAD341ECC" 0012F584 0012FF04 其中0012FBB4指向MutexName = "57C::DAAD341ECC",根据此值在00401000空白处输入以下代码:(先建立再打开,对OpenMutexA这个API进行Hook) 00401000 60 PUSHAD 00401001 68 B4FB1200 PUSH 12FBB4 ; ASCII "57C::DAAD341ECC" 00401006 6A 00 PUSH 0 00401008 6A 00 PUSH 0 0040100A E8 D08BA877 CALL KERNEL32.CreateMutexA 0040100F 61 POPAD 00401010 -E9 D48CA877 JMP KERNEL32.OpenMutexA 在00401000地址按鼠标右键,然后在菜单中选择“此处新建EIP”。 设置bp LoadLibraryA断点,不断按F9,当堆栈显示为: 0012BEE4 00DF8B55 /CALL 到 LoadLibraryA 来自 00DF8B4F 0012BEE8 012E0640 \FileName = "WSOCK32.dll" 此时说明开始处理IAT了。按Ctrl-F9,然后F7到程序领空。 然后一路F8到: 00E11684 PUSH 0 00E11686 CALL DWORD PTR DS:[E180C4] ; KERNEL32.GetModuleHandleA 00E1168C CMP DWORD PTR SS:[EBP-1744],EAX 00E11692 JNZ SHORT 00E116A3 再一路F8到: 00E1174F CMP DWORD PTR SS:[EBP-1744],EAX 00E11755 JNZ SHORT 00E11768 此处要说明一下,目前大部分都是在这之后修改jmp使之不进行IAT加密。其实所有Armadillo壳处理IAT的原理是:先比较模块是不是kernel32.dll/user32.dll/advapi32.dll,如果是再进行API比较(只对符合条件的API进行hook到壳中执行),如API符合就修改IAT中对应的项使其指向壳代码,都不满足则填入真实的API入口地址(即不加密)。 00E1174F处就是进行模块句柄比较,所以只要修改00E11755处的跳转或在此处下硬件执行断点手动转移,就可以免除所有IAT加密。 ok,当所有IAT处理完毕后,就可以用ImportREC.exe得到所有正确IAT了。win2k下RVA=00EC1008,SIZA=600,然后即可get imports. 这是得到的所有函数清单: 1 00EC1008 user32.dll 0261 SetWindowPos 1 00EC100C user32.dll 019D LoadBitmapA 1 00EC101C user32.dll 01BF MapWindowPoints 1 00EC1020 gdi32.dll 0052 DeleteDC 1 00EC1024 kernel32.dll 01FC MapViewOfFile 1 00EC102C user32.dll 01C3 MessageBeep 1 00EC1038 ws2_32.dll 0034 gethostbyname 1 00EC1040 gdi32.dll 01B4 RealizePalette 1 00EC1048 ws2_32.dll 0003 closesocket 1 00EC1050 kernel32.dll 0026 CompareStringW 1 00EC1058 user32.dll 019B LoadAcceleratorsA 1 00EC105C kernel32.dll 0025 CompareStringA 1 00EC1060 user32.dll 0100 GetCursorPos 1 00EC1064 user32.dll 013E GetPropA 1 00EC106C user32.dll 025E SetWindowLongA 1 00EC1074 user32.dll 0146 GetSubMenu 1 00EC1078 kernel32.dll 0202 MoveFileA 1 00EC107C user32.dll 0087 DefWindowProcA 1 00EC1080 kernel32.dll 018B GetTickCount 1 00EC1084 kernel32.dll 0309 WinExec 1 00EC1088 gdi32.dll 0013 BitBlt 1 00EC1090 ntdll.dll 0222 RtlLeaveCriticalSection 1 00EC1094 user32.dll 0161 GetWindowRect 1 00EC109C comctl32.dll 003F ImageList_LoadImage 1 00EC10A0 user32.dll 00D7 FillRect 1 00EC10A4 user32.dll 015B GetWindowLongA 1 00EC10B4 user32.dll 00F6 GetClipboardData 1 00EC10B8 kernel32.dll 0293 SetEndOfFile 1 00EC10BC user32.dll 0258 SetTimer 1 00EC10C4 kernel32.dll 012A GetFileSize 1 00EC10CC ntdll.dll 0199 RtlDeleteCriticalSection 1 00EC10D0 gdi32.dll 0039 CreateFontIndirectA 1 00EC10D4 advapi32.dll 0193 RegDeleteKeyA 1 00EC10D8 user32.dll 0017 CallWindowProcA 1 00EC10DC gdi32.dll 0168 GetStockObject 1 00EC10E0 kernel32.dll 01E6 LoadLibraryA 1 00EC10E8 user32.dll 00B2 DrawTextA 1 00EC10EC kernel32.dll 0044 CreateMutexA 1 00EC10F0 comdlg32.dll 006E GetOpenFileNameA 1 00EC10F8 ntdll.dll 0277 RtlSizeHeap 1 00EC1104 kernel32.dll 0049 CreateProcessA 1 00EC1108 gdi32.dll 0032 CreateDIBitmap 1 00EC110C user32.dll 018B IsClipboardFormatAvailable 1 00EC1110 kernel32.dll 02E5 UnmapViewOfFile 1 00EC1114 kernel32.dll 029C SetFilePointer 1 00EC1118 user32.dll 0270 ShowWindow 1 00EC1120 gdi32.dll 01CF SelectObject 1 00EC1124 gdi32.dll 0044 CreatePalette 1 00EC1128 user32.dll 008A DeleteMenu 1 00EC112C gdi32.dll 002C CreateCompatibleDC |