首页
社区
课程
招聘
[原创]swf格式在线课程破解往事
发表于: 2009-1-25 21:39 13489

[原创]swf格式在线课程破解往事

2009-1-25 21:39
13489
一个小程序,现在拿出来与大家分享,希望认识更多的朋友。
   那还是05年的事,为了让女友在网上购买的盗版光盘不至于扔掉,苦于网上无现成工具,遂决心破解。光盘内容是“新东方教育在线”的课程,

均为swf格式。有部份文件,在播放过程中自动返回初始位置。例如暴风影音也是如此。很是郁闷,心想必定是flash中的脚本在作祟。于是在网上

搜到一款叫作“硕思闪客”的软件,用它打开问题文件如下图所示:

其中看到一段代码:
onClipEvent (load)
{
    function vv()
    {
        trace("interval called");
        view = _url.substr(0, 4);
        allURL = _url.substr(0, 60);
        status = allURL.indexOf("tol24.com");
        if (view != "http" || status == -1)
        {
            _root.gotoAndStop(1);
        }  
    }  
    setInterval(vv, 10000);
}
显然是每隔10秒调用一次函数vv();该函数判断如果当前网址不是以http开头且长度为60个字符的网址中不含tol24.com字符串就自动跳回第一帧,停止播放。原因找到了,现在就是要让这段脚本不执行。用winhex打开文件,搜索setInterval,只出现3处,嫌疑最大的一处如下图。


这里可能就是setInterval(vv, 10000);函数语句所在处,能否破坏掉此处代码?遂将76 76 00 73 65 74 49 6E 74 65 72 76 61 6C 中的第一个76改为00,播放问题解决。
但是新东方教育在线的课程多种多样,存在问题的swf文件多如牛毛,况且并不是所有文件都存在以上问题。必须用程序来解决。为了追求处理速度,遂用汇编语言捣鼓了几天,小有所成。程序应用界面如下:


大致功能就是浏览“新东方教育在线”课程所在的文件夹,点击开始即可告诉你该文件夹中是否有功能限制的swf文件,如果有就进行处理。处理一张cd光盘也就10来秒钟,就连女友这种电脑“小白”也是运用自如。

以下是完整代码供大家分享:
.386
.model flat, stdcall
option casemap :none
include        windows.inc
include        user32.inc
includelib        user32.lib
include         kernel32.inc
includelib        kernel32.lib
include         ole32.inc
includelib        ole32.lib
include         shell32.inc
includelib        shell32.lib
search_data proto :DWORD,:DWORD, :DWORD,:DWORD
check_swf  proto :DWORD

ICO_MAIN        equ                1000
DLG_MAIN        equ                100
IDC_PATH                        equ                        101
IDC_BROWSE        equ                102
IDC_NOWFILE        equ                103
IDC_LISTBOX1         equ                       104
F_SEARCHING        equ                       0001h
F_STOP                equ                       0002h

    .data?
hInstance        dd        ?
dwFileCount        dd        ?
szPath                db        MAX_PATH dup (?)
dwOption        db        ?

      .data
hMapping dd ?
pMapView dd ?
hFile    dd ?
len      dd ?
hWinMain dd ?

     .const
szStart                db        '开始(&S)',0
szStop                db        '停止(&S)',0
szFilter                        db        '*.swf',0
szSearchInfo        db        '共处理 %d 个SWF文件!',0
searchdata  db 76h,76h,00,73h,65h,74h
szClear   db 10h dup (0)               
     .code
include                _BrowseFolder.asm

