lightnovel-center / linovelib2epub

Crawl light novel from some websites and convert it to epub.
https://pypi.org/project/linovelib2epub/
GNU Affero General Public License v3.0
71 stars 8 forks source link

并非bug,请教一下关于网站加密字体的解法 #50

Closed Wyy-Hardwork closed 1 month ago

Wyy-Hardwork commented 1 month ago

大佬你好,如果只是单纯用对照表进行文字替换,我发现文字是对不上的,比如 ban_word = { "": "的", "": "一", "": "是", "": "了", "": "我", "": "不", "": "人", "": "在", "": "他", "": "有", "": "这", "": "个", "": "上", "": "们", "": "来", "": "到", "": "时", "": "大", "": "地", "": "为", "": "子", "": "中", "": "你", "": "说", "": "生", "": "国", "": "年", "": "着", ... } 内容来源 https://www.bilinovel.com/themes/zhmb/js/readtools.js

上面的内容我发现和网站内加密字不能正确对应,请问一下是怎么解决的呢

wdpm commented 1 month ago

你上面的dict是根据 此链接 中的这部分代码片段解析出来的吗?

eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[0-35-8]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('var h=5.6(\'7\').8;h=h.0(1 2(\'鈥淺',"3"),"銆�").0(1 2(\'鈥漒',"3"),"銆�").0(1 2(\'鈥榎',"3"),"銆�").0(1 2(\'鈥橽',"3"),"銆�").0(1 2("顮�","3"),"鐨�").0(1 2("顮�","3"),"涓€").0(1 2("睢�","3"),"鏄�").0(1 2("顮�","3"),"浜�").0(1 2("顮�","3"),"鎴�").0(1 2("睢�","3"),"涓�").0(1 2("顮�","3"),"浜�").0(1 2("睢�","3"),"鍦�").0(1 2("顮�","3"),"浠�").0(1 2("睢�","3"),"鏈�").0(1 2("顮�","3"),"杩�").0(1 2("顮�","3"),"涓�").0(1 2("顮�","3"),"涓�").0(1 2("顮�","3"),"浠�").0(1 2("顮�","3"),"鏉�").0(1 2("顮�","3"),"鍒�").0(1 2("顮�","3"),"鏃�").0(1 2("顮�","3"),"澶�").0(1 2("睢�","3"),"鍦�").0(1 2("顮�","3"),"涓�").0(1 2("顮�","3"),"瀛�").0(1 2("顮�","3"),"涓�").0(1 2("睢�","3"),"浣�").0(1 2("睢€","3"),"璇�").0(1 2("顮�","3"),"鐢�").0(1 2("顮�","3"),"鍥�").0(1 2("顮�","3"),"骞�").0(1 2("睢�","3"),"鐫€").0(1 2("睢�","3"),"灏�").0(1 2("顮€","3"),"閭�").0(1 2("睢�","3"),"鍜�").0(1 2("顮�","3"),"瑕�").0(1 2("睢�","3"),"濂�").0(1 2("顮�","3"),"鍑�").0(1 2("顮�","3"),"涔�").0(1 2("睢�","3"),"寰�").0(1 2("顮�","3"),"閲�").0(1 2("顮�","3"),"鍚�").0(1 2("睢�","3"),"鑷�").0(1 2("顮�","3"),"浠�").0(1 2("顮�","3"),"浼�").0(1 2("睢�","3"),"瀹�").0(1 2("顮�","3"),"鍙�").0(1 2("顮�","3"),"涓�").0(1 2("顮�","3"),"鑰�").0(1 2("顮�","3"),"杩�").0(1 2("顮�","3"),"澶�").0(1 2("顮�","3"),"鍘�").0(1 2("顮�","3"),"鑳�").0(1 2("睢�","3"),"瀵�").0(1 2("顮�","3"),"灏�").0(1 2("顮�","3"),"澶�").0(1 2("顮�","3"),"鐒�").0(1 2("顮�","3"),"浜�").0(1 2("睢�","3"),"蹇�").0(1 2("顮�","3"),"瀛�").0(1 2("睢�","3"),"涔�").0(1 2("顮�","3"),"涔�").0(1 2("顮�","3"),"閮�").0(1 2("睢�","3"),"濂�").0(1 2("顮�","3"),"鐪�").0(1 2("顮�","3"),"璧�").0(1 2("顮�","3"),"鍙�").0(1 2("顮�","3"),"褰�").0(1 2("睢�","3"),"娌�").0(1 2("睢�","3"),"鎴�").0(1 2("睢�","3"),"鍙�").0(1 2("睢�","3"),"濡�").0(1 2("顮�","3"),"浜�").0(1 2("顮�","3"),"鎶�").0(1 2("睢�","3"),"杩�").0(1 2("睢�","3"),"鐢�").0(1 2("顮�","3"),"绗�").0(1 2("睢�","3"),"鏍�").0(1 2("顮�","3"),"閬�").0(1 2("顮�","3"),"鎯�").0(1 2("顮�","3"),"浣�").0(1 2("顮�","3"),"绉�").0(1 2("顮�","3"),"寮€").0(1 2("睢�","3"),"缇�").0(1 2("顮�","3"),"涔�").0(1 2("睢�","3"),"闃�").0(1 2("顮�","3"),"娑�").0(1 2("顮�","3"),"鑼�").0(1 2("顮�","3"),"娆�").0(1 2("睢�","3"),"鍛�").0(1 2("睢�","3"),"鑲�").0(1 2("顮�","3"),"浜�").0(1 2("顮�","3"),"鎬�").0(1 2("顮�","3"),"鑳�").0(1 2("睢�","3"),"绉�").0(1 2("顮�","3"),"绌�").0(1 2("睢�","3"),"娣�").0(1 2("睢�","3"),"鑷€").0(1 2("顮�","3"),"鑸�").0(1 2("顮�","3"),"灏�").0(1 2("睢�","3"),"鑴�").0(1 2("睢�","3"),"瑁�").0(1 2("睢�","3"),"楠�").0(1 2("睢�","3"),"鍞�");5.6(\'7\').8=h;',[],9,'replace|new|RegExp|gi||document|getElementById|acontentz|innerHTML'.split('|'),0,{}));

