2006年07月05日

[ZZ]超星中的GPL代码

原文参见b13朋友post在本站的回复
http://sitaphi.com/mt/mt-comments.cgi?entry_id=12

注:文章不代表本站观点。另,这个发现可能解释了05H的的PDG文件的来源问题。

超星涉嫌非法使用GPL代码,又一个“自主知识产权”的典范

作者:B13
本文欢迎转载


超星阅读器中涉嫌非法使用开源图形库DjVuLibre ( http://djvulibre.djvuzone.org/ )。DjVuLibre提供了高效的图像压缩格式DjVu格式的编码和解码功能。DjVuLibre的使用授权为GPL(GNU General Public License: http://www.thebigfly.com/gnu/gpl/ ),按照GPL的要求,凡是使用该软件的代码也需要开放原代码,而超星浏览器公然违反了这个授权,不但没有开放原代码,而且利用自由软件牟利。

验证超星中包含了DjVuLibre过程很简单,首先到超星主页下载最新的超星阅读器(http://www.ssreader.com/download/) 并安装。同时到
http://www.heaventools.com/download/pexsetup.exe
下载PE Explorer的试用版。安装并启动PE Explorer,在弹出的窗口中选择File(文件)\Open File(打开文件),然后浏览你的windows目录(C:\Windows)下的system32子目录下的pdg2.dll,程序会提示你是否继续,选择Continue(继续)。载入后,选择Tools(工具)菜单下的Disassembler(反汇编),然后选择Start Now(开始),PE Explorer会将程序转换为汇编代码,按Ctrl+F,查找djvu,你就会发现程序的汇编代码中有很多包含djvudocument类的字符串,而你google一下这些含有djvu的串,你就会发现他们无一例外的来自开源软件Djvulibre。包含Djvu关键字的串参见附件。

超星这种无视开源软件授权的做法是对软件作者劳动的践踏。作为国内最大的电子图书制作商,在以盈利性质的软件中使用专利图像格式djvu和开源软件无疑都是非常不明智的做法,蕴含了巨大的法律风险。

有趣的是,在超星的软件下载主页上,我们又一次看到了熟悉的“自主知识产权”字样,我们曾经在一度沸沸扬扬,最后被证实为造假的“汉芯"的宣传材料中看到过,我们也曾经在花费了8000万纳税人的税收,但后来被发现大规模抄袭FreeBSD的“麒麟操作系统”的宣传材料中看到过这个名词。而非常不幸的是这次这个名词出现的地方又一次让我们失望了。从一开始使用产生80年代产生的TIFF G4压缩格式,到后来简单更改GIF/JPEG格式后缀,到现在剽窃开源软件,使得我们一次又一次地认识到超星不但是一个没有任何技术创新能力的公司,而且商业诚信也让人怀疑。

超星中包含的GPL代码已经反馈给自由软件基金会(FSF),我们期望国内的信息产业公司遵守游戏规则,珍重自己的诚信。

下面是含有djvu字样的汇编行:

push SSZ100F0648_DjVuPort
push SSZ100F0674_DjVuDocument__start_init____init
push SSZ100F0664_document_djvu
push SSZ100F06A8_DjVuFile
push SSZ100F06EC_DjVuDocument_init_eof
push SSZ100F06D4_DjVuDocument_stopped
push SSZ100F0888_DjVuDocument__init_thread____gue
push SSZ100F0808_FORM_DJVU
push SSZ100F07A4_Got_DJVU_OLD_INDEXED_or_SINGLE_P
push SSZ100F08E0_DjVuDocument__set_file_aliases__
push SSZ100F0978_DjVuDocument__check_unnamed_file
push SSZ100F0958_DjVuDocument_miss_page_name_
push SSZ100F093C_DjVuDocument_miss_page_num_
push SSZ100F09BC_DjVuDocument__page_to_url____pag
push SSZ100F09E4_DjVuDocument__url_to_page____url
push SSZ100F0A08_DjVuDocument__id_to_url____trans
push SSZ100F0AB4_DjVuDocument__url_to_file____url
push SSZ100F06A8_DjVuFile
push SSZ100F06A8_DjVuFile
push SSZ100F0A58_found_internal_file_using_DjVuPo
push SSZ100F0AD8_DjVuSimplePort
push SSZ100F0648_DjVuPort
push SSZ100F0B60_DjVuDocument__get_djvu_file____r
push SSZ100F06A8_DjVuFile
push SSZ100F0AE8__djvu
push SSZ100F0B94_djvufileurl____p__s
push SSZ100F0BB8_DjVuDocument__get_djvu_file____I
push SSZ100F0BDC_DjVuDocument
push SSZ100F0648_DjVuPort
push SSZ100F0BEC_DjVuDocument__get_djvu_file____U
push SSZ100F0C14_DjVuDocument__get_page____reques
push SSZ100F0C60_DjVuDocument_cant_extract_
push SSZ100F0C90_DjVuDocument__get_thumbnail____p
push SSZ100F0CBC_DjVuDocument__add_to_cache____ur
push SSZ100F0DB0_DjVuDocument__request_data____se
push SSZ100F0D54_Found_tmp_unnamed_DjVuFile__Retu
push SSZ100F0EC0_DjVuDocument__get_djvm_doc____cr
push SSZ100F0EFC_DjVuDocument__write____storing_D
push SSZ100F0EFC_DjVuDocument__write____storing_D
push SSZ100F0F34_DjVuDocument__expand____codebase
push SSZ100F0F58_DjVuDocument__save_as____where__
push SSZ100F184C_DjVuFile__init____url__
push SSZ100F182C_DjVuFile__DjVuFile____url_is_
push SSZ100F1864_DjVuFile___DjVuFile____destroyin
push SSZ100F188C_DjVuFile__wait_for_chunk___calle
push SSZ100F18D0_DjVuFile__wait_for_finish_____se
push SSZ100F19DC_DjVuFile__decode_func___called__
push SSZ100F1974_DjVuFile_stopped_
push SSZ100F1960_DjVuFile_failed_
push SSZ100F1A10_DjVuFile__process_incl_chunk____
push SSZ100F1A4C_DjVuFile_EOF_
push SSZ100F1A7C_DjVuFile__process_incl_chunks_vo
push SSZ100F1D7C_DjVuFile__decode_chunk___
push SSZ100F1D64_DjVuFile_unrecog_chunk
push SSZ100F1D3C_DjVuFile__decode_chunk_____decod
push SSZ100F1D28_DjVuFile_page_info
push SSZ100F1D10_DjVuFile_indir_chunk1_
push SSZ100F1CF8_DjVuFile_indir_chunk2
push SSZ100F1CD8_DjVuFile_shape_dict__d
push SSZ100F1CB4_DjVuFile_fg_mask__d__d__d
push SSZ100F1C98_DjVuFile_G4_mask__d__d__d
push SSZ100F1C74_DjVuFile_IW44_bg1__d__d__d
push SSZ100F1C5C_DjVuFile_IW44_bg2__d__d
push SSZ100F1C38_DjVuFile_IW44_fg__d__d__d
push SSZ100F1C10_DjVuFile_color_import1__d__d__d
push SSZ100F1BF8_DjVuFile_color_import2
push SSZ100F1BDC_DjVuFile_JPEG_bg1__d__d__d
push SSZ100F1BB8_DjVuFile_JPEG_fg1__d__d__d
push SSZ100F1B9C_DjVuFile_JPEG2K_bg
push SSZ100F1B80_DjVuFile_JPEG2K_fg
push SSZ100F1B60_DjVuFile_JB2_fg__d__d
push SSZ100F1B30_DjVuFile_IW44_data1__d__d__d
push SSZ100F1B14_DjVuFile_IW44_data2__d__d
push SSZ100F1B00_DjVuFile_nav_dir
push SSZ100F1AE4_DjVuFile_anno1
push SSZ100F1AC4_DjVuFile_anno2
push SSZ100F1AA4_DjVuFile_text
push SSZ100F1E30_DjVuFile__decode____url__
push SSZ100F0808_FORM_DJVU
push SSZ100F1E04_image_x_djvu
push SSZ100F1DD8_DjVuFile_IW44_header__d__d__d
push SSZ100F1DB4_DjVuFile_djvu_header__d__d__d__d
push SSZ100F1D98_DjVuFile_ratio__0_1f__0_1f
push SSZ100F06A8_DjVuFile
push SSZ100F0648_DjVuPort
push SSZ100F1E4C_DjVuFile__start_decode____url__
push SSZ100F1E6C_DjVuFile__stop_decode____url__
push SSZ100F1E98_DjVuFile__stop____Stopping_every
push SSZ100F1EC0_DjVuFile__decode_ndir____decodin
push SSZ100F06A8_DjVuFile
push SSZ100F1F20_DjVuFile__trigger_cb____got_data
push SSZ100F1EF0_DjVuFile__trigger_cb____We_have_
push SSZ100F1F80_DjVuFile__progress_cb___called_
push SSZ100F1FA0_DjVuFile__move____dir_url__
push SSZ100F1FBC_DjVuFile__set_name____name__
push SSZ100F1FDC_DjVuFile__contains_chunk____url_
push SSZ100F2010_DjVuFile__get_djvu_bytestream___
push SSZ100F204C_DjVuFile__unlink_file___
push SSZ100F2068_DjVuFile__insert_file____id__
push SSZ100F3BA0_DjVuFileCache__add_file____tryin
push SSZ100F3BF4_DjVuFileCache__clear_to_size____
push SSZ100D8794____Unrecognized_DjVu_Message____
SSZ100D8794____Unrecognized_DjVu_Message____:
db '** Unrecognized DjVu Message:',0Ah,09h,'** Message name: %1!s!',0
SSZ100F0648_DjVuPort:
db 'DjVuPort',0
SSZ100F0664_document_djvu:
db 'document.djvu',0
SSZ100F0674_DjVuDocument__start_init____init:
db 'DjVuDocument::start_init(): initializing class...',0Ah,0
SSZ100F06A8_DjVuFile:
db 'DjVuFile',0
SSZ100F06D4_DjVuDocument_stopped:
db 'DjVuDocument.stopped',0
SSZ100F06EC_DjVuDocument_init_eof:
db 'DjVuDocument.init_eof',0
SSZ100F07A4_Got_DJVU_OLD_INDEXED_or_SINGLE_P:
db 'Got DJVU OLD_INDEXED or SINGLE_PAGE document here.',0Ah,0
SSZ100F0808_FORM_DJVU:
db 'FORM:DJVU',0
SSZ100F0888_DjVuDocument__init_thread____gue:
db 'DjVuDocument::init_thread(): guessing what we',27h,'re dealing with',0Ah,0
SSZ100F08E0_DjVuDocument__set_file_aliases__:
db 'DjVuDocument::set_file_aliases(): setting global aliases for file ',27h,0
SSZ100F093C_DjVuDocument_miss_page_num_:
db 'DjVuDocument.miss_page_num',09h,0
SSZ100F0958_DjVuDocument_miss_page_name_:
db 'DjVuDocument.miss_page_name',09h,0
SSZ100F0978_DjVuDocument__check_unnamed_file:
db 'DjVuDocument::check_unnamed_files(): Seeing if we can fix some...',0Ah,0
SSZ100F09BC_DjVuDocument__page_to_url____pag:
db 'DjVuDocument::page_to_url(): page_num=',0
SSZ100F09E4_DjVuDocument__url_to_page____url:
db 'DjVuDocument::url_to_page(): url=',27h,0
SSZ100F0A08_DjVuDocument__id_to_url____trans:
db 'DjVuDocument::id_to_url(): translating ID=',27h,0
SSZ100F0A58_found_internal_file_using_DjVuPo:
db 'found internal file using DjVuPortcaster',0Ah,0
db 'found fully decoded file using DjVuPortcaster',0Ah,0
SSZ100F0AB4_DjVuDocument__url_to_file____url:
db 'DjVuDocument::url_to_file(): url=',27h,0
SSZ100F0AD8_DjVuSimplePort:
db 'DjVuSimplePort',0
SSZ100F0AE8__djvu:
db '.djvu',0
SSZ100F0B60_DjVuDocument__get_djvu_file____r:
db 'DjVuDocument::get_djvu_file(): request for page ',0
SSZ100F0B94_djvufileurl____p__s:
db 'djvufileurl://%p/%s',0
SSZ100F0BB8_DjVuDocument__get_djvu_file____I:
db 'DjVuDocument::get_djvu_file(): ID=',27h,0
SSZ100F0BDC_DjVuDocument:
db 'DjVuDocument',0
SSZ100F0BEC_DjVuDocument__get_djvu_file____U:
db 'DjVuDocument::get_djvu_file(): URL=',27h,0
SSZ100F0C14_DjVuDocument__get_page____reques:
db 'DjVuDocument::get_page(): request for page ',0
SSZ100F0C60_DjVuDocument_cant_extract_:
db 'DjVuDocument.cant_extract',0Ah,0
SSZ100F0C90_DjVuDocument__get_thumbnail____p:
db 'DjVuDocument::get_thumbnail(): page_num=',0
SSZ100F0CBC_DjVuDocument__add_to_cache____ur:
db 'DjVuDocument::add_to_cache(): url=',27h,0
SSZ100F0D54_Found_tmp_unnamed_DjVuFile__Retu:
db 'Found tmp unnamed DjVuFile. Return empty DataPool',0Ah,0
SSZ100F0DB0_DjVuDocument__request_data____se:
db 'DjVuDocument::request_data(): seeing if we can do it',0Ah,0
SSZ100F0EC0_DjVuDocument__get_djvm_doc____cr:
db 'DjVuDocument::get_djvm_doc(): creating the DjVmDoc',0Ah,0
SSZ100F0EFC_DjVuDocument__write____storing_D:
db 'DjVuDocument::write(): storing DjVmDoc into ByteStream',0Ah,0
SSZ100F0F34_DjVuDocument__expand____codebase:
db 'DjVuDocument::expand(): codebase=',27h,0
SSZ100F0F58_DjVuDocument__save_as____where__:
db 'DjVuDocument::save_as(): where=',27h,0
SSZ100F182C_DjVuFile__DjVuFile____url_is_:
db 'DjVuFile::DjVuFile(): url is ',0
SSZ100F184C_DjVuFile__init____url__:
db 'DjVuFile::init(): url=',27h,0
SSZ100F1864_DjVuFile___DjVuFile____destroyin:
db 'DjVuFile::~DjVuFile(): destroying...',0Ah,0
SSZ100F188C_DjVuFile__wait_for_chunk___calle:
db 'DjVuFile::wait_for_chunk() called',0Ah,0
SSZ100F18D0_DjVuFile__wait_for_finish_____se:
db 'DjVuFile::wait_for_finish(): self=',0
SSZ100F1960_DjVuFile_failed_:
db 'DjVuFile.failed',09h,0
SSZ100F1974_DjVuFile_stopped_:
db 'DjVuFile.stopped',09h,0
SSZ100F19DC_DjVuFile__decode_func___called__:
db 'DjVuFile::decode_func() called, url=',27h,0
SSZ100F1A10_DjVuFile__process_incl_chunk____:
db 'DjVuFile::process_incl_chunk(): processing INCL chunk...',0Ah,0
SSZ100F1A4C_DjVuFile_EOF_:
db 'DjVuFile.EOF',09h,0
SSZ100F1A7C_DjVuFile__process_incl_chunks_vo:
db 'DjVuFile::process_incl_chunks(void)',0Ah,0
SSZ100F1AA4_DjVuFile_text:
db 'DjVuFile.text',0
SSZ100F1AC4_DjVuFile_anno2:
db 'DjVuFile.anno2',0
SSZ100F1AE4_DjVuFile_anno1:
db 'DjVuFile.anno1',0
SSZ100F1B00_DjVuFile_nav_dir:
db 'DjVuFile.nav_dir',0
SSZ100F1B14_DjVuFile_IW44_data2__d__d:
db 'DjVuFile.IW44_data2',09h,'%d',09h,'%d',0
SSZ100F1B30_DjVuFile_IW44_data1__d__d__d:
db 'DjVuFile.IW44_data1',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1B60_DjVuFile_JB2_fg__d__d:
db 'DjVuFile.JB2_fg',09h,'%d',09h,'%d',0
SSZ100F1B80_DjVuFile_JPEG2K_fg:
db 'DjVuFile.JPEG2K_fg',0
SSZ100F1B9C_DjVuFile_JPEG2K_bg:
db 'DjVuFile.JPEG2K_bg',0
SSZ100F1BB8_DjVuFile_JPEG_fg1__d__d__d:
db 'DjVuFile.JPEG_fg1',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1BDC_DjVuFile_JPEG_bg1__d__d__d:
db 'DjVuFile.JPEG_bg1',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1BF8_DjVuFile_color_import2:
db 'DjVuFile.color_import2',0
SSZ100F1C10_DjVuFile_color_import1__d__d__d:
db 'DjVuFile.color_import1',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1C38_DjVuFile_IW44_fg__d__d__d:
db 'DjVuFile.IW44_fg',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1C5C_DjVuFile_IW44_bg2__d__d:
db 'DjVuFile.IW44_bg2',09h,'%d',09h,'%d',0
SSZ100F1C74_DjVuFile_IW44_bg1__d__d__d:
db 'DjVuFile.IW44_bg1',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1C98_DjVuFile_G4_mask__d__d__d:
db 'DjVuFile.G4_mask',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1CB4_DjVuFile_fg_mask__d__d__d:
db 'DjVuFile.fg_mask',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1CD8_DjVuFile_shape_dict__d:
db 'DjVuFile.shape_dict',09h,'%d',0
SSZ100F1CF8_DjVuFile_indir_chunk2:
db 'DjVuFile.indir_chunk2',0
SSZ100F1D10_DjVuFile_indir_chunk1_:
db 'DjVuFile.indir_chunk1',09h,0
SSZ100F1D28_DjVuFile_page_info:
db 'DjVuFile.page_info',0
SSZ100F1D3C_DjVuFile__decode_chunk_____decod:
db 'DjVuFile::decode_chunk() : decoding ',0
SSZ100F1D64_DjVuFile_unrecog_chunk:
db 'DjVuFile.unrecog_chunk',0
SSZ100F1D7C_DjVuFile__decode_chunk___:
db 'DjVuFile::decode_chunk()',0Ah,0
SSZ100F1D98_DjVuFile_ratio__0_1f__0_1f:
db 'DjVuFile.ratio',09h,'%0.1f',09h,'%0.1f',0
SSZ100F1DB4_DjVuFile_djvu_header__d__d__d__d:
db 'DjVuFile.djvu_header',09h,'%d',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1DD8_DjVuFile_IW44_header__d__d__d:
db 'DjVuFile.IW44_header',09h,'%d',09h,'%d',09h,'%d',0
SSZ100F1E04_image_x_djvu:
db 'image/x.djvu',0
SSZ100F1E30_DjVuFile__decode____url__:
db 'DjVuFile::decode(), url=',27h,0
SSZ100F1E4C_DjVuFile__start_decode____url__:
db 'DjVuFile::start_decode(), url=',27h,0
SSZ100F1E6C_DjVuFile__stop_decode____url__:
db 'DjVuFile::stop_decode(), url=',27h,0
SSZ100F1E98_DjVuFile__stop____Stopping_every:
db 'DjVuFile::stop(): Stopping everything',0Ah,0
SSZ100F1EC0_DjVuFile__decode_ndir____decodin:
db 'DjVuFile::decode_ndir(): decoding for NDIR in ',27h,0
SSZ100F1EF0_DjVuFile__trigger_cb____We_have_:
db 'DjVuFile::trigger_cb(): We have ALL data for ',27h,0
SSZ100F1F20_DjVuFile__trigger_cb____got_data:
db 'DjVuFile::trigger_cb(): got data for ',27h,0
SSZ100F1F80_DjVuFile__progress_cb___called_:
db 'DjVuFile::progress_cb() called',0Ah,0
SSZ100F1FA0_DjVuFile__move____dir_url__:
db 'DjVuFile::move(): dir_url=',27h,0
SSZ100F1FBC_DjVuFile__set_name____name__:
db 'DjVuFile::set_name(): name=',27h,0
SSZ100F1FDC_DjVuFile__contains_chunk____url_:
db 'DjVuFile::contains_chunk(): url=',27h,0
SSZ100F2010_DjVuFile__get_djvu_bytestream___:
db 'DjVuFile::get_djvu_bytestream(): creating DjVu raw file',0Ah,0
SSZ100F204C_DjVuFile__unlink_file___:
db 'DjVuFile::unlink_file()',0Ah,0
SSZ100F2068_DjVuFile__insert_file____id__:
db 'DjVuFile::insert_file(): id=',27h,0
SSZ100F3BA0_DjVuFileCache__add_file____tryin:
db 'DjVuFileCache::add_file(): trying to add a new item',0Ah,0
SSZ100F3BF4_DjVuFileCache__clear_to_size____:
db 'DjVuFileCache::clear_to_size(): dropping cache size to ',0
dd SSZ100F3E88_DjVuMessage_failed_to_parse_XML
dd SSZ100F3E6C_DjVuMessage_Unrecognized
dd SSZ100F3E54_DjVuMessage_Parameter
SSZ100F3E54_DjVuMessage_Parameter:
db 'DjVuMessage.Parameter',0
SSZ100F3E6C_DjVuMessage_Unrecognized:
db 'DjVuMessage.Unrecognized',0
SSZ100F3E88_DjVuMessage_failed_to_parse_XML:
db 'DjVuMessage.failed_to_parse_XML',0
dd SSZ100F3E88_DjVuMessage_failed_to_parse_XML

Posted by bxmaster at 09:50 | Comments (674)