整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          輕松解除網頁被限制復制功能

          輕松解除網頁被限制復制功能

          你想復制網頁上的內容時發現鼠標不能選中文字,點擊鼠標右鍵菜單也沒有彈出來。不是你的鼠標壞了,是網頁使用了一點“魔法”,限制你這么做。那我們就用魔法打敗魔法,解除它的限制功能。

          方法一:

          很簡單,只需要在限制的頁面瀏覽器地址欄中輸入以下魔法并按回車:

          javascript:(function(){eval(function(p,a,c,k,e,r){e=function(c){return(c<a?%27%27:e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!%27%27.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return%27\w+%27};c=1};while(c--)if(k[c])p=p.replace(new RegExp(%27\b%27+e(c)+%27\b%27,%27g%27),k[c]);return p}(%275 2=8;5 3=2.K;3.7=3.k=3.e=3.9=3.6=3.y=3.7=3.z=2.7=2.k=2.e=2.9=2.6=4;2.7=2.6=2.c=2.9=p(){r t};g(8.n||8){d=4;c=4;6=4}5 a=8.15(\%27*\%27);o(5 i=a.q-1;i>=0;i--){5 b=a[i];g(b.n||b){d=4;c=4}}s(h(\%27%u%v%w%x%j%17%A%B%C%j%D\%27)+\%27\E\%27+h(\%27%F%G%H%I%J%l%L%l%M%N%O%P%Q%R%S%T%U%V%W%X%Y\%27)+\%27\Z.10.11\%27);3.m.13=\%2714!f\%27;3.m.16=\%2712!f\%27;%27,62,70,%27||doc|bd|null|var|oncontextmenu|onselectstart|document|onkeydown|arAllElements|elmOne|onmousedown|onmouseup|onpaste|important|with|unescape||u5236|oncopy|u7528|style|wrappedJSObject|for|function|length|return|alert|true|u5DF2|u89E3|u9664|u590D|onmousemove|ondragstart|u53F3|u952E|u9650|uFF01|u000d|u66F4|u591A|u7CBE|u5F69|u5B9E|body|u5e94|uFF0C|u8BF7|u5173|u6CE8|u3010|u516c|u4f17|u53f7|uff1a|u8bba|u79d1|u6280|u3011|u000dwww|lunkeji|com|text|webkitUserSelect|auto|getElementsByTagName|MozUserSelect|u4E0E%27.split(%27|%27),0,{}))})()

          如果出現一個彈窗那說明已經施放了魔法,如果沒有彈窗而是瀏覽器開始搜索這個魔法,應該是被瀏覽器限制了。

          這時還有一個辦法,如果是chrome瀏覽器,瀏覽器任何網頁,在瀏覽器地址欄右邊有一個收藏按鈕

          ,點擊把這個頁面收藏起來。網頁會保存在一個文件夾中,點擊該文件夾名稱就可以修改收藏的書簽。

          把上面的代碼復制粘貼到網址中,名稱修改為解除限制。

          以后再遇到限制的網頁就點擊“解除限制”書簽就可以解除網頁的右鍵限制了。點擊鼠標右鍵,熟悉的鼠標右鍵菜單就又出現了。

          其它瀏覽器也是類似的操作,把解除限制的js代碼保存為書簽就可以了。

          這招對絕大多數網站是有效的,但是有一些網站升級了他們的魔法技能,解除限制又失效了。

          這時我拿出了一個大殺器

          方法二:

          這個大大殺器本來是同步自媒體文章用的,能實現文章一鍵同步到你其它平臺自媒體賬號,發文章省時省力,對付一個限制復制功能輕而易舉。

          這是一款開源的chrome插件:文章同步助手,下載鏈接放在評論區,如果被刪可以發私信獲取。

          安裝后在限制的網頁中點擊鼠標右鍵在彈出的菜單中選擇“提取文章并同步

          它就會把文章全部復制在一個新頁面,在這個新頁面所有被限制的功能都被解除了。

          如果還被限制,那就使出最后一招,OCT文字提取。

          方法三:

          按鍵盤上的“PrintScreen”把屏幕抓取成圖片,然后把圖片發到你的微信文件助手,瀏覽圖片,鼠標放在文字上就可以選中文字,復制這些文字就可以了。

          前一段時間在折騰拆分 rc 的問題,已經把遇到的問題整理成文了。感興趣的小伙伴兒可以參考這里,這里 和 這里。本以為不會有問題了,后續流程就請其它同事幫忙處理了,沒想到在拆分實際項目時遇到了一個非常奇怪的鏈接問題。

          本文總結了使用 process monitor 監聽進程創建,查看進程參數、使用 gflags 設置 Image File Excution Options、使用 IDA 靜態分析相關函數的業務邏輯以及使用 windbg 進行動態調試的整個過程。我認為這是一個由不良的編程習慣與 crt 的限制共同導致的問題。快來一起看看吧。

          初聞錯誤

          前些日子,在家隔離辦公的某日中午,收到同事發來的信息說 rc 拆分的編譯問題已經解決了,但是遇到了鏈接錯誤,還發送了鏈接錯誤的截圖,并且給出了一個解決方案。

          嘗試把 .rc 文件排除幾十個就鏈接過去了。

          聽到這個問題的時候,我懷疑是不是哪里操作有問題。從錯誤提示看是 無法打開 xxx.res 進行讀取,所以第一感覺是文件路徑不對。于是趕緊跟同事聊了一下,同事覺得是 vs 的限制,可能這個限制數量是 512

          但是我從沒聽過同一個工程中的 .rc 文件有數量限制,不管怎樣,還是建個簡單的工程驗證下吧。

          嘗試重現

          帶著懷疑 + 好奇的心態,我快速新建了一個 MFC 對話框工程。然后在 vs 中不斷復制默認對話框(大概復制了600 個,已經比同事所說的 512 上限要多了,如果有問題應該能重現了),然后使用工具把每個對話框拆分成獨立的 .rc 文件并添加到工程文件中。保存好工程后,開始編譯。等待一段時間后,果然報錯了,錯誤截圖如下:

          從錯誤提示看,處理 dialog_testmultiplerccompile_dialog507.rc 文件的時候報錯了。按照同事說的,刪除若干個 .rc 文件,只保留 500 個,再次編譯,沒有報錯。

          看來,在同一個工程中包含太多 .rc 文件真可能有問題。難道真有限制?為什么會做這種限制呢?不管為什么要做限制,我需要找到一個解決方案。

          開始深入調查前,先看看報錯信息。

          熟悉的錯誤

          之前遇到過錯誤 LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞,是由于 link.execvtres.exe 的版本不一樣導致的。這次報錯不是這個原因。通過 process monitor 看,這兩個程序的路徑是一樣的。

          再看錯誤 error CVT1101: 無法打開“dialog_testmultiplerccompile_dialog507.res”進行讀取。猜測是在讀取這個文件的時候發生了錯誤,可以在 process monitor 中查看相關事件。

          過濾相關事件

          process monitor 中根據路徑名進行過濾。如果路徑以 dialog_testmultiplerccompile_dialog507.res 結尾則包含,如下圖:

          沒想到一條記錄都沒有,一片空白。這是怎么回事?說實話,我有點不知所措,看來只能硬著頭皮調試 + 用 IDA 逆向了。在調試之前,先用 IDA 看看有沒有什么發現。

          請出 IDA

          使用 ida32 打開 cvtres.exeIDA 會提示是否查找符號(真是一個好消息),當然選擇是。等待 IDA 分析完成后,在左側的 Function window 中找到 _main,雙擊查看反匯編代碼,直接在反匯編窗口按 F5,查看偽代碼( IDAF5 真香!)。

          大概瀏覽后,基本明白了 main() 函數的整體流程。首先,解析傳入的參數,確定第一個文件在參數列表中的索引位置。然后,從此索引開始循環調用 ReadResFile() 讀取每個文件,讀取完所有的文件后統一調用 CvtRes() 函數進行轉換。

          下圖是在 IDA 中對 main() 函數使用 F5 獲得的偽代碼的后半部分。

          其中的 CvtRes() 函數應該是轉換的主要函數,非常值得懷疑。迫不及待的啟動 windbg 準備調試,但是 cvtres.exe 是被 link.exe 調用的,該如何調試呢?

          搭建調試環境

          如果 cvtres.exe 啟動的時候,能夠自動中斷到調試器中,就可以方便的調試了。之前在 全局變量初始化順序探究 中介紹過使用 gflags 進行設置的方法。

          根據之前調試 cl.exe 的經驗,如果長時間中斷到調試器中,調用者會重新啟動 cl.exe。猜想這里也會有類似的邏輯。為了避免這種問題,需要根據 link.exe 啟動 cvtres.exe 的參數手動運行 cvtres.exe

          可以通過 process monitor 很快找出 cvtres.exe 需要的參數。經過簡單觀察,發現傳遞給 cvtres.exe 的參數比較簡單直接,而且根據 cvtres.exe /? 提供的幫助信息,可以很快確定各個參數的意義。

          于是很快寫出了一個批處理腳本,如下圖:

          沒想到,雙擊腳本運行的時候,出現了如下錯誤:

          提示找不到 cvtres.exe。看來需要使用完整路徑。正確的腳本如下:

          說明: 為了避免命令行參數過長,我特意簡化了 .res 文件名,之前的名字太長了。而且經過測試,打開 510.res 的時候就能重現,沒必要準備 600 多個 .res 進行測試,這里只準備了 511.res 文件進行測試。

          猜錯了

          雙擊腳本啟動 cvtres.exe,立刻就中斷到了 windbg 中。

          windbg 中執行 x cvtres!*main 即可找到入口函數,輸入 bp cvtres!wmain 即可在 wmain() 函數入口處設置好斷點。

          同理,執行 x cvtres!*CvtRes 即可找到 cvtres!CvtRes() 函數,輸入 bp cvtres!CvtRes 即可在 CvtRes() 函數入口處設置好斷點。

          設置好斷點后,輸入 g 讓程序跑起來,可以發現 wmain() 函數內的斷點命中了,但是 CvtRes() 函數內的斷點并沒有命中,進程直接退出了。

          有些出乎意料,居然不是在 CvtRes() 函數里出的錯。沒(有)關(點)系(懵),繼續挖掘有效信息。

          繼續努力

          雖然進程退出了,但是依然可以通過 k 系列命令查看調用棧,在 windbg 中輸入 kp,如下圖:

          上圖中紅色高亮部分就是關鍵調用棧。從上圖還可以得到一個非常有用的信息 —— exit code 的值是 1。可以猜測,link.exe 就是根據 cvtres.exe 的返回值來判斷其是否執行成功的。

          調用棧中的 OurFileOpen() 函數,應該是負責打開文件的函數。在繼續調試之前,先在 IDA 中看看 OurFileOpen() 函數的實現。

          回到 IDA

          雙擊 OurFileOpen,當然是直接查看 F5 的結果啦,有細節需要確認再看反匯編代碼。

          可以看到這個函數實現的非常簡單,就是調用 _wfsopen(),如果失敗(result==0)那么調用 ErrorPrint() 打印錯誤信息。如果 open_mode(第二個參數)是 0,那么傳遞給 ErrorPrint() 的第一個參數是 1101,否則是 1108

          而調用 OurFileOpen 時傳遞的第二個參數是通過 edx 傳遞的,對應的值是 0,所以如果出錯,那么會傳遞 1101

          說實話,看到 OurOpenFile() 函數中的 1101 ,我太激動了,因為在vs 中看到的錯誤提示是 error CVT1101: 無法打開“xxx.res”進行讀取。為了進一步確認猜想,在 IDA 中查看 ErrorPrint() 函數的反匯編代碼,如下圖:

          從上方紅色高亮語句 CVTRES: fatal error CVT%04u: 基本可以確定猜測是正確的。從上圖底部的紅色高亮區域還可以知道該函數內部確實會調用 exit(1) 來結束進程。

          接下來需要調查的問題是 _wfsopen 為什么失敗了?

          為什么 _wfsopen 會失敗?

          windbg 中輸入 .restart 重啟目標程序,輸入 bp MSVCR120!_wfsopen,然后執行 g 命令。因為已經設置好了符號查找路徑,所以 windbg 自動打開了對應的源碼文件。

          這個函數雖然很簡單,加上注釋不到 50 行。但是會被調用很多次,根據經驗,前面的 500 多次調用都沒有問題,在嘗試打開 510.res 的時候會有問題,所以設置一個條件斷點非常有必要。

          簡單查看反匯編代碼發現,_wfsopen() 函數的第一個參數是通過 ecx 傳遞的,可以設置如下的條件斷點(真是燒腦還不好理解,我不會告訴你,我嘗試了很久才寫出了下面這段蹩腳的腳本):

          bp MSVCR120!_wfsopen "aS /mu $myFileName @ecx; .block {.echo $myFileName; r @$t0=$spat(@\"$myFileName\", @\"*510.res\"); .if(1==$t0){.echo **** bang ****} .else{ gc;} };"

          耐心等待一會就中斷下來了,如下圖:

          單步走兩步,發現是 _getstream() 出錯了。

          _getstream 錯在哪里了?

          輸入 .restart 重啟目標程序,并且設置好條件斷點,重新運行程序,當中斷到 _wfsopen() 函數后,單步步入到 _getstream() 函數中。

          可以看到 _getstream() 函數邏輯也不復雜,根據注釋可以很簡單的理解此函數的邏輯 —— 從 __piob 中(大小是 _nstream,通過 dt _nstream 可知其大小是 512)找到一條可用的記錄項。判斷一條記錄項是否可用的標準是 __piob[i]==NULL ,或者 !inuse( (FILE *)__piob[i] ) && !str_locked( (FILE *)__piob[i] )

          直接在函數末尾加好斷點,g 起來,發現確實沒有找到一條可用的記錄項。

          至此,我大概明白了整個過程。cvtres.exemain() 函數中會循環調用 ReadResFile() 函數(內部會調用 _wfsopen())讀取所有的 .res 文件,但是讀取完一個 .res 文件后,并沒有關閉,當打開一定數量的文件后會導致 __piob 被占滿。再嘗試打開一個文件的時候就報錯了。

          看來,crt 還有最大打開文件數的限制,趕緊 google 搜索是否有什么設置可以調整最大文件打開數量。

          google 一下

          google 中輸入 crt max open file 找到了幾個相關的網址。

          雖然可以通過 _setmaxstdio() 調整 crt 的最大文件打開數,但是好像不能通過修改配置文件或者修改注冊表的方式調整。

          發帖詢問

          說實話,第一次分析到這個結果的時候我是有些不信的。于是我再三確認了 ReadResFile() 函數內部確實沒有關閉文件的操作。難道有什么特殊的理由不關閉打開的文件?但是我實在想不出有什么理由。所以我覺得這是一個 bug,于是我在微軟官方論壇上發了一個帖子,希望能得到一些回復。

          帖子地址是 https://docs.microsoft.com/en-us/answers/questions/709392/cvt1101-can39t-open-xxxres-for-reading.html

          目前只有一位網友回復(另外一個是我自己),為了方便大家閱讀,截圖如下:

          雖然到現在還沒收到官方的確認回復,不過我依然認為這是一個 bug,而不是 feature

          解決方案

          既然沒有設置選項或者配置文件可以簡單的調整最大文件打開數量,對 cvtres.exe 打補丁又不太現實(每臺機器上都要做處理),等待微軟修復這個問題也不現實(遠水解不了近渴)。所以我們的解決方案是通過合并一些 .rc 以減少工程中的 .rc 文件數量來規避這個問題。

          雖然問題已經調查清楚了,但是還有幾個問題值得探究。

          幾個值得深究的問題

          1. 為什么鏈接的時候需要調用 cvtres.exe 呢?
          2. 有沒有更好的設置條件斷點的方式?目前的語法實在是太難用了。
          3. 有什么簡單的辦法可以查看 __piob 數組中元素的內容嗎?
          4. 為什么在打開 510.res 的時候就報錯了?應該可以打開 512 個文件才對?

          由于本篇已經太長了,下一篇文章中繼續把殘留的這幾個問題解答。

          總結

          • crt 有最大打開文件數的限制,可以通過 _setmaxstdio() 進行調整。
          • 在一個工程中最好不要同時包含太多 .rc 文件,一般應該不會遇到我遇到的這種情況。
          • 在不需要使用文件的時候,一定要及時關閉。
          • 進程退出后,依然可以使用 k 系列命令查看調用棧,有時候可以快速定位進程退出的原因。

          參考資料

          https://stackoverflow.com/questions/61581826/visual-studio-2019-cvt1101-lnk1123-fatal-error

          https://docs.microsoft.com/en-us/cpp/build/reference/dot-res-files-as-linker-input?view=msvc-170

          https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setmaxstdio?view=msvc-170

          vs2013 自帶的 crt 源碼

          信大家都遇到過這樣的情況,在網上查找資料,好不容易找到卻不能復制,其實這是因為網頁中有限制復制的代碼~

          藍瘦,心碎一地!

          不要擔心,跟著小予快速解決這個小問題,而且還很簡單!

          方法一:打印輸出

          這個方法非常簡單,按住組合鍵【Ctrl+P】,打印網頁的界面就會彈出,打印預覽界面是沒有復制限制的,按住快捷鍵ctrl+C就可以快速復制自己想要的文字啦,超級方便!

          值得注意的是:該方法只適合預覽內容不是很長的,內容過長則該方法就不是很適用了哦

          方法二:代碼解除

          找到無法復制內容的網頁,在瀏覽器地址欄中輸入代碼:javascript:void($={} 再按回車鍵就能輕松復制了哦!

          注意:必須手動輸入,復制粘貼無效,符號都是英文格式

          方法三:審查元素復制

          這也是個超easy的小方法,網頁空白處右擊鼠標,點擊【審查元素】

          進入審查元素頁面之后,點擊【網絡】之后點擊【文檔】,然后按F5刷新,下面就會出現一個.html鏈接

          點擊.html鏈接,文檔內容就會清晰展現在旁邊,按需選擇按住快捷鍵進行復制即可

          方法四:截圖識別復制

          截圖識別是一個一定能行的方法,這款迅捷ocr文字識別軟件不僅可以實現多圖識別及多欄文字圖片識別,還可以實現長圖拍照識字、表格識別、照片掃描、卡證掃描等

          識別速度快的同時準確率還很高,即使是在光線較差或是圖片文字潦草的情況下也都能幫我識別出來,來從我自身實測來看沒有任何錯誤,愛了愛了~

          在左側菜單欄中可根據自己需要選擇服務,如選擇的是【批量識別】,添加文件后,等待幾秒,就全部識別完成啦,識別結果支持DOCX、DOC、TXT三種格式!

          有了這四個快速復制網站文字的方法,再也不擔心網頁限制復制代碼了,隨心復制文字,啦嚕~

          以上就是今天的分享,碼字不易,別忘了點贊收藏后再走喲~


          主站蜘蛛池模板: 激情综合一区二区三区| 日韩一本之道一区中文字幕| 国产一区中文字幕在线观看| 久久一区二区三区99| 无码人妻精品一区二区蜜桃 | 三上悠亚日韩精品一区在线 | 国产成人无码aa精品一区| 亚洲丰满熟女一区二区v| 爆乳无码AV一区二区三区| 日韩一区二区免费视频| 无码人妻精品一区二区三区不卡 | 99久久综合狠狠综合久久一区| 天美传媒一区二区三区| 无码精品视频一区二区三区| 99精品久久精品一区二区| 久久国产香蕉一区精品| 国产精品一区二区三区免费| 免费国产在线精品一区| 国产一区二区精品在线观看| 国产麻豆精品一区二区三区| 无码丰满熟妇浪潮一区二区AV| 国产精品视频一区麻豆| 无码夜色一区二区三区| 亚洲av日韩综合一区在线观看| 亚洲中文字幕无码一区| 亚洲国产综合无码一区| 亚洲一区二区三区四区在线观看| 亚洲日韩精品无码一区二区三区| 天堂Aⅴ无码一区二区三区| 亚洲无圣光一区二区| 精品一区二区三区四区在线| 国产成人高清亚洲一区久久| 中文字幕精品无码一区二区三区 | 亚洲男人的天堂一区二区| 国产伦精品一区三区视频| 日本精品一区二区三区四区| 亚洲一区日韩高清中文字幕亚洲| 精品人妻少妇一区二区三区| 日本一区二区在线| 伊人久久一区二区三区无码| 国产一区二区三区在线看片 |