目前这个爬虫库的爬取目标网站并不是 手机UI版本,而是 PC web 版本。所以我暂时没法准确地回答你关于手机UI网站版本的js文本反混淆问题。 但从上面的js代码来看,它的手机UI版本依旧采用的是js正则表达式替换的方式(RegExp),你只需将其反混淆即可。从代码混淆的力度来看,难度不算高。

但是我印象中,它应该不只是js文本混淆,它可能还有CSS字体混淆,这个CSS字体混淆的解决方案是OCR。关于CSS字体混淆,此前已经有人提问过了,记录在一个issue中,如果你对此细节感兴趣,请查看 #46。 OCR的实现代码位置:你可以参阅 _patch_font_obfuscation函数。 如果你还有其他疑问,可以继续追问。

Wyy-Hardwork commented 1 month ago

感谢解答,对不上的原因找到了,请求的是PC端的文档但是用的是移动端的字体解密,两端加密字不一样(代理地址写错了😂)

顺便这里附上两端的加密内容,供大伙使用(也不知道可以撑多久==)。

// 手机UI版本
let map = {
        "": "的",
        "": "一",
        "": "是",
        "": "了",
        "": "我",
        "": "不",
        "": "人",
        "": "在",
        "": "他",
        "": "有",
        "": "这",
        "": "个",
        "": "上",
        "": "们",
        "": "来",
        "": "到",
        "": "时",
        "": "大",
        "": "地",
        "": "为",
        "": "子",
        "": "中",
        "": "你",
        "": "说",
        "": "生",
        "": "国",
        "": "年",
        "": "着",
        "": "就",
        "": "那",
        "": "和",
        "": "要",
        "": "她",
        "": "出",
        "": "也",
        "": "得",
        "": "里",
        "": "后",
        "": "自",
        "": "以",
        "": "会",
        "": "家",
        "": "可",
        "": "下",
        "": "而",
        "": "过",
        "": "天",
        "": "去",
        "": "能",
        "": "对",
        "": "小",
        "": "多",
        "": "然",
        "": "于",
        "": "心",
        "": "学",
        "": "么",
        "": "之",
        "": "都",
        "": "好",
        "": "看",
        "": "起",
        "": "发",
        "": "当",
        "": "没",
        "": "成",
        "": "只",
        "": "如",
        "": "事",
        "": "把",
        "": "还",
        "": "用",
        "": "第",
        "": "样",
        "": "道",
        "": "想",
        "": "作",
        "": "种",
        "": "开",
        "": "美",
        "": "乳",
        "": "阴",
        "": "液",
        "": "茎",
        "": "欲",
        "": "呻",
        "": "肉",
        "": "交",
        "": "性",
        "": "胸",
        "": "私",
        "": "穴",
        "": "淫",
        "": "臀",
        "": "舔",
        "": "射",
        "": "脱",
        "": "裸",
        "": "骚",
        "": "唇",
      };
