[软件信息]: **网络电视 2009
[加壳信息]: nSPack 3.7 -> North Star/Liu Xing Ping
[所需工具]: OD, PEid, LoadPE, Import REC
常规操作, 第一步, 查壳
PEid 查一下壳, 显示nSPack 3.7 -> North Star/Liu Xing Ping
也不知道这是什么壳, 没脱过,
第二步, OD载入, 断在这里
006596DC T> 9C pushfd //保存环境
006596DD 60 pushad //再次保存环境
006596DE E8 00000000 call TTVideo.006596E3
006596E3 5D pop ebp
006596E4 83ED 07 sub ebp,7
006596E7 8D8D A0F9FFFF lea ecx,dword ptr ss:[ebp-660]
006596ED 8039 01 cmp byte ptr ds:[ecx],1
006596F0 0F84 42020000 je TTVideo.00659938
看看上面, 有一个pushfd, 和一个pushad, 很明显进行了两次压栈操作, 我们打开记事本准备记录
按F8步过, 此时ESP变成了红色, 值为0012FFC0, 用记本事记来来, 待会要用到
按F8步过, 此时ESP的值变了, 值为0012FFA0, 记事本记来
开始使用ESP定律了, 输入hr 0012FFA0, 这个值就是上面记来的那个esp值了
F9运行, 断下了
0065994D 9D popfd //进行出栈操作
0065994E - E9 55B5F4FF jmp TTVideo.005A4EA8
00659953 8BB5 2CF9FFFF mov esi,dword ptr ss:[ebp-6D4]
00659959 0BF6 or esi,esi
0065995B 0F84 97000000 je TTVideo.006599F8
00659961 8B95 34F9FFFF mov edx,dword ptr ss:[ebp-6CC]
不管它, 再下个断点, hr 0012FFC0 刚用记事本记下了
F9运行, 断下了
005A4EA8 55 push ebp
005A4EA9 8BEC mov ebp,esp //停在这里
005A4EAB 83C4 F0 add esp,-10
005A4EAE 53 push ebx
005A4EAF 56 push esi
005A4EB0 57 push edi
005A4EB1 B8 10375A00 mov eax,TTVideo.005A3710
看一下, 到入口点了, 入口点为005A4EA8 - 基址00400000 = 偏移地址001A4EA8
拿到入口点, 就dump吧, 打开LoadPE => 完整脱壳
打开Import REC 修复一下输入表
输入OEP为刚找到的地址001A4EA8, 自动查找IAT -> 获取输入表
检查一下有没无效的函数, 全部有效, OK 转存
再用PE查一下, 显示为Borland Delphi 6.0 - 7.0
运行正常, 脱壳成功。
注一下, 根据堆栈后进先出的原理, 第一个pushfd, 第二个pushad
所在出栈的时候, 是第二个pushad先出栈, 然后第一个pushfd才出栈
这就是为什么第一个的ESP 为0012FFC0, 第二个ESP 为0012FFA0
我们要先设断第二个0012FFA0, 再设断第一个0012FFC0的原因。
一起学习, 一起成长, 把你的每一点发现, 跟大家一起分享!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)