_FindFile        proc        _lpszPath
    local        @stFindFile:WIN32_FIND_DATA
   local        @hFindFile
   local        @szPath[MAX_PATH]:byte                ;用来存放“路径\”
  local        @szSearch[MAX_PATH]:byte        ;用来存放“路径\*.*”
  local        @szFindFile[MAX_PATH]:byte        ;用来存放“路径\找到的文件”

                pushad
                invoke        lstrcpy,addr @szPath,_lpszPath
                @@:
                invoke        lstrlen,addr @szPath
                lea        esi,@szPath
                add        esi,eax
                xor        eax,eax
                mov        al,'\'
                .if        byte ptr [esi-1] != al
                        mov        word ptr [esi],ax
                .endif
                invoke        lstrcpy,addr @szSearch,addr @szPath
                invoke        lstrcat,addr @szSearch,addr szFilter
                invoke        FindFirstFile,addr @szSearch,addr @stFindFile
                .if        eax !=        INVALID_HANDLE_VALUE
                        mov        @hFindFile,eax
                        .repeat
                invoke        lstrcpy,addr @szFindFile,addr @szPath
                invoke        lstrcat,addr @szFindFile,addr @stFindFile.cFileName
                        .if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
                                    .if       @stFindFile.cFileName != '.'
                                            invoke  _FindFile,addr @szFindFile
                          .endif
                         .else  ;是文件就处理
                      invoke check_swf,addr @szFindFile;
              inc        dwFileCount
                      ; invoke        SendDlgItemMessage,hWinMain,IDC_LISTBOX1,LB_ADDSTRING,0,addr @szFindFile
                 .endif
         invoke        FindNextFile,@hFindFile,addr @stFindFile
                        .until        (eax ==        FALSE) || (dwOption & F_STOP)
                        invoke        FindClose,@hFindFile
                .endif
                popad
                ret

_FindFile        endp

_ProcThread        proc        uses ebx ecx edx esi edi,lParam
                local        @szBuffer[256]:byte
                and        dwOption,not F_STOP
                or        dwOption,F_SEARCHING
                invoke        GetDlgItem,hWinMain,IDC_PATH
                invoke        EnableWindow,eax,FALSE
                invoke        GetDlgItem,hWinMain,IDC_BROWSE
                invoke        EnableWindow,eax,FALSE
                invoke        SetDlgItemText,hWinMain,IDOK,addr szStop
                xor        eax,eax
                mov        dwFileCount,eax ;初始化记数变量
                invoke        _FindFile,addr szPath
                ;文件查找完后显示查找结果
               
                invoke        GetDlgItem,hWinMain,IDC_BROWSE
                invoke        EnableWindow,eax,FALSE
                invoke        wsprintf,addr @szBuffer,addr szSearchInfo,dwFileCount
                invoke        SetDlgItemText,hWinMain,IDC_NOWFILE,addr @szBuffer
                invoke        GetDlgItem,hWinMain,IDOK
                invoke        EnableWindow,eax,FALSE               
                invoke        GetDlgItem,hWinMain,IDC_BROWSE
                invoke        EnableWindow,eax,TRUE
                 invoke        SetDlgItemText,hWinMain,IDOK,addr szStart
                and        dwOption,not F_SEARCHING
                ret
_ProcThread        endp

_ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam
                local        @dwTemp,@szBuffer[MAX_PATH]:byte

                mov        eax,wMsg
                .if        eax ==        WM_CLOSE
                        .if        ! (dwOption & F_SEARCHING)
                                invoke        EndDialog,hWnd,NULL
                        .endif

                .elseif        eax ==        WM_INITDIALOG
                        push        hWnd
                        pop        hWinMain
                        invoke        LoadIcon,hInstance,ICO_MAIN
                        invoke        SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
                        invoke        SendDlgItemMessage,hWnd,IDC_PATH,EM_SETLIMITTEXT,MAX_PATH,0

                .elseif        eax ==        WM_COMMAND
                        mov        eax,wParam
                        .if        ax ==        IDC_BROWSE
                                invoke        SetDlgItemText,hWinMain,IDC_NOWFILE,addr szClear
                                invoke        _BrowseFolder,hWnd,addr szPath   
                                .if        eax
                                        invoke        SetDlgItemText,hWnd,IDC_PATH,addr szPath
                                .endif
                        .elseif        ax ==        IDC_PATH
                                invoke        GetDlgItemText,hWnd,IDC_PATH,addr @szBuffer,MAX_PATH
                                mov        ebx,eax
                                invoke        GetDlgItem,hWnd,IDOK
                                invoke        EnableWindow,eax,ebx
                        .elseif        ax ==        IDOK
                                .if        dwOption & F_SEARCHING
                                        or        dwOption,F_STOP
                                .else
                                        invoke        GetDlgItemText,hWnd,IDC_PATH,addr szPath,MAX_PATH
                                        invoke        CreateThread,NULL,0,offset _ProcThread,NULL,\
                                                NULL,addr @dwTemp
                                        invoke        CloseHandle,eax
                                .endif
                        .endif
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

