发新话题
打印

[转载]用Ollydbg手脱Armadillo加壳的DLL——Visual.Assist.X.V10.2.1437.0

[转载]用Ollydbg手脱Armadillo加壳的DLL——Visual.Assist.X.V10.2.1437.0

文章作者:fly

下载地址:http://www.wholetomato.com/downloads/VA_X_Setup1437.exe
软件大小:3318KB
软件语言:英文
软件类别:国外软件/共享版/其它控件
应用平台:Win9x/NT/2000/XP
加入时间:2005-12-10
下载次数:21401
开发商:http://www.wholetomato.com/index.html
软件简介:Visual.Assist.X是一款非常好的VisualStudio.NET2003、2002插件,支持C/C++、C#、ASP、VisualBasic、Java和HTML等语言,也支持VC++6、VC++5,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有助于提高开发过程地自动化和开发效率。

【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【调试环境】:WinXP、OllyDBG、PEiD、LordPE、ImportREC、DT_FixRes、PeMove、WinHex

—————————————————————————————————
【脱壳过程】:


有兄弟要求再写篇Armadillo加壳DLL的脱壳教程,所以用VAX作个例子了。
用VC的人很多喜欢这个软件,其核心VA_X.dll加了Armadillo壳。
—————————————————————————————————
一、OllyDBG设置


用修改版OllyDBG,原版会被检测到。

如何避开这些Anti将在ArmadilloV4.0-V4.4.DLL.osc脚本里面实现。

首先要设置OllyDBG忽略除了“内存访问异常”和“异常范围”之外的其他异常选项

否则直接运行下面不好演示清楚

现在我们暂停在第一个内存异常处:
009997818900movdwordptrds:[eax],eax

可以设置OllyDBG或略所有异常选项了。
老规矩:用IsDebug插件去掉OllyDBG的调试器标志。


—————————————————————————————————
二、MagicJump


下断:HEGetModuleHandleA
如果硬件断点无法中断,可以Ctrl+G:GetModuleHandleA,在函数末尾设断
Shift+F9,注意看堆栈

000698E400990D97/CALL到GetModuleHandleA来自00990D91
000698E8009A4D68\pModule="kernel32.dll"
000698EC009A5F58ASCII"VirtualAlloc"

000698E400990DB4/CALL到GetModuleHandleA来自00990DAE
000698E8009A4D68\pModule="kernel32.dll"
000698EC009A5F4CASCII"VirtualFree"

0006965C00979A2D/CALL到GetModuleHandleA来自00979A27
0006966000069798\pModule="kernel32.dll"

当堆栈如上显示变化是,就可以删除GetModuleHandleA处硬件断点了,Alt+F9返回

00979A27FF15CCF09900calldwordptrds:[99F0CC];kernel32.GetModuleHandleA
00979A2D8B0D40A19A00movecx,dwordptrds:[9AA140]
//返回这里
00979A3389040Emovdwordptrds:[esi+ecx],eax
00979A36A140A19A00moveax,dwordptrds:[9AA140]
00979A3B393C06cmpdwordptrds:[esi+eax],edi
00979A3E7516jnzshort00979A56
00979A408D85B4FEFFFFleaeax,dwordptrss:[ebp-14C]
00979A4650pusheax
00979A47FF15D4F09900calldwordptrds:[99F0D4];kernel32.LoadLibraryA
00979A4D8B0D40A19A00movecx,dwordptrds:[9AA140]
00979A5389040Emovdwordptrds:[esi+ecx],eax
00979A56A140A19A00moveax,dwordptrds:[9AA140]
00979A5B393C06cmpdwordptrds:[esi+eax],edi
00979A5E0F84B0000000je00979B14
//MagicJump!修改为:jmp00979B14★
00979A6433C9xorecx,ecx
00979A668B03moveax,dwordptrds:[ebx]
00979A683938cmpdwordptrds:[eax],edi
00979A6A7406jeshort00979A72
00979A6C41incecx
00979A6D83C00Caddeax,0C
00979A70EBF6jmpshort00979A68


—————————————————————————————————
三、OEP


下断:BP_set_new_handler
Shift+F9,中断后取消断点,Alt+F9返回

1EFBCD3CFF154061FE1Ecalldwordptrds:[1EFE6140];msvcrt._set_new_handler
1EFBCD4283C404addesp,4
//返回这里
1EFBCD45837DFC01cmpdwordptrss:[ebp-4],1
1EFBCD49750Ejnzshort1EFBCD59
1EFBCD4B68A896FE1Epush1EFE96A8
1EFBCD50FF15CC96FE1Ecalldwordptrds:[1EFE96CC]
1EFBCD5683C404addesp,4
1EFBCD598B45FCmoveax,dwordptrss:[ebp-4]
1EFBCD5C8BE5movesp,ebp
1EFBCD5E5Dpopebp
1EFBCD5FC3retn
//返回1EFBCDCD

