标题:破解Armadillo 4.00双进程带KEY
链接:http://www.unpack.cn/viewthread.php?tid=17456
贴者:大菜一号
日期:2007-9-14 09:20
这个壳大家都能脱了,不过fly说符合规则都欢迎,不敢在各位壳圣面前玩耍,所以,这就当作是对新手朋友的一篇yP壳的教程吧。
此壳的特点,只要用od不做任何反anti-debug措施,f9运行后,再热重启一下计算机就可以体验到了,因为被这个壳锁住了鼠标和键盘,不能进行任何操作,只能重启了!此壳的特点主要的就是这个,并由此延申一下,则壳将判断是否锁住鼠标和键盘之后,再解锁之!这个原因是壳将用GetCurrentProcessId获得其pid(进程标识),再举出其父进程pid,cmp不等则BlockInput,锁住外部输入操作设备!最后还有IsDebugerPresent检测是否有ring3调试器!
1、BlockInput
OD载入hello world,发现看不到user32.dll,则找不到BlockInputA,程序会调用这个函数,必定会加载user32.dll,则选项->调试设置->选中"中断于新模块(dll)"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
f9运行,下面是模块窗口情况:引用:
Executable modules
基址 大小 入口 名称 文件版本 路径
00400000 00012000 004096ED hello_wo C:\Documents and Settings\Administrator\桌面\hello world.exe
7C800000 0011D000 7C80B5AE kernel32 5.1.2600.2945 (x C:\WINDOWS\system32\kernel32.dll
7C920000 00094000 7C933156 ntdll 5.1.2600.2180 (x C:\WINDOWS\system32\ntdll.dll没看到user32.dll,说明程序还未加载之.再f9:引用:
Executable modules
基址 大小 入口 名称 文件版本 路径
00400000 00012000 004096ED hello_wo C:\Documents and Settings\Administrator\桌面\hello world.exe
77D10000 00090000 77D1F518 User32 5.1.2600.3099 (x C:\WINDOWS\system32\User32.dll <-user32模块
7C800000 0011D000 7C80B5AE kernel32 5.1.2600.2945 (x C:\WINDOWS\system32\kernel32.dll
7C920000 00094000 7C933156 ntdll 5.1.2600.2180 (x C:\WINDOWS\system32\ntdll.dllnow,可以在cpu调试窗口上,右键->查看到user32模块了 查看之后,就可以ctrl+g 输入BlockInput复制内容到剪贴板代码:
77D6C9BC > B8 36110000 mov eax, 1136 <-到这里
77D6C9C1 BA 0003FE7F mov edx, 7FFE0300 <-edx=BlockInput的rva
77D6C9C6 FF12 call dword ptr [edx]<-call BlockInput
77D6C9C8 C2 0400 retn 4不能让程序call BlockInput,所以,除了retn 4之外,前面的三条语句都nop,这样就不会被锁住健盘导致我们要重启计算机了!
在retn 4上f2下一个断点,上面也说了,因为壳会断判断pid决定是锁还是解,当然这次是先锁住了!壳判断完后还会来到这里的,所以,在这里下一个断!
2、比较pID,决定是否锁用户输入设备复制内容到剪贴板代码:
7C809920 > 64:A1 18000000 mov eax, dword ptr fs:[18] <-来到这里
7C809926 8B40 20 mov eax, dword ptr [eax+20] <-eax=pID
7C809929 C3 retn壳会判断od的pid,就像老外的文章上所说,先用lord Pe获得od的pID,如下图!
壳会比较,那么,上面的代码我们就应该这么改,要把od的pid返回给eax,让壳判断出自己的pID和od的是一样的,其自身并没有被调试器加载! 这样,就会解锁了鼠标和健盘了!
改之:复制内容到剪贴板代码:
7C809920 > B8 18070000 mov eax, 718 <-呵呵,当然每次运行od的pID都会不一样了,我这里这次是0x718
7C809925 90 nop
7C809926 90 nop
7C809927 90 nop
7C809928 90 nop
7C809929 C3 retn
[b]3、不是问题的问题,用插件骗过IsDebugerPresent![/b]
打开kanxue哥的HideOD插件就行了!4、
还记得我们在77D6C9C8还留下一个断点的了,打开插件之后,f9运行之(先取消了"中断于新模块(dll)"选项),断在复制内容到剪贴板代码:
77D6C9BC > 90 nop <-这些个nop,是我们前面搞的
77D6C9BD 90 nop
77D6C9BE 90 nop
77D6C9BF 90 nop
77D6C9C0 90 nop
77D6C9C1 90 nop
77D6C9C2 90 nop
77D6C9C3 90 nop
77D6C9C4 90 nop
77D6C9C5 90 nop
77D6C9C6 90 nop
77D6C9C7 90 nop
77D6C9C8 C2 0400 retn 4 <-断在这里,程序会两次调用此函数,前面说过了的! f9两次都断在retn 4之后,f2取消断点,内存断点大法法法法法,alt+m,在第一块的代码节上下内存访问断点,因为壳要执行完了!引用:
Memory map, 条目 19
地址=00401000
大小=00004000 (16384.)
属主=hello_wo 00400000
区段=
包含=代码
类型=Imag 01001002
访问=R
初始访问=RWE //内存访问断点f9运行,就到oep了~复制内容到剪贴板代码:
00401020 55 push ebp <-oep,oep,oep
00401021 8BEC mov ebp, esp
00401023 6A FF push -1再用od插件去dump,就行了~
呃呃`最后的节表,有一个.text(空)和.yP,程序的输入表放在.yP里面,不想优化了!闪人~
附件是yP1.03.3的带壳hello world 和脱壳后的 hello world
----------------------------------------------------------------------------------
经验总结:壳盲的经验,还是不要分享的好!^0^
附件地址:http://www.unpack.cn/attachment.php?aid=11537
|