// PC Web版本
let map = {
        "": "的",
        "": "一",
        "": "是",
        "": "了",
        "": "我",
        "": "不",
        "": "人",
        "": "在",
        "": "他",
        "": "有",
        "": "这",
        "": "个",
        "": "上",
        "": "们",
        "": "来",
        "": "到",
        "": "时",
        "": "大",
        "": "地",
        "": "为",
        "": "子",
        "": "中",
        "": "你",
        "": "说",
        "": "生",
        "": "国",
        "": "年",
        "": "着",
        "": "就",
        "": "那",
        "": "和",
        "": "要",
        "": "她",
        "": "出",
        "": "也",
        "": "得",
        "": "里",
        "": "后",
        "": "自",
        "": "以",
        "": "会",
        "": "家",
        "": "可",
        "": "下",
        "": "而",
        "": "过",
        "": "天",
        "": "去",
        "": "能",
        "": "对",
        "": "小",
        "": "多",
        "": "然",
        "": "于",
        "": "心",
        "": "学",
        "": "么",
        "": "之",
        "": "都",
        "": "好",
        "": "看",
        "": "起",
        "": "发",
        "": "当",
        "": "没",
        "": "成",
        "": "只",
        "": "如",
        "": "事",
        "": "把",
        "": "还",
        "": "用",
        "": "第",
        "": "样",
        "": "道",
        "": "想",
        "": "作",
        "": "种",
        "": "开",
        "": "美",
        "": "乳",
        "": "阴",
        "": "液",
        "": "茎",
        "": "欲",
        "": "呻",
        "": "肉",
        "": "交",
        "": "性",
        "": "胸",
        "": "私",
        "": "穴",
        "": "淫",
        "": "臀",
        "": "舔",
        "": "射",
        "": "脱",
        "": "裸",
        "": "骚",
        "": "唇",
      }

另外OCR解法学到了!再次感谢大佬解答🙏

Wyy-Hardwork commented 1 month ago

附上两端加密字文件链接 PC端: https://www.linovelib.com/themes/zhpc/js/pctheme.js?v1129c3-2 移动端: https://www.bilinovel.com/themes/zhmb/js/readtools.js?v0531a1-2

再次感谢🙏

Montaro2017 commented 1 week ago

https://github.com/Montaro2017/bili_novel_packer 这个用的是用手机网页的 手机端有两种加密,一种使用正则表达式的加密,另一种是字体加密 正则表达式的JS代码混淆了但是很容易分析 字体的需要对字体文件进行分析处理,详细可以看我的博客 https://www.cnblogs.com/montaro/p/18284319