armadillo中code splicing的几种处理方法
Anti Tracks 5.9.8下载页面: http://www.download.com/3120-20_4-0.html?qt=AntiTracks&tg=dl-20&search.x=17&search.y=12
Erase your Internet tracks, computer activities, and history. Read full review...
OS: Windows (all)
License: Free to try, $29.95 to buy
File Size: 3.12MB
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
【调试环境】:WinXP、OllyDbg、PEiD、LordPE,arminline0.7
—————————————————————————————————
【脱壳过程】:
小弟脱这个壳,主要是学习处理code splicing,参考了很多大侠的文章,总结出三种方法:
这个程序别人已经脱过壳,前面的部分内容基本上是他的翻版,希望他不要介意。
od载入主程序停在这里:
00540323 A>55 push ebp
00540324 8BEC mov ebp,esp
00540326 6A FF push -1
00540328 68 20AB>push AntiTrac.0056AB20
0054032D 68 6000>push AntiTrac.00540060
00540332 64:A1 0>mov eax,dword ptr fs:
00540338 50 push eax
下断点:BP GetModuleHandleA+5
不断按f9
第一次:
0012FF38 005403EB返回到 AntiTrac.005403EB 来自 kernel32.GetModuleHandleA
0012FF3C 00000000
0012FF40 00000000
0012FF44 00141F29
第二次:
0012CED8 77C059FC返回到 msvcrt.77C059FC 来自 kernel32.GetModuleHandleA
0012CEDC 77BE31ACASCII "kernel32.dll"
0012CEE0 77C2CA20msvcrt.77C2CA20
。。。。。。
。。。。。。
第七次:
00126884 00C835E7返回到 00C835E7 来自 kernel32.GetModuleHandleA
00126888 00C97474ASCII "kernel32.dll"
0012688C 00C98744ASCII "VirtualAlloc"
00126890 00000001
00126894 00DF00D0
第八次:
00126884 00C83604返回到 00C83604 来自 kernel32.GetModuleHandleA
00126888 00C97474ASCII "kernel32.dll"
0012688C 00C98738ASCII "VirtualFree"
00126890 00000001
第九次:(shift+f9)
001265F4 00C6ABA5返回到 00C6ABA5 来自 kernel32.GetModuleHandleA
001265F8 00126738ASCII "kernel32.dll"
001265FC 00000000
00126600 CCE00000
到返回时机了,去掉断点,alt+f9返回
00C6ABAE A1 E4C9>mov eax,dword ptr ds:
00C6ABB3 391C06cmp dword ptr ds:,ebx
00C6ABB6 75 16 jnz short 00C6ABCE
00C6ABB8 8D85 B4>lea eax,dword ptr ss:
00C6ABBE 50 push eax
00C6ABBF FF15 E0>call dword ptr ds: ; kernel32.LoadLibraryA
00C6ABC5 8B0D E4>mov ecx,dword ptr ds:
00C6ABCB 89040Emov dword ptr ds:,eax
00C6ABCE A1 E4C9>mov eax,dword ptr ds:
00C6ABD3 391C06cmp dword ptr ds:,ebx
00C6ABD6 0F84 31>je 00C6AD0D *********magic jmp
00C6ABDC 33C9 xor ecx,ecx
00C6ABDE 8B07 mov eax,dword ptr ds:
00C6ABE0 3918 cmp dword ptr ds:,ebx
把je 00C6AD0D 改成jmp 00C6AD0D 。
下断点he SetProcessWorkingSetSize, f9,这里会停几秒钟 到这里
77E5346F k>55 push ebp
77E53470 8BEC mov ebp,esp
77E53472 83EC 20 sub esp,20
77E53475 8B4D 0C mov ecx,dword ptr ss:
77E53478 85C9 test ecx,ecx
77E5347A 53 push ebx
先不取消断点,再下断点:he GetCurrentThreadId 到这里
77E5A7DF ker>64:A1 1>mov eax,dword ptr fs:
77E5A7E5 8B40 24 mov eax,dword ptr ds:
77E5A7E8 C3 retn
77E5A7E9 ker>8B4C24 >mov ecx,dword ptr ss:
77E5A7ED 8B5424 >mov edx,dword ptr ss:
堆栈如下:
0012D59C 00C8C34B/CALL 到 GetCurrentThreadId 来自 00C8C345
0012D5A0 0012FF2C
0012D5A4 00000000
0012D5A8 7FFDF000
0012D5AC 40000060ASCII "t be run under Win32
$7"
0012D5B0 77F5166A返回到 ntdll.77F5166A 来自 ntdll.77F78C4E
取消上面两个硬件断点:
alt+f9 到这里
00C8C34B A3 0C20>mov dword ptr ds:,eax
00C8C350 E8 E5EB>call 00C6AF3A
00C8C355 53 push ebx
00C8C356 E8 F54C>call 00C71050
00C8C35B A1 F81E>mov eax,dword ptr ds:
00C8C360 59 pop ecx
00C8C361 8B48 68 mov ecx,dword ptr ds:
00C8C364 3348 04 xor ecx,dword ptr ds:
00C8C367 3308 xor ecx,dword ptr ds:
00C8C369 F6C1 40 test cl,40
00C8C36C 75 08 jnz short 00C8C376
00C8C36E 6A 01 push 1
00C8C370 E8 17B9>call 00C67C8C
00C8C375 59 pop ecx
00C8C376 53 push ebx
00C8C377 C705 E0>mov dword ptr ds:,0C987C0 ; ASCII "RC"
00C8C381 E8 6AE5>call 00C6A8F0
00C8C386 59 pop ecx
(有人把ASCII "RC"看着快到入口标志)
f8单步执行:
到call edi 这里后 f7就到达入口oep了
00401000 /EB 10 jmp short AntiTrac.00401012
00401002 |66:623A bound di,dword ptr ds:
00401005 |43 inc ebx
00401006 |2B2B sub ebp,dword ptr ds:
00401008 |48 dec eax
00401009 |4F dec edi
0040100A |4F dec edi
0040100B |4B dec ebx
0040100C |90 nop
0040100D -|E9 B8B6>jmp 0085C6CA
00401012 \A1 ABB6>mov eax,dword ptr ds:
00401017 C1E0 02 shl eax,2
0040101A A3 AFB6>mov dword ptr ds:,eax
0040101F 52 push edx
现在对付code splicing:
查找antitracks的进程为468
alt +m打开内存窗口
内存映射,项目 23
地址=00401000
大小=0005A000 (368640.)
物主=AntiTrac 00400000
区段=.text
类型=Imag 01001002
访问=R
初始访问=RWE
然后点访问,按访问排序:
第一个类型为priv 访问=RWE的项目如下:
内存映射,项目 317
地址=02C10000
大小=00020000 (131072.)
物主= 02C10000 (自身)
区段=
类型=Priv 00021040
访问=RWE
初始访问=RWE
(这个地址不是固定的)
打开arminline0.7,依次填入:
468,401000,5a000
02c1000,20000
点remove splicing
结果出现:
process memory buffered successfully
0 splices repaired
no splicing found
奇怪,怎么没找到?
这个地址应该没错呀,我按另一种方法找也是这样的地址
后来我试了几次,终于成功了,我不知道是什么原因?脱壳的步骤都是一样的
提示成功:
2293splics repaired
patch successful
然后用lordpedump出来,修复iat (具体步骤下面有) ,成功运行
code splicing处理方法二:
下面说另一种对付code的办法,参照,
Armadillo 4.xx- Code Splicing+Import Elimination
Target: GameJack ?v5.0.3.3
好象是德文写的,我看不懂,只是看他的图。
重新打开od前面的步骤和上面的一样,一直到修改魔法跳转,前面的步骤都是一样的
修改魔法跳转后,下断点he VirtualAlloc,f9
77E5AC72 ker>55 push ebp
77E5AC73 8BEC mov ebp,esp
77E5AC75 FF75 14 push dword ptr ss:
77E5AC78 FF75 10 push dword ptr ss:
77E5AC7B FF75 0C push dword ptr ss:
77E5AC7E FF75 08 push dword ptr ss:
堆栈
00125ED8 73391D07/CALL 到 VirtualAlloc 来自 73391D05
00125EDC 00000000|Address = NULL
00125EE0 00400000|Size = 400000 (4194304.)
00125EE4 00002000|AllocationType = MEM_RESERVE
00125EE8 00000004\Protect = PAGE_READWRITE
00125EEC 00000000
00125EF0 00000001
alt+f9返回后:
73391D07 8BF0 mov esi,eax
73391D09 85F6 test esi,esi
73391D0B 0F84 C5>je 733D8DD6
73391D11 6A 04 push 4
73391D13 68 0010>push 1000
73391D18 68 0000>push 10000 ; UNICODE "=::=::\"
73391D1D 56 push esi
73391D1E FFD7 call edi
73391D20 85C0 test eax,eax
再f9,alt+F9返回:
73391D20 85C0 test eax,eax
73391D22 0F84 A0>je 733D8DC8
73391D28 81FD 30>cmp ebp,7349B030
73391D2E 0F85 74>jnz 733D8DA8
73391D34 A1 30B0>mov eax,dword ptr ds:
73391D39 85C0 test eax,eax
73391D3B 0F84 49>je 733D8D8A
73391D41 A1 34B0>mov eax,dword ptr ds:
73391D46 85C0 test eax,eax
73391D48 0F84 4B>je 733D8D99
73391D4E 8D86 00>lea eax,dword ptr ds:
再f9,alt+f9返回
00C86971 8985 58>mov dword ptr ss:,eax
00C86977 83BD 58>cmp dword ptr ss:,0
00C8697E 74 64 je short 00C869E4
00C86980 6A 40 push 40
00C86982 68 0010>push 1000
00C86987 FFB5 50>push dword ptr ss:
00C8698D FF35 9C>push dword ptr ds:
00C86993 FF15 C0>call dword ptr ds: ; kernel32.VirtualAlloc
00C86999 8985 58>mov dword ptr ss:,eax
00C8699F 83BD 58>cmp dword ptr ss:,0
现在按f8,通过 Function VirtuallAlloc
到达这里
00C86999 8985 58>mov dword ptr ss:,eax
(到00C86993 f8到系统空间 去了 然后alt+f9就到00C86999了 )
看到寄存器中eax=02980000
(the value of EAX contain the Code to destroy our IAT.
We must change this value to a real memory in the section of arm.
Now, alt+M go to memory window)
alt+m,打开内存窗口
内存映射,项目 31
地址=00555000
大小=00010000 (65536.)
物主=AntiTrac 00400000
区段=.adata
类型=Imag 01001002
访问=R
初始访问=RWE
把寄存器窗口中的eax改为00555000
we choose address 555000 to save the Code. Go to FPU(寄存器) Window!
Change EAX to 555000
删除断点hd VirtualAlloc,现在code splicing处理完毕
下断点he SetProcessWorkingSetSize. F9
大约10秒钟后停在这里:
77E5346F ker>55 push ebp
77E53470 8BEC mov ebp,esp
77E53472 83EC 20 sub esp,20
77E53475 8B4D 0C mov ecx,dword ptr ss:
77E53478 85C9 test ecx,ecx
77E5347A 53 push ebx
77E5347B 56 push esi
77E5347C 74 56 je short kernel32.77E534D4
77E5347E 8B45 10 mov eax,dword ptr ss:
先不删除断点,再下断点he GetCurrentThreadId ,f9
到达这里:
77E5A7DF ker>64:A1 1>mov eax,dword ptr fs:
77E5A7E5 8B40 24 mov eax,dword ptr ds:
77E5A7E8 C3 retn
77E5A7E9 ker>8B4C24 >mov ecx,dword ptr ss:
77E5A7ED 8B5424 >mov edx,dword ptr ss:
77E5A7F1 8B4424 >mov eax,dword ptr ss:
堆栈如下:
0012D59C 00C8C34B/CALL 到 GetCurrentThreadId 来自 00C8C345
0012D5A0 0012FF2C
0012D5A4 00000000
删除上面的两个断点:
alt+f9返回 到这里:
00C8C34B A3 0C20>mov dword ptr ds:,eax
00C8C350 E8 E5EB>call 00C6AF3A
00C8C355 53 push ebx
00C8C356 E8 F54C>call 00C71050
00C8C35B A1 F81E>mov eax,dword ptr ds:
00C8C360 59 pop ecx
00C8C361 8B48 68 mov ecx,dword ptr ds:
00C8C364 3348 04 xor ecx,dword ptr ds:
00C8C367 3308 xor ecx,dword ptr ds:
00C8C369 F6C1 40 test cl,40
00C8C36C 75 08 jnz short 00C8C376
00C8C36E 6A 01 push 1
00C8C370 E8 17B9>call 00C67C8C
00C8C375 59 pop ecx
00C8C376 53 push ebx
00C8C377 C705 E0>mov dword ptr ds:,0C987C0 ; ASCII "RC"
00C8C381 E8 6AE5>call 00C6A8F0
00C8C386 59 pop ecx
(有人把ASCII "RC"看着快到入口标志)
f8单步执行:
00C8C3D1 83F9 01 cmp ecx,1
00C8C3D4 75 21 jnz short 00C8C3F7
00C8C3D6 FF76 04 push dword ptr ds:
00C8C3D9 FF76 08 push dword ptr ds:
00C8C3DC 53 push ebx
00C8C3DD E8 74E2>call 00C7A656
00C8C3E2 50 push eax
00C8C3E3 A1 F81E>mov eax,dword ptr ds:
00C8C3E8 8B48 58 mov ecx,dword ptr ds:
00C8C3EB 3348 30 xor ecx,dword ptr ds:
00C8C3EE 3308 xor ecx,dword ptr ds:
00C8C3F0 2BF9 sub edi,ecx
00C8C3F2 FFD7 call edi ****f7
00C8C3F4 8945 FC mov dword ptr ss:,eax
看到这个call edi没有,执行到这里后,f7就到oep了
00401000 /EB 10 jmp short AntiTrac.00401012
00401002 |66:623A bound di,dword ptr ds:
00401005 |43 inc ebx
00401006 |2B2B sub ebp,dword ptr ds:
00401008 |48 dec eax
00401009 |4F dec edi
0040100A |4F dec edi
0040100B |4B dec ebx
0040100C |90 nop
0040100D -|E9 B8B6>jmp 0085C6CA
00401012 \A1 ABB6>mov eax,dword ptr ds:
00401017 C1E0 02 shl eax,2
0040101A A3 AFB6>mov dword ptr ds:,eax
0040101F 52 push edx
现在打开loardpe选择antitracksdump
再打开 importrec1.6 选择antitracks
填oep=1000,点自动搜索iat下面出现 arav=84bd8size=bc
getimport居然只有46个指针 只有kernel32.dll一个 api
fixdump无法运行。
在od命令行中输入 dd 00484bd8,向上看 还有很多呢!!!
004837F000085DC5
004837F400085DE3
004837F800000000
004837FC4000A314VCL50.System::initialization iat的开始
004838004000A2ACVCL50.System::Finalization
0048380440008AE4VCL50.System::TInterfacedObject::_Release
0048380840008AD0VCL50.System::TInterfacedObject::_AddRef
0048380C40008AA8VCL50.System::TInterfacedObject::QueryInterface
0048381040008A98VCL50.System::TInterfacedObject::NewInstance
0048381440008A88VCL50.System::TInterfacedObject::BeforeDestruction
。。。。。。。
向下看:
00484FC400C6BF3F
00484FC80008B473
00484FCC0008B489
00484FD00008B49D
00484FD40008B4B7
00484FD800000000
00484FDC7619AA55WININET.DeleteUrlCacheEntryA
00484FE07618DA28WININET.FindCloseUrlCache
00484FE47618F63DWININET.FindFirstUrlCacheEntryA
00484FE87618F6C6WININET.FindNextUrlCacheEntryA iat的结束
00484FEC00C6BF44
00484FF0354C4356
00484FF450422E30
00484FF84356004C
iat的长度=00484fe8-004837FC=17ec
重新填 rav=00084fe8size=17ec
点getimport ,cut无效函数,剩下714个指针,fixdump成功运行
把刚才输入表保存起来为import714.txt
显示为注册版,脱壳前只能试用15天
code splicing处理方法三:
参见:Armadillo V4.0输入表乱序的简便修复方法——PIMOne V2.3 (这个是双进程)
开始过程和我刚才前面的一样,到达oep后,dump,存为1.exe
打开内存影射
然后点访问,按访问排序:
第一个类型为priv 访问=RWE的项目如下:
内存映射,项目 317
地址=01AC0000
大小=00020000 (131072.)
物主= 02C10000 (自身)
区段=
类型=Priv 00021040
访问=RWE
初始访问=RWE
(这个地址不是固定的)
记下这个地址,打开lordpe,找到目标进程,选择区域脱壳(第三个选项),找到地址=01AC0000
然后把这部分dump出来,为Region01AC0000-01AE0000.dmp
打开importrec,找到目标进程,load tree,导入上面保存的iat,fixdump,选择1.exe,无法运行。
为什么?因为code splices作怪。
用lordpe--点pe editor,打开1.exe,点sections,右键,第三个选项,从磁盘导入section,选择
刚才的Region01AC0000-01AE0000.dmp,导入后,右键,选edit section header
修改virtual address为 01AC0000-00400000=016C0000,然后设置lordpe的选项,把rebuilder里面
的选项全部去掉,只保留LordPE的“Validate PE”选项,重建PE。
然后用importrec修复输入表,成功运行。
by阳离子
2005年11月23日 bbs.66h6.com 你是什么系统?
页:
[1]