雨中小町

标题: dlsite加密的.dlst格式有办法提取图片吗 [打印本页]

作者: 稀神探女    时间: 2019-9-13 17:38
标题: dlsite加密的.dlst格式有办法提取图片吗
查了下网上似乎有办法提取,但是都年代久远失效了貌似
http://tggame.dyndns.org/phpBB/v ... rt=0&view=print
發表人:         pansx1 [ 2014-06-06, 23:54 ]
文章主題 :         代提取加密作品(dlsite或dmm)
大家好,还记得我是谁吗,对了,我就是变身爱好者论坛的站长
现在很多人因为购买了加密的文档无法分享而苦恼,什么,你不知道加密文档是什么?就是dlsite viewer的.dlst格式和dmm的dmm viewer文档。
或许经常逛e绅士的绅士们已经注意到了我经常会上传一些被加密的文档,如果你购买了这类文件想要分享可以联系我,免费帮你提取(到我的论坛发帖或者qq,我基本不上这里...)
当然必须是购买了的漫画才可能提取,所以务必准备好文档本体和账号密码哦...你说为什么不分享破解的过程?因为一旦方法或者破解器公开就意味着很快会被官方封禁...
论坛:tgfuns.com
我的e绅士上传:exhentai.org/uploader/pansx
qq:919836745 问题自己猜,常识问题
当然普通的文件比如pdf也可以帮忙提取~
顺便一提,让我提取后我有权公开,如上传到e绅士哦...

http://forums.e-hentai.org/index.php?showtopic=92167&st=0
DMM and DLsite Book (.dmmb/.dlst) Image Ripper

以上是我找到的
作者: 荒神小夜    时间: 2019-9-13 19:20
不懂帮顶……
作者: 052113    时间: 2019-9-13 23:14
买的漫画吗?其实我都是等出了资源直接下载。。你要找到办法也告诉我吧,我也有几本想买
作者: 稀神探女    时间: 2019-9-14 00:10
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
052113 发表于 2019-9-13 23:14
买的漫画吗?其实我都是等出了资源直接下载。。你要找到办法也告诉我吧,我也有几本想买

你也不清楚通用方法?
按理说买下的就是我自己的,这搞个加密很难受
DL这个加密播放器还会禁止截屏和虚拟机,真厉害哦
作者: 稀神探女    时间: 2019-9-20 08:44
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
052113 发表于 2019-9-13 23:14
买的漫画吗?其实我都是等出了资源直接下载。。你要找到办法也告诉我吧,我也有几本想买

https://www.dlsite.com/books/work/=/product_id/BJ098524.html
免费贩卖9/26 为止
促销特价        0日元
通常价格        216日元

目前不要钱,现在就看谁可以解包了
作者: 052113    时间: 2019-9-20 23:49
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
稀神探女 发表于 2019-9-20 08:44
https://www.dlsite.com/books/work/=/product_id/BJ098524.html
免费贩卖9/26 为止
促销特价        0日元

但我想要的是【未開の地で拾った謎言語単眼ちゃんをメイドとして雇っていちゃらぶする本】系列
https://www.dlsite.com/maniax/work/=/product_id/RJ194660.html
什么时候才能90%off呢
作者: somebelly    时间: 2019-9-21 01:52
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
本帖最后由 somebelly 于 2019-9-21 01:55 编辑

不提供解决方案,但讲一下思路。




大概看了下play.dlsite.com的源码,每张图片是分块位移后储存的(可以F12,看sources里面play.dl.dlsite.com的内容,是分块位移后的图片)
然后显示的时候通过canvas处理了一下,再分块位移回来
所以解决方法大概是下面两种:
1、使用处理前的图片,模拟canvas处理的过程自己处理一遍(任意语言)
2、把canvas处理后的内容转为图片再下载(网页挂载js脚本)

