首页
社区
课程
招聘
[原创]Boilsoft Video Splitter v5.16&v5.21脱壳笔记
发表于: 2010-3-4 20:08 10914

[原创]Boilsoft Video Splitter v5.16&v5.21脱壳笔记

2010-3-4 20:08
10914

英文介绍如下:
        Boilsoft Video Splitter is a tool to split, cut or trim a large AVI, MPEG, RM, ASF, WMV, 3GP or MP4  Video file
        into smaller video clips without re-encode. video splitter software using the included video player, you can easily split
        AVI, MPEG, RM, ASF, WMV, 3GP or MP4  Video file by time or the selection as needed. Direct stream cut, without re-encode,
        it is the most efficient and fastest in the market.

      该软件功能比较强大,用来剪辑整理电影非常方便。于是想看看它是怎样编程实现的,顺手用peid查了下壳,
v5.16版本为ASProtect v1.23 RC1 *,v5.21版本为ASProtect 1.2x - 1.3x [Registered] -> Alexey Solodovnikov,
不管peid准不准,感觉是个猛壳。而我对脱壳也是一知半解,正好拿来实践一下。
    捣鼓了一下,没有什么头绪,网上搜了搜也没有介绍脱该软件的文章,绿色汉化版倒是满天飞,均是出自论坛temerata前辈之手。
    我们也不好意思到论坛求助,还是自己搞定吧。
    很奇怪,异常法不起作用(两个版本竟然都没有异常),只好手动调试跟踪,误打误撞尽然碰到了oep。
    简单总结一下找oep的方法:
    方法一:人肉法
    1、先下断点GetSystemTime,断下后执行到返回再单步一下来到
00C02771    50              PUSH EAX
00C02772    E8 01E9FFFF     CALL 00C01078    ; JMP 到 kernel32.GetSystemTime
00C02777    0FB745 F0       MOVZX EAX,WORD PTR SS:[EBP-10] // 来到这里
    2、搜索二进制串3130330D0A,来到下面:
00C3F043    FF05 00000031   INC DWORD PTR DS:[31000000]
00C3F049    3033            XOR BYTE PTR DS:[EBX],DH
00C3F04B    0D 0A000000     OR EAX,0A
00C3F050    8D00            LEA EAX,DWORD PTR DS:[EAX]    //我们关心的是这行,下硬件执行断点
00C3F052    C3              RETN
    3、SHIFT-F9后到该处,执行到返回,再单步一下来到下面:
01CE0000    81EE 8876462F   SUB ESI,2F467688
01CE0006    8BF8            MOV EDI,EAX
01CE0008    E8 07000000     CALL 01CE0014
01CE000D    A3 A0591EFF     MOV DWORD PTR DS:[FF1E59A0],EAX
       然后一直按“Trace into”就可以来到下面的oep了,这就是所谓的人肉法。
0044386A    E8 F6B50000     CALL VideoSpl.0044EE65  //oep
0044386F  ^ E9 78FEFFFF     JMP VideoSpl.004436EC
00443874    8BFF            MOV EDI,EDI

    方法二:脚本法
gpa "GetSystemTime", "kernel32.dll"
bp $RESULT
esto
bc $RESULT
rtr
sti
GMEMI eip, MEMORYOWNER
mov tmp1, $RESULT   
add tmp1, 1000
find tmp1, #3130330D0A#     //search ASCII"103"
mov tmp2, $RESULT
find tmp2, #8D00C3#        //search "lea eax,[eax]" "ret"
mov tmp1, $RESULT
bphws tmp1, "x"
eob lab0
eoe lab0
esto
lab0:
bphwc tmp1
rtr
sti
GMEMI eip, MEMORYOWNER
mov tmp1, $RESULT
eval "eip < {tmp1}"  
ticnd $RESULT  //"Trace into" 操作,直到条件为真时停止
    以上方法受volx大侠脚本的启发。
   
    在od中,查找互调调用可以看到这样的调用形式 004019F6  CALL 01D00000。必须要把它改回去,即改成如下样式:
     CALL DWORD PTR DS:[<&kernel32.SetFilePointer>]
     用脚本实现的原理就是在代码空间找CALL 01D00000这样的指令,而后借助壳的算法代码得
到真正的api地址,再根据该地址到IAT表中搜索,得到存放该api地址的内存地址,而后在原指令
的地方利用得到的这个内存地址重写该行call指令,难点就是如何利用壳的本身的call。
   
       不幸的是volx大侠的脚本虽然强大,但并不是万能的。该软件未采用vm技术但是也不能成
功。通过调试发现直接用volx的脚本脱完再修复IAT后,双击运行没有反应。最后发现原来是程序
中有几处关键跳转跳错了地方。
   我用如下脚本解决了这个问题:   
mov tmp1,imgbase
add tmp1,10000
find tmp1, #740c8d8c24f4000000#   //找修改第一处的位置   
mov tmp9, $RESULT
mov [tmp9], #75#     
find tmp1, #743be921000000#   //找修改第二处的位置   
mov tmp9, $RESULT
mov [tmp9], #75#
    最后要注意的是修复IAT后仍然有3个无效指针,这其实是壳的3个api GetRegistrationInformation    GetTrialDays   CheckKey,脱壳时重新patch代码实现。
     
   在调试过程中发现该软件最重要的call如下:
0041527F    50              PUSH EAX
00415280    51              PUSH ECX
00415281    57              PUSH EDI
00415282    56              PUSH ESI
00415283    E8 76830000     CALL VideoSpl.0041D5FE   ; JMP 到 OFFSET rmutil.#2
就是RMUtil.dll中的#2号功能调用,入口参数是要剪切的文件的path、剪切得到的文件保存的path、以及剪切的起始、结束时间。有了这个call,其实我们自己也可以写个这样功能的小软件。
   脱壳后简单修改了一下,截图一张以作留念。附件含脱壳脚本以及脱壳后程序。将该程序放在安装目录中就可以运行。

   
                                                        天易love
  2010-03-04


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
彪悍。支持~~~~~~
2010-3-8 18:03
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这正是我想要的文章!~~万分感谢!
2010-3-8 18:13
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
very good,佩服之至。
2010-3-8 20:39
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
5
脱壳就是打基础,壳都脱不了会很郁闷的。
2010-3-8 21:08
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是啊,不会脱壳很郁闷
2010-3-8 21:22
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
手动脱壳,还能写脚本。一个字,牛
2010-3-13 21:42
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
嗯。楼主很强大。
2010-3-18 20:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
怎么没有顺手汉化一下啊!楼主
2010-4-3 16:07
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
10
我不喜欢用汉化软件,那几个单词还是能看懂的,再说已经有人汉化过了。
2010-4-3 19:48
0
雪    币: 34
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主可以搞个6.0的注册码吗???
2010-7-3 14:17
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
12
老版本能用就行了,没时间破解新版。
2010-7-3 21:53
0
雪    币: 34
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
老版本有BUG啊 截取的画面和实际 设定的画面不一致
2010-7-6 17:06
0
雪    币: 222
活跃值: (1915)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
偶遇与此类似壳,研究中,虽暂无结果,但从楼主的经验之谈,获益非浅。
2010-11-23 11:43
0
雪    币: 41
活跃值: (490)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你的每篇发帖我都看过,每次都来看你的帖子都能学到好多东西,谢谢说得太多了。楼主的主题几乎都是关注和精华,膜拜
2010-11-23 18:51
0
游客
登录 | 注册 方可回帖
返回
//