_ProcDlgMain        endp

start:
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
                invoke        ExitProcess,NULL

search_data proc Base:DWORD,ToltalLen:DWORD ,mydata:DWORD ,mydatalen:DWORD
LOCAL position: DWORD
  mov edi,Base
  mov position,edi
  mov esi,mydata
  xor ecx,ecx
  xor edx,edx
  mov ecx,mydatalen
  mov edx,ToltalLen
  xor eax,eax

Match_data:
  mov bl,byte ptr [esi] ;要找的字节
  mov bh,byte ptr [edi]
  inc esi
  inc edi
  cmp bl,bh
  jz judge
  inc eax
  mov ecx,mydatalen
  cmp eax,ToltalLen
  jz no_exist
   mov position,eax   ;注意edi的记数
   add eax,Base
  mov edi,eax
  mov eax,position
  mov esi,mydata
  jmp Match_data
judge:
     dec ecx
          cmp ecx,0
          jnz Match_data
foundit:
  sub edi,6h   
  mov eax, edi
  ret
no_exist:
  xor eax,eax
  ret
search_data endp

check_swf proc file:DWORD     
         invoke CreateFile,file,
                      GENERIC_READ+GENERIC_WRITE,
                      FILE_SHARE_READ,
                      NULL,OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      NULL
   mov hFile, eax
        cmp  eax,INVALID_HANDLE_VALUE
        jz   Error
        invoke GetFileSize,hFile,NULL
   mov len, eax
        invoke CreateFileMappingA,hFile,NULL,PAGE_READWRITE,0,len,NULL
        mov  hMapping,eax
        cmp  eax,NULL
        jz   Error
        invoke MapViewOfFile,hMapping,FILE_MAP_ALL_ACCESS,0,0,len
        cmp  eax,NULL
        jz   Error
        mov  pMapView,eax
        push 6h
        push offset searchdata
   push len
        push eax
        call search_data  
        cmp  eax,0
        jz   Error  
        mov  esi,eax
        mov  word ptr [esi],00h
        inc        dwFileCount
        invoke        SendDlgItemMessage,hWinMain,IDC_LISTBOX1,LB_ADDSTRING,0,file       
Error:       
        invoke UnmapViewOfFile,pMapView         
        invoke CloseHandle,hMapping                 
        invoke CloseHandle,hFile
        ret   
check_swf endp               
    end         start
  
  新年祝看雪论坛高手越来越多!大家共同进步。下附程序和测试swf文件 tougao.part1.rar
tougao.part2.rar

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习 谢谢!!
2009-1-25 21:47
0
雪    币: 590
活跃值: (177)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=;]...[/QUOTE]
swf文件限制的解除文章并不多见,也许是因为其可以直接看到源码吧  多谢楼主分享经历,还有源码,留给我这样的新手参考
2009-1-28 20:52
0
雪    币: 177
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很有启发
LZ的汇编编写能力也很强大
学习下
2009-1-29 13:32
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
5
楼主可以用ultraedit的批量替换功能
2009-1-29 17:02
0
雪    币: 306
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
厚厚.我也写过.曾经在看雪贴过.好像叫 HexReplace.
http://zhupf.ys168.com/
我网盘还有.我增加了些功能,Flash压缩解压等等乱七八糟的功能.
我好像是07年写的,flash教程的保护好像也增加了些.
2009-1-30 16:45
0
雪    币: 12502
活跃值: (3048)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
才想起来天易love原来是撸flash的那个。。
2019-12-23 11:10
0
游客
登录 | 注册 方可回帖
返回
//