1可以参考下面的折叠内容(位置在webpack://dll/./node_modules/photoswipe/dist/photoswipe.js 3157行)
2的话参考:
https://stackoverflow.com/questi ... -canvas-to-png-file
https://stackoverflow.com/questi ... element-to-an-image

[spoiler=代码]
  1. _preloadImage = function(item) {
  2.                 var preloadImages = [], i = 0, l = 0;

  3.                 if(!item.loaded) {
  4.                         item.loading = true;
  5.                         item.loaded = false;
  6.                 }

  7.                 // 画像の描画にcanvasを利用するかどうか
  8.                 // FIXME: true, false, null, undefined...
  9.                 if (item.crypt) {
  10.                         item.img = framework.createEl('pswp__img', 'canvas');
  11.                         item.img.width  = item.w;
  12.                         item.img.height = item.h;
  13.                 } else {
  14.                         item.img = framework.createEl('pswp__img', 'img');
  15.                 }

  16.                 item.img.style.opacity = '0';

  17.                 // 画像のロードを開始
  18.                
  19.                 // 見開き
  20.                 if(item.page && item.page.length) {
  21.                         var maxHeight = item.page.reduce(function (a, b) { return Math.max(a.h, b.h) });
  22.                         var page;
  23.                         var leftPage;
  24.                         for (i=0, l=item.page.length; i<(l|0); i=(i+1)|0) {
  25.                                 page = item.page[i];
  26.                                 // 縦中心位置
  27.                                 if (page.h < maxHeight) {
  28.                                         page.offsetY = ((maxHeight - page.h) / 2)|0;
  29.                                 } else {
  30.                                         page.offsetY = 0;
  31.                                 }
  32.                                 
  33.                                 // 右
  34.                                 if (i !== 0) {
  35.                                         leftPage = item.page[i - 1];
  36.                                         page.offsetX = (leftPage.offsetX + leftPage.w)|0;
  37.                                 }
  38.                                 // 左(先に描画)
  39.                                 else {
  40.                                         page.offsetX = 0;
  41.                                 }
  42.                                 
  43.                                 preloadImages.push(_loadImage(page, item.img));
  44.                         }
  45.                 }
  46.                 // 単ページ
  47.                 else {
  48.                         preloadImages.push(_loadImage(item, item.img));
  49.                 }

  50.                 // すべてのロードが終わったら
  51.                 Promise.all(preloadImages)
  52.                         .then(function (result) {
  53.                                 // canvas情報があれば左から順番に描画
  54.                                 for (i=0, l=result.length; i<(l|0); i=(i+1)|0) {
  55.                                         if(result[i].c && item.img) {
  56.                                                 _drawCanvas(item.img.getContext('2d'), result[i].img, result[i].c);
  57.                                                 result[i].img = null;
  58.                                                 result[i].c = null;
  59.                                         }
  60.                                 }
  61.         
  62.                                 if (result.length === 1 && result[0].img) {
  63.                                         item.src = result[0].img.src;
  64.                                 }
  65.                         }, function () {
  66.                                 item.loadError = true;
  67.                         })
  68.                         .then(function() {
  69.                                 item.loading = false;
  70.                                 item.loaded = true;
  71.                                 
  72.                                 if(item.preloader) {
  73.                                         item.preloader.style.display = 'none';
  74.                                         item.preloader.innerHTML = '';
  75.                                         item.preloader = null;
  76.                                 }
  77.                                 
  78.                                 if(item.img) {
  79.                                         item.img.style.opacity = '1';
  80.                                 }
  81.                                 
  82.                                 if(item.loadComplete) {
  83.                                         item.loadComplete(item);
  84.                                 } else {
  85.                                         item.img = null; // no need to store image object
  86.                                 }
  87.                         });

  88.                 return item.img;
  89.         },

  90.         _loadImage = function(item, itemImage) {
  91.                 var img = itemImage, crypt;

  92.                 if(itemImage.tagName !== 'IMG') {
  93.                         img = framework.createEl('pswp__preload', 'img');
  94.                 }

  95.                 return new Promise(function(resolve, reject) {
  96.                         // 画像読み込みが完了
  97.                         img.onload = function() {
  98.                                 // canvas描画処理
  99.                                 if(itemImage.tagName === 'CANVAS') {
  100.                                         crypt = {
  101.                                                 crop: 128,
  102.                                                 offsetX: item.offsetX || 0,
  103.                                                 offsetY: item.offsetY || 0,
  104.                                                 w: item.w,
  105.                                                 h: item.h,
  106.                                                 ws: 0,
  107.                                                 hs: 0,
  108.                                                 count: 0,
  109.                                                 s: parseInt(item.key.substring(5, 12), 16),
  110.                                                 p: null
  111.                                         };

  112.                                         crypt.ws = Math.ceil(crypt.w / crypt.crop);
  113.                                         crypt.hs = Math.ceil(crypt.h / crypt.crop);
  114.                                         crypt.count = crypt.ws * crypt.hs;
  115.                                         crypt.p = _createCdata(crypt);
  116.                                 }

  117.                                 resolve({
  118.                                         img: img,
  119.                                         c: crypt
  120.                                 });

  121.                                 if(itemImage.tagName !== 'IMG') {
  122.                                         img = null;
  123.                                 }

  124.                         };

  125.                         img.onerror = reject;

  126.                         // ダウンロードURLを取得
  127.                         if(item.src.indexOf('play://') !== -1) {
  128.                                 self.getImageUrl(item.src).then(function(url) {
  129.                                         img.src = url;
  130.                                 }, function() {
  131.                                         img.src = item.src;
  132.                                 });

  133.                         // 通常ロード
  134.                         } else {
  135.                                 img.src = item.src;
  136.                         }
  137.                 });
  138.         },

  139.         /**
  140.          * Canvasに描画
  141.          * @param {CanvasRenderingContext2D} ctx
  142.          * @param {HTMLImageElement} img
  143.          * @param {Object} crypt
  144.          * @private
  145.          */
  146.         _drawCanvas = function(ctx, img, crypt) {
  147.                 var isGap = /(iPad|iPhone|iPod)/g.test(navigator.platform);
  148.                 var column = 0, row = 0, sx, sy, dx, dy;

  149.                 // モザイクタイルの画像を一枚ずつ復元描画
  150.                 for (var i = 0, l = crypt.count; i < (l|0); (i = i + 1)|0) {
  151.                         sy = (Math.floor((crypt.p[i] * crypt.crop) / (crypt.ws * crypt.crop)));
  152.                         sx = crypt.p[i] - (sy * crypt.ws);
  153.                         dx = column;
  154.                         dy = row;

  155.                         ctx.drawImage(
  156.                                 img,
  157.                                 sx * crypt.crop,
  158.                                 sy * crypt.crop,
  159.                                 crypt.crop,
  160.                                 crypt.crop,
  161.                                 // 一部デバイスでタイルに隙間が出来るため、タッチデバイスは0.5を加算
  162.                                 (dx * crypt.crop - (isGap ? 0.5 : 0)) + crypt.offsetX,
  163.                                 dy * crypt.crop - (isGap ? 0.5 : 0) + crypt.offsetY,
  164.                                 crypt.crop + (isGap ? 0.5 : 0),
  165.                                 crypt.crop + (isGap ? 0.5 : 0)
  166.                         );

  167.                         column++;

  168.                         if(column * crypt.crop >= crypt.w) {
  169.                                 column = 0;
  170.                                 row++;
  171.                         }
  172.                 }
  173.                
  174.                 // モザイクタイル化する都合上発生する白余白を消去する
  175.                 if (img.width !== crypt.w) {
  176.                         ctx.clearRect((crypt.offsetX + crypt.w)|0, crypt.offsetY, (img.width - crypt.w)|0, crypt.h|0);
  177.                 }
  178.                
  179.                 if (img.height !== crypt.h) {
  180.                         ctx.clearRect(crypt.offsetX|0, (crypt.h + crypt.offsetY)|0, crypt.w|0, (img.height - crypt.h)|0);
  181.                 }
  182.         },
复制代码
[/spoiler]


作者: 稀神探女    时间: 2019-9-21 11:16
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
somebelly 发表于 2019-9-21 01:52
不提供解决方案,但讲一下思路。



你的突破口是网页版,我也想过,捕捉过play.dlsite的图片,是jpg乱序块,你这样处理就成png,虽然无损但也不是原图了,体积会加剧增大没什么收藏价值,网上那些有损转假无损资源太讨厌了
我看不懂代码,从方便角度还不如逐页截屏
有没有一种可能,在不重新压缩的情况下移动jpg画面内容?我记得jpg的有损压缩是按块来的

作者: somebelly    时间: 2019-9-21 13:58
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
稀神探女 发表于 2019-9-21 11:16
你的突破口是网页版,我也想过,捕捉过play.dlsite的图片,是jpg乱序块,你这样处理就成png,虽然无损但 ...

你下载下来的dlst文件也是一样的处理方式
如果担心Jpg处理过程中的损失,那dlsite官方阅读器(不论网页版还是本地版)生成的图片也都有一样的损失

作者: somebelly    时间: 2019-9-21 14:04
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
本帖最后由 somebelly 于 2019-9-21 14:07 编辑
稀神探女 发表于 2019-9-21 11:16
你的突破口是网页版,我也想过,捕捉过play.dlsite的图片,是jpg乱序块,你这样处理就成png,虽然无损但 ...

通俗解释一下两种方法:
方法一是官方阅读器和是你找到的那些破解器的解决方法
方法二类似于你说的逐页截屏




作者: 稀神探女    时间: 2019-9-22 02:02
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
somebelly 发表于 2019-9-21 13:58
你下载下来的dlst文件也是一样的处理方式
如果担心Jpg处理过程中的损失,那dlsite官方阅读器( ...

关于官方阅读器是你的猜测还是?官方阅读器故意阻止虚拟机和截屏所以不考虑
从dlst文件压缩率看里面储存的是某种有损压缩格式,肯定不是dlst自己发明的,这就有可能还原,你仿佛在说“解包”后变无损——那就不是真解包了

图像的有损转无损比mp3转ape还难以接受,声音起码只是损失了信号,转无损相对减小,但jpg相比原图还增加了杂点信号,转无损比原图还大,这种就没什么收藏意义,是这个意思
作者: somebelly    时间: 2019-9-22 02:47
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
本帖最后由 somebelly 于 2019-9-22 02:49 编辑
稀神探女 发表于 2019-9-22 02:02
关于官方阅读器是你的猜测还是?官方阅读器故意阻止虚拟机和截屏所以不考虑
从dlst文件压缩率 ...

真那么难懂么
.dlst文件里封装的是分块位移后的jpg格式图片
我说的是,你不管怎么处理都是有损的,因为原文件就是有损的

作者: 稀神探女    时间: 2019-9-23 01:08
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
somebelly 发表于 2019-9-22 02:47
真那么难懂么
.dlst文件里封装的是分块位移后的jpg格式图片
我说的是,你不管怎么处理都是有 ...

要的就是这个“从dlst文件解包出分块位移后的jpg格式图片”的方法
而且,由于jpg格式的有损压缩也是分如8*8像素小块进行的,所以应该也有不二次压缩挪移分块的方法
这是2件事

你显然误会了什么,请允许我多解释一下,“因为原文件就是有损的”这个不是我跟你说过的“从dlst文件压缩率看里面储存的是有损的”吗?我完全清楚,解包目的是为了不二次压缩,而避免图像的有损转无损的原因也是出于收藏方面
作者: 月铭山溪    时间: 2019-9-23 04:00
不懂帮顶
作者: somebelly    时间: 2019-9-23 06:01
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
稀神探女 发表于 2019-9-23 01:08
要的就是这个“从dlst文件解包出分块位移后的jpg格式图片”的方法
而且,由于jpg格式的有损压缩也是分如 ...

明白了。。看来我之前说的其实不是你想解决的问题
作者: 稀神探女    时间: 2019-9-24 15:09
标题: RE: dlsite加密的.dlst格式有办法提取图片吗
somebelly 发表于 2019-9-23 06:01
明白了。。看来我之前说的其实不是你想解决的问题

可能我的描述“对jpg无损挪移”对你产生了误导,我说对jpg“无损”都是不二次有损压缩的意思
好像对jpg无损旋转是有的,但挪移画面块有这种可行性吗
作者: virus    时间: 2019-9-24 17:04
之前买过一个加密本子,在网上找到一个帖子,但是帖子好像是给封了还是啥点不开了,但是有个图片简介有行百度云,点击去后下了个dlist image ripper好像这么叫,然后一开始扒出来的图是乱码的,后面把看图模式换成原来的那种就提取出来了,但是我刚刚去找那玩意没找到,忘记放哪了




欢迎光临 雨中小町 (https://rainkmc.com/) Powered by Discuz! F1.0