版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、窗体顶端VMProtect1.8主程序脱壳分析NOOBY牛已经玩得差不多了 我来补一刀 _手中没有正式版的试炼品 只好拿1.8DEMO主程序看 时间比较久了 忘得差不多 如果分析有误 请各位见谅勾上SOD全部选项 载入VMPROTECT.EXE 停在TLS入口 ALT+M看到基址为00010000 bp VirtualProtect+13 F9 4次后看到解码了 到00011000看看FF25被弄成了什么样子 VMP主程序是DELPHI写的 因此只关注FF25类IAT 而不用关注 CALL XX和MOV EXX,XX/CALL XX这些 使得针对性的IAT修复工作减少了不少体力活 引用:000
2、11278 55 push ebp00011279 E8 30C52800 call 0029D7AE ; 0029D7AE0001127E 8BC0 mov eax,eax00011280 50 push eax00011281 E8 E8E92700 call 0028FC6E ; 0028FC6E00011286 8BC0 mov eax,eax00011288 55 push ebp00011289 E8 5B333700 call 003845E9 ; 003845E90001128E 8BC0 mov eax,eax00011290 52 push edx00011291 E8 F
3、BE02C00 call 002DF391 ; 002DF391被错位了 写段脚本恢复FF25的错位 引用:luanxu:inc searchfind search,#E8?008BC0#cmp $RESULT,0je exitmov search,$RESULTGCI search,DESTINATIONcmp $RESULT,001F3000 /UPX0-VAjb luanxucmp $RESULT,003DE000 /UPX2-VAjae luanxuGCI search,COMMANDdec searchmov search,#909090909090#asm search,$RESU
4、LTjmp luanxu修复后: 引用:00011278 E8 31C52800 call 0029D7AE ; 0029D7AE0001127D 90 nop0001127E 8BC0 mov eax,eax00011280 E8 E9E92700 call 0028FC6E ; 0028FC6E00011285 90 nop00011286 8BC0 mov eax,eax00011288 E8 5C333700 call 003845E9 ; 003845E90001128D 90 nop0001128E 8BC0 mov eax,eax00011290 E8 FCE02C00 call
5、 002DF391 ; 002DF39100011295 90 nop找个CALL跟跟看 有什么新花样 EIP到00011278 单步 什么都不用看 只看3条 引用:MOV EXX,ALEA EXX,EXX+BLEA EXX,EXX+C这个CALL里用到以下3条 引用:002ADE81 BD 56720500 mov ebp,57256002ADE8A 8BAD AF693000 mov ebp,dword ptr ss:ebp+3069AF0034A300 8DAD 626F45AB lea ebp,dword ptr ss:ebp+AB456F62前面2条合起来指向一个DWORD 和最后一
6、条组装成最终的函数地址 引用:A+B57256+3069AF=0035DC05=D13B2C85-记为R1R1+AB456F62=7C809BE7-指向我本机的kernel32.CloseHandleNOOBY牛的视频里 找的就是这个 视频里面最后生成的LOG文件里面 每一行的4个成员 后面2个一目了然 是真实函数以及对应的DLL 前面2个则是A+B,C了 这里VMP把A+B拆分成了A和B 使得我们难以在第一次看到A或者B时就能确定是哪个函数(关于NOOBY的VMP1.8脚本可能会另外撰文补充或者等NOOBY牛的BIN _)经过这3条之后 最终函数的真实地址保存在EXX中 这里的EXX不是固定
7、的 给通用脚本编写增加不少难度 最后保存在EXX中的函数会通过一个 引用:push dword ptr ss:esp+Dretn E结构返回真实API地址 这里的D,E也不是固定的 看完FF25后 再来看看IAT调用 一般的DELPHI程序 第一处IAT调用CALL便是这个 引用:00011430 53 push ebx00011431 83C4 BC add esp,-4400011434 BB 0A000000 mov ebx,0A00011439 54 push esp0001143A E8 260E3A00 call 003B2265 ; 003B22650001143F F64424
8、 2C 01 test byte ptr ss:esp+2C,100011444 74 05 je short 0001144B ; 0001144B00011446 0FB75C24 30 movzx ebx,word ptr ss:esp+300001144B 8BC3 mov eax,ebx0001144D 83C4 44 add esp,4400011450 5B pop ebx00011451 C3 retn0001143A处的CALL应该指向FF25型的GetStartupInfoA 然而这里指向的地址003B2265落在UPX1段 分析过程略 最终知道 VMP把它和FF25型IA
9、T用了同样的方法处理 直接指向了真实函数 这样使我们的修复工作变得很尴尬 因为IAT和IAT调用都通过CALL指向壳段 而FF25修复后占6个字节 IAT调用CALL则只占5个字节 如果不分开处理 最终会覆盖后面的一字节 而且VMP对于每一个函数 哪怕是相同的函数 都会分配不同的过程来单独处理 基于避免与VM正面对抗的想法以及前面提到的种种困难和尴尬 我只好用一种尴尬的方法来处理-"云断点"前面提到的每个函数会通过一个PUSH/RETN结构返回真实地址 于是我选择对UPX1段所有的这种结构下断 最终找到下了几百个断点 是为"云断点" 云断点: 引用:mo
10、v fi,001F3000 /001F3000为UPX0段VAloop:inc fifind fi,#FF7424?C2?00#cmp $RESULT,0je UPX1 /继续在UPX1段寻找add $RESULT,4mov fi,$RESULTwrta sFile,fi /记录wrta sFile,"rn"bp fi 下断jmp loopUPX1:cmp fi,00289000/UPX1段VAjae exitmov fi,00289000 /循环jmp loopexit:ret然后记录所有IAT和IAT调用经过这种结构的返回地址 并分别记录FF25型IAT和IAT调用的地
11、址在下断和跟踪的过程中 发现有一些指向了UPX0段 而代码段里被VM处理过的 也会指向UPX0段 为了避免与VM混淆 于是我记录下所有指向UPX0段的CALL 然后手工分离出VMCALL和IAT调用CALL 这样也给后续的修复工作提供了便利 所幸的是 这样的IAT并不多 只有十个左右记录FF25型IAT和真实函数: 引用:var fivar sFilevar tmpmov sFile,"FF25.TXT"mov fi,00011000loop:inc fifind fi,#E8?00?8BC0#/找CALL XX/ XX此处VMP随机填充的一个字节/ MOV EAX,EAX
12、结构cmp $RESULT,0je exitmov fi,$RESULTgci fi,DESTINATIONcmp $RESULT,289000jb loopcmp $RESULT,3DE000/判断目标地址是否在UPX1段jae loopwrta sFile,fi /记录IAT地址wrta sFile,"rn"mov eip,fiestomov tmp,espwrta sFile,tmp/记录真实函数地址wrta sFile,"rn"jmp loop同样方法记录IAT调用及其对应函数地址 记为zhizhen.txt .我的思路是这样的:1.首先修复FF
13、252.通过FF25指向的函数地址到IAT调用CALL对应的记录文件中查找 最后将对应的IAT调用的指针指向FF25型IAT.因为OLLYSCR中的REV指令对XX操作时,会自动过滤前面的0,只好找雪雪写了一个小工具来取反,打包在附件中。分别对FF25.TXT全部取反,对ZHIZHEN.TXT隔行取反,方便脚本的操作。保存结果为FF25.BIN和ZHIZHEN.BIN。修复FF25: 引用:var tmpvar neicunvar neicun1alloc 2000mov neicun,$RESULTlm neicun,2000,"ff25.bin"mov neicun1,
14、neicunmov tmp,neicun+4eval "jmp tmp"asm neicun,$RESULT /修复第一个loop:add neicun,8cmp neicun,0je exitmov tmp,neicun+4 /+4处为真实函数地址eval "jmp tmp"asm neicun,$RESULT /将原FF25CALL修复成JMP XXjmp loopexit:free neicun1,2000ret脚本运行完毕后 用UIF修复直接调用为FF25 记录修复后IAT的RVA修复IAT调用: 引用:var fivar searchvar s
15、trvar neicunvar neicun1mov search,00011000alloc 8000mov neicun,$RESULTlm neicun,8000,"zhizhen.bin"/载入mov neicun1,neicunloop:mov neicun,neicun1mov str,0inc searchfind search,#FF25# /在CODE段寻找FF25类IATcmp $RESULT,0je exitmov search,$RESULTcmp search+2,010E0000/010E0000为UIF修复后的IAT RVAjb loopcmp
16、 search+2,010E0800/本例中IAT大小为800jae loopGCI search,DESTINATIONmov fi,$RESULTeval "#fi#"/真实函数地址转换成查找值mov str,$RESULTfind neicun1,str,8000/在IAT调用文件中查找相同函数cmp $RESULT,0je loopmov neicun,$RESULTsub neicun,4mov tmp,neicun/指针定位到对应的IAT调用eval "call search"asm tmp,$RESULT/将IAT调用指向真实的FF25ad
17、d neicun,8/第一次修复 偷懒 直接写了个过程find:/循环修复IAT调用find neicun,str,8000cmp $RESULT,0je loopmov neicun,$RESULTsub neicun,4mov tmp,neicuneval "call search"asm tmp,$RESULTadd neicun,8jmp findexit:ret至此IAT修复完毕 找到OEP:001E4C68修复OEP: 引用:001E4C68 55 push ebp001E4C69 8BEC mov ebp,esp001E4C6B 83C4 F4 add esp
18、,-0C001E4C6E B8 A0471E00 mov eax,1E47A0001E4C73 E8 702FE3FF call 00017BE8 ; 00017BE8001E4C78 A1 84901E00 mov eax,dword ptr ds:1E9084001E4C7D 8B00 mov eax,dword ptr ds:eax001E4C7F E8 3425E8FF call 000671B8 ; 000671B8001E4C84 A1 84901E00 mov eax,dword ptr ds:1E9084001E4C89 8B00 mov eax,dword ptr ds:ea
19、x001E4C8B BA E04C1E00 mov edx,1E4CE0 ; ASCII "VMProtect"001E4C90 E8 2721E8FF call 00066DBC ; 00066DBC001E4C95 8B0D A4901E00 mov ecx,dword ptr ds:1E90A4 ; VMProted.001ED1F0001E4C9B A1 84901E00 mov eax,dword ptr ds:1E9084001E4CA0 8B00 mov eax,dword ptr ds:eax001E4CA2 8B15 B8011800 mov edx,dw
20、ord ptr ds:1801B8 ; VMProted.00180204001E4CA8 E8 2325E8FF call 000671D0 ; 000671D0001E4CAD 8B0D B08F1E00 mov ecx,dword ptr ds:1E8FB0 ; VMProted.001EDDC4001E4CB3 A1 84901E00 mov eax,dword ptr ds:1E9084001E4CB8 8B00 mov eax,dword ptr ds:eax001E4CBA 8B15 C02E1D00 mov edx,dword ptr ds:1D2EC0 ; VMProted.
21、001D2F0C001E4CC0 E8 0B25E8FF call 000671D0 ; 000671D0001E4CC5 A1 84901E00 mov eax,dword ptr ds:1E9084001E4CCA 8B00 mov eax,dword ptr ds:eax001E4CCC E8 7F25E8FF call 00067250 ; 00067250001E4CD1 E8 76F2E2FF call 00013F4C ; 00013F4C001E4CD6 0000 add byte ptr ds:eax,al001E4CD8 FFFF ? ; Unknown command00
22、1E4CDA FFFF ? ; Unknown command001E4CDC 0900 or dword ptr ds:eax,eax001E4CDE 0000 add byte ptr ds:eax,al001E4CE0 56 push esi001E4CE1 4D dec ebp001E4CE2 50 push eax001E4CE3 72 6F jb short 001E4D54 ; 001E4D54001E4CE5 74 65 je short 001E4D4C ; 001E4D4C001E4CE7 637400 00 arpl word ptr ds:eax+eax,si001E4
23、CEB 0000 add byte ptr ds:eax,al修复几处VM: 引用:00017BE8 50 push eax00017BE9 6A 00 push 000017BEB E8 F8FEFFFF call 00017AE8 ; 00017AE800017BF0 BA 08511E00 mov edx,1E510800017BF5 52 push edx00017BF6 8905 DCA41E00 mov dword ptr ds:1EA4DC,eax00017BFC 8942 04 mov dword ptr ds:edx+4,eax00017BFF C742 08 0000000
24、>mov dword ptr ds:edx+8,000017C06 C742 0C 0000000>mov dword ptr ds:edx+C,000017C0D E8 8AFFFFFF call 00017B9C ; 00017B9C00017C12 5A pop edx00017C13 58 pop eax00017C14 E8 27C2FFFF call 00013E40 ; 00013E4000017C19 C3 retn引用:00013E40 8905 ACA41E00 mov dword ptr ds:1EA4AC,eax00013E46 31C0 xor eax,e
25、ax00013E48 8905 B0A41E00 mov dword ptr ds:1EA4B0,eax00013E4E 8915 B4A41E00 mov dword ptr ds:1EA4B4,edx00013E54 8B42 04 mov eax,dword ptr ds:edx+400013E57 8905 20A01E00 mov dword ptr ds:1EA020,eax00013E5D E8 D6FEFFFF call 00013D38 ; 00013D3800013E62 C605 28A01E00 0>mov byte ptr ds:1EA028,000013E69
26、 E8 72FFFFFF call 00013DE0 ; 00013DE000013E6E C3 retn引用:00017B9C 53 push ebx00017B9D 81C4 F8FEFFFF add esp,-10800017BA3 68 05010000 push 10500017BA8 8D4424 04 lea eax,dword ptr ss:esp+400017BAC 50 push eax00017BAD A1 DCA41E00 mov eax,dword ptr ds:1EA4DC00017BB2 50 push eax00017BB3 E8 28FFFFFF call 0
27、0017AE0 ; 00017AE000017BB8 8BC4 mov eax,esp00017BBA E8 C5EDFFFF call 00016984 ; 0001698400017BBF 8BD8 mov ebx,eax00017BC1 891D 18511E00 mov dword ptr ds:1E5118,ebx00017BC7 85DB test ebx,ebx00017BC9 75 0A jnz short 00017BD5 ; 00017BD500017BCB A1 0C511E00 mov eax,dword ptr ds:1E510C00017BD0 A3 18511E0
28、0 mov dword ptr ds:1E5118,eax00017BD5 B8 08511E00 mov eax,1E510800017BDA E8 BDF0FFFF call 00016C9C ; 00016C9C00017BDF 81C4 08010000 add esp,10800017BE5 5B pop ebx00017BE6 C3 retn引用:001A5E44 55 push ebp001A5E45 8BEC mov ebp,esp001A5E47 33C9 xor ecx,ecx001A5E49 51 push ecx001A5E4A 51 push ecx001A5E4B
29、51 push ecx001A5E4C 51 push ecx001A5E4D 53 push ebx001A5E4E 8BD8 mov ebx,eax001A5E50 33C0 xor eax,eax001A5E52 55 push ebp001A5E53 68 E25F1A00 push 1A5FE2001A5E58 64:FF30 push dword ptr fs:eax001A5E5B 64:8920 mov dword ptr fs:eax,esp001A5E5E 8D55 FC lea edx,dword ptr ss:ebp-4001A5E61 8B43 58 mov eax,
30、dword ptr ds:ebx+58001A5E64 E8 1F8CE8FF call 0002EA88 ; 0002EA88001A5E69 8B55 FC mov edx,dword ptr ss:ebp-4001A5E6C 8B83 FC020000 mov eax,dword ptr ds:ebx+2FC001A5E72 8B40 58 mov eax,dword ptr ds:eax+58001A5E75 E8 268CE8FF call 0002EAA0 ; 0002EAA0001A5E7A 8B15 30921E00 mov edx,dword ptr ds:1E9230 ;
31、VMProted.001ECBB4001A5E80 8B92 94000000 mov edx,dword ptr ds:edx+94001A5E86 8BC3 mov eax,ebx001A5E88 E8 E716EAFF call 00047574 ; 00047574001A5E8D 8B15 30921E00 mov edx,dword ptr ds:1E9230 ; VMProted.001ECBB4001A5E93 8B92 68010000 mov edx,dword ptr ds:edx+168001A5E99 8B83 E8020000 mov eax,dword ptr ds:ebx+2E8001A5E9F E8 D016EAFF ca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全员B证考试考试题库往年题考附答案详解
- 一年级100之内退位减法练习题
- 安全系统人员培训课件
- 九年级物理上学期第三次月考试卷(新教材人教版)
- 针刺联合推拿治疗腰椎间盘突出症的临床疗效
- 电子商务法律法规知识自测题及参考答案详解
- 企业管理-维护申请报告模板
- 德州学院自荐模拟测试题及答案
- 2024年公务员考试福建省泉州市永春县《行政职业能力测验》最后冲刺试题含解析
- 快保车安全知识大挑战高频问题集与解答手册
- 2025年smt印刷机操作考试试题及答案
- 外部供应商绩效评估报告模板
- 期末尖子生突破卷-六年级语文上册(部编版)
- 缺铁性贫血讲解
- 一氧化碳中毒急救处理指南
- TDBC2025可信数据库发展大会:中国信通院2025上半年“可信数据库”系列标准发布及解读
- 汽车技术发展与创新应用
- 胶囊剂的制备70课件
- GB/T 2476-2025普通磨料代号
- 消防车辆安全事故课件
- 高空作业考试题目及答案
评论
0/150
提交评论