1EFBCDCD8945FCmovdwordptrss:[ebp-4],eax
1EFBCDD0837DFC01cmpdwordptrss:[ebp-4],1
1EFBCDD47540jnzshort1EFBCE16
1EFBCDD6833DC496FE1E00cmpdwordptrds:[1EFE96C4],0
1EFBCDDD7430jeshort1EFBCE0F
1EFBCDDF68E898FE1Epush1EFE98E8
1EFBCDE46A01push1
1EFBCDE68B0D9096FE1Emovecx,dwordptrds:[1EFE9690]
1EFBCDEC51pushecx
1EFBCDEDFF15C496FE1Ecalldwordptrds:[1EFE96C4];VA_X.1EE42A48
//飞向光明之巅


1EE42A486A0Cpush0C
//OEP
1EE42A4A683867EE1Epush1EEE6738
1EE42A4FE8D4130000call1EE43E28
1EE42A5433C0xoreax,eax
1EE42A5640inceax
1EE42A578945E4movdwordptrss:[ebp-1C],eax
1EE42A5A8B750Cmovesi,dwordptrss:[ebp+C]
1EE42A5D33FFxoredi,edi
1EE42A5F3BF7cmpesi,edi
1EE42A61750Cjnzshort1EE42A6F


—————————————————————————————————
四、CodeSplicing


某些兄弟对如何知道程序有CodeSplicing感到困惑,下面提供2种方法吧。
1、一切按正常流程操作,修复后运行程序若有CodeSplicing肯定会崩溃,而崩溃的地方就能看见CodeSplicing地址了。
2、根据CodeSplicing段的特征来查找

目前版本Armadillo的CodeSplicing区段长度为00020000,可以根据此特征来判断。
Alt+M,察看目标程序的区段上下,可以看到02B70000段的长度为00020000

地址大小物主区段包含
02B7000000020000
1ED0000000001000VA_X
1ED010000019D000VA_X.text
1EE9E00000018000VA_XCODE
1EEB600000059000VA_X.rdata
1EF0F00000023000VA_X.data
1EF3200000001000VA_X.SHARED
1EF3300000001000VA_XDATA
1EF3400000042000VA_XBSS
1EF7600000030000VA_X.reloc
1EFA600000030000VA_X.text1
1EFD600000010000VA_X.adatacode
1EFE600000010000VA_X.data1imports
1EFF600000010000VA_X.reloc1relocations
1F13600000041000VA_X.rsrcresources
5D17000000001000COMCTL32PEheader

Alt+C,返回代码窗口,Ctrl+G:02B70000
02B7000066:87F3xchgbx,si
02B7000366:96xchgax,si
02B700057B02jposhort02B70009
02B700077B09jposhort02B70012
02B7000987F9xchgecx,edi
02B7000B90nop
02B7000C87F9xchgecx,edi
02B7000E66:96xchgax,si
02B7001066:87F3xchgbx,si
02B7001355pushebp
02B700148BECmovebp,esp
02B700166AFFpush-1
02B70018E9E80F191Cjmp1ED01005
//注意,跳到目标程序空间

1ED01000E9FBEFE6E3jmp02B70000
//CodeSplicing
1ED0100568606BEB1Epush1EEB6B60
1ED0100A6878D3E31Epush1EE3D378
1ED0100F64:A100000000moveax,dwordptrfs:[0]
1ED01015E903F0E6E3jmp02B7001D

好了,这样就找到了CodeSplicing区段,用ArmInline来修复吧,注意各参数的填写

可以用LordPE把此DLL抓取下来了。


—————————————————————————————————
五、输入表修复


VA_X.dll没有使用ImportTableElimination,输入表函数都是有序排列的,可以正常获取。
运行ImportREC,由于此DLL加载后没有进行重定位,所以保留“UsePEHeaderFromDisk”选项
填入OEPRVA=00142A48,获取输入表后Cut掉函数中填充的无效垃圾指针。


可以新增区段来修复输入表,但是这样会增加大小,所以还是放在近似原来的位置吧
用WinHex打开dump.exe,搜索输入表中函数的DLL名,Armadillo没有清掉输入表的函数DLL名,当找到很多00中的输入表中函数DLL名处就可以放输入表了。当然,Size要算好,一般是够用的。

0020CF2000000000000000000000000000000000................
0020CF300000000000004B45524E454C33322E64......KERNEL32.d
0020CF406C6C0000000000000000000000000000ll..............

此例中输入表可以放在0X0020C050处,FixDump
但是用LordPE察看dumped_.dll输入表时会发现最后一个函数显示[Error],怎么回事?
呵呵,输入表所在段的Size有问题,修正001B6000段VSize和RSize为0020F000-001B6000=00059000即可


—————————————————————————————————
六、输出表修复


由于上面输入表的修复覆盖了输出表,所以我们要把输出表重新挪个位置
打开dumped.dll把0020EC10处输出表数据复制写入到dumped_.dll的0X001B5300处

修正ExportTable各指针,再修正dumped_.dll的ExportTableRVA

也可以用看雪老师的PeMove挪移输出表。复制dumped.dll,用PeMove打开,ExportTable'sFileOffset填入001B5300,点击Move后把001B5300处的输出表复制写入到dumped_.dll中,修正ExportTableRVA

修正输出表所在区段0019E000段的VSize和RSize为001B6000-0019E000=00018000


—————————————————————————————————
七、重定位表修复


Armadillo对于DLL比较友好,没有加密重定位表,因此就没有再调试时跟踪此重定位处理了

LordPE察看区段,“.reloc”段RVA即是重定位表RVA,Size看看其结尾的00就知道了
00297590A33AB83AD73ADC3DE03DE43DE83DEC3D????????
002975A0F03DF43D000000000000000000000000??............

修正dumped_.dll的RelocationRVA=00276000,Size=002975A4-00276000=215A4


—————————————————————————————————
八、Armadillo脱壳文件的优化


其实优化已经在《ArmInline——Armadillo客户版CodeSplicing+ImportTableElimination的简便修复方法》中说过了,再重复一次吧。
用LordPE删除“.reloc”区段下的所有壳区段,记住第一个壳区段“.text1”段的RVA=002A6000


用WinHex移除0X002A6000至末尾的所有数据,另存为UnPacKed.dll。好了,壳数据基本清理完了。

用DT_FixRes修复资源。DT_FixRes打开修复前的dumped.dll

NewRva=002A6000,FileAlignment=1000,DumpResource,获得rsrc.bin
用LordPE把rsrc.bin载入UnPacKed.dll,修正ResourceRVA=002A6000


—————————————————————————————————
九、破解


启动VC时会弹出“LicenseError”的提示,无法使用。以这个为线索就很容易定位了
————————————————————————
1、LicenseError

1ED411D3385C2413cmpbyteptrss:[esp+13],bl
1ED411D77447jeshort1ED41220
//修改为:jmp1ED41220
1ED411D9A1C44CF21Emoveax,dwordptrds:[1EF24CC4]
1ED411DE53pushebx
1ED411DF6838AFEB1Epush1EEBAF38;ASCII"License"
1ED411E46830AFEB1Epush1EEBAF30;ASCII"Error"
1ED411E950pusheax
1ED411EAFF152C69EB1Ecalldwordptrds:[1EEB692C];USER32.MessageBoxA

————————————————————————
2、过期

1ED413848B54244Cmovedx,dwordptrss:[esp+4C]
1ED413888B442450moveax,dwordptrss:[esp+50]
1ED4138C8B4C2454movecx,dwordptrss:[esp+54]
1ED4139052pushedx
1ED4139150pusheax
1ED4139251pushecx
1ED41393E858D80900call1EDDEBF0
1ED4139883C41Caddesp,1C
1ED4139BE890DC0900call1EDDF030
1ED413A03BC3cmpeax,ebx
1ED413A20F8433010000je1ED414DB
//修改为:jmp1ED414DB

————————————————————————
3、局域网验证

1ED673FF68E495EB1Epush1EEB95E4;ASCII"UserName"
1ED6740468BC95EB1Epush1EEB95BC;ASCII"Software\WholeTomato\VisualAssistX"
1ED674098D442410leaeax,dwordptrss:[esp+10]
1ED6740D6801000080push80000001
1ED6741250pusheax
1ED67413C744242400000000movdwordptrss:[esp+24],0
1ED6741BE8602F0000call1ED6A380
1ED674208B4C2418movecx,dwordptrss:[esp+18]
1ED6742451pushecx
1ED674258D542418leaedx,dwordptrss:[esp+18]
1ED6742968E8EDEB1Epush1EEBEDE8;ASCII"Allinstancesofthelicense",LF,"""%s""",LF,"areinuse.VisualAssistXwillbedisabled.YoumustunloadoruninstallVisualAssistX",LF,"andrestartyourIDEtopreventthisPCfrombeingcountedbyotherlicensechecks."

向上回溯:
1ED6748055pushebp
1ED674818BECmovebp,esp
1ED674836AFFpush-1
1ED67485680AA5E81Epush1EE8A50A
1ED6748A64:A100000000moveax,dwordptrfs:[0]
1ED6749050pusheax
1ED6749164:892500000000movdwordptrfs:[0],esp

//修改为:
1ED67480B801000000moveax,1
1ED67485C3retn

TOP

发新话题