整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          python反編譯和防破解

          python反編譯和防破解

          ython是一種解釋型語言,但是與javascript這種純腳本語言不同,python提供了一種編譯成字節(jié)碼運行的方法,編譯之后就得到pyc文件,這點和java編譯成class文件再用jvm解釋運行很類似,但是與java不同的是,python編譯字節(jié)碼不是一個強制的操作,事實上,編譯是一個自動的過程,一般不會在意它的存在。

          編譯成字節(jié)碼可以節(jié)省加載模塊的時間,提高效率。除了效率之外,字節(jié)碼的形式也增加了反向工程的難度,可以保護源代碼。這個只是一定程度上的保護,反編譯還是可以的。

          py pyc pyo pyd分別是什么文件

          • py: python腳本源文件。
          • pyc: python源文件經(jīng)過編譯得到的字節(jié)碼, 二進制文件。
          • pyo: python腳本文件開啟優(yōu)化編譯(-O)得到的字節(jié)碼,二進制文件(python -O test.py)。
          • pyd: python的動態(tài)鏈接庫,Windows DLL文件。

          編譯py文件生成pyc

          我們編寫兩個py腳本

          mylib.py:包含一個函數(shù),打印一行文字.

          def keyFun():
              print("keyFun is running")

          main.py:程序運行入口,調用mylib種的keyFun函數(shù)

          from mylib import keyFun
          
          if __name__=="__main__":
              keyFun()

          編譯所有文件,在腳本目錄執(zhí)行以下命令:

          python -m compileall .

          可以看到生成了相對應的兩個pyc文件

          編譯生成pyc文件

          此時執(zhí)行main.cpython-38.pyc會提示找不到mylib模塊,需要將文件名中的.cpython-38刪掉.

          執(zhí)行pyc文件

          反編譯pyc

          反編譯pyc的工具很多,我用的是python3.8,這里介紹幾種可以反編譯python3.8的工具.

          • 在線反編譯網(wǎng)站: https://tool.lu/pyc/
          • python-decompile3工具: https://github.com/rocky/python-decompile3
          • Easy Python Decompiler: https://sourceforge.net/projects/easypythondecompiler/

          本文作為演示,使用在線網(wǎng)站反編譯mylib.py,可以看到下圖反編譯代碼與實際代碼一模一樣.

          反編譯pyc結果

          反編譯pyinstaller打包的exe文件

          我們使用pyinstaller將main.py打包成exe文件

          pyinstaller -F main.py


          pyinstaller打包exe并執(zhí)行

          反編譯pyinstaller打包的exe需要用到pyinstxtractor(https://github.com/extremecoders-re/pyinstxtractor).

          將main.exe復制到pyinstxtractor文件夾,執(zhí)行python pyinstxtractor.py main.exe

          python pyinstxtractor.py main.exe


          反編譯exe

          可以看到pyinstxtractor已經(jīng)提示入口文件為main.pyc.我們反編譯main.pyc就可以看到pyc引入可哪些模塊,這個例子可以從反編譯代碼中看到引入了mylib模塊,再接著反編譯mylib.pyc就可以了.

          Cython編譯pyd文件

          從上面的反編譯pyc文件結果可以看出,pyc很容易就被反編譯,無法保護我們的代碼.這里我們介紹使用Cython將python文件編譯成pyd文件的方法.

          首先安裝Cython(Anaconda自帶Cython的話不需要安裝)

          pip install Cython

          在mylib.py所在目錄新建build_pyd.py文件

          from distutils.core import setup
          from Cython.Build import cythonize
          
          setup(
              ext_modules=cythonize([
                  "mylib.py"
              ]),
          )
          
          #1.執(zhí)行 python build_pyd.py build_ext --inplace
          #2.再把.cp38-win_amd64刪掉 python renamepyd_file.py

          執(zhí)行python build_pyd.py build_ext --inplace.將會為mylib.py生成對應的.c文件和.pyd文件


          Cython生成pyd文件

          與上文提到的pyc文件無法直接執(zhí)行一樣,pyd文件也需要刪除文件名中的.cp38-win_amd64.這樣main.py才能找到對應的mylib.pyd.

          import os
          
          lists=os.listdir("./")
          for item in lists:
              try:
                  if ".cp38-win_amd64.pyd" in item:
                      # 重命名文件
                      fileName=item.replace("cp38-win_amd64.", "")
                      files=os.rename(item, fileName)
              except Exception as e:
                  print(e)

          執(zhí)行main.py,此時main.py引用的是編譯后的mylib.pyd.如果修改了mylib.py中的代碼,需要刪除pyd文件后調試,不然不會看到改動后的效果.

          編譯成pyd后再用pyinstaller打包

          使用上文中的方法將python文件編譯為pyd文件后,再用pynstaller打包,這時候我們反編譯就只能看到pyd文件了,要想破解pyd文件就需要使用匯編級別的破解技術,如果你的代碼需要別人這樣去破解的話,那恭喜你了,哈哈.

          需要注意的是,編譯為pyd再用pyinstaller打包,可能會出現(xiàn)模塊無法被打包進去的情況,這時候需要編輯spec文件,將mylib模塊添加到hiddenimports中.

          a=Analysis(['main.py'],
                       pathex=['E:\\playground\\decompiletest'],
                       binaries=[],
                       datas=[],
                       //這里引入mylib模塊
                       hiddenimports=['mylib'],
                       hookspath=[],
                       runtime_hooks=[],
                       excludes=[],
                       win_no_prefer_redirects=False,
                       win_private_assemblies=False,
                       cipher=block_cipher,
                       noarchive=False)

          更多pyinstaller的高級技巧可以看我之前的一篇文章pyinstaller打包python程序高級技巧

          注于Java領域優(yōu)質技術,歡迎關注

          來自:漫畫編程

          某天下班后,我在家里進行電話面試,問到面試者這樣一個問題:"你知道使用哪些辦法可以反編譯Java代碼嗎?"。但是面試者回答的并不好,所以我在面試評價中寫到:"對編譯原理相關知識理解的不透徹"。這時,女朋友看到這句話。

          計算機語言

          計算機語言(Computer Language)指用于人與計算機之間通訊的語言。計算機語言是人與計算機之間傳遞信息的媒介。

          計算機系統(tǒng)最大特征是指令通過一種語言傳達給機器。為了使電子計算機進行各種工作,就需要有一套用以編寫計算機程序的數(shù)字、字符和語法規(guī)劃,由這些字符和語法規(guī)則組成計算機各種指令(或各種語句)。這些就是計算機能接受的語言。

          計算機語言包括機器語言、匯編語言和高級語言三種。

          機器語言

          機器語言是用二進制代碼表示的計算機能直接識別和執(zhí)行的一種機器指令的集合。機器語言具有靈活、直接執(zhí)行和速度快等特點。但是不同型號的計算機其機器語言是不相通的,按著一種計算機的機器指令編制的程序,不能在另一種計算機上執(zhí)行。

          因為機器語言是使用二進制表示的,所以編出的程序全是些0和1的指令代碼。

          機器語言的優(yōu)點就是可以直接被計算機識別和執(zhí)行,比較高效,但是同時也有很多缺點,如:

          • 1、機器只認識0和1,程序員很難記住每個指令轉成0和1的組合是什么,需要查大量的表格來確定每個數(shù)字表示什么意思
          • 2、因為它的書面形式全是"密"碼,所以可讀性差,不便于交流與合作。
          • 3、因為它嚴重地依賴于具體的計算機,所以可移植性差,重用性差。

          由于機器語言有這么多的弊端,于是有了匯編語言。

          匯編語言

          匯編語言使用助記符(Mnemonics)來代替和表示特定低級機器語言的操作。

          助記符(mnemonic)是便于人們記憶、并能描述指令功能和指令操作數(shù)的符號,助記符是表明指令功能的英語單詞或其縮寫。如用ADD表示加法、MOV表示傳送、SUB表示減法等。

          但是,匯編語言只是讓使用者,即程序員們更加容易記住和使用,計算機并不認識匯編語言,所以,想要讓計算機執(zhí)行匯編代碼,需要先將匯編程序將它們轉換成可執(zhí)行的機器語言代碼。這一過程被稱為匯編過程。

          由于匯編更接近機器語言,能夠直接對硬件進行操作,生成的程序與其他的語言相比具有更高的運行速度,占用更小的內存,因此在一些對于時效性要求很高的程序、許多大型程序的核心模塊以及工業(yè)控制方面大量應用。

          機器語言和匯編語言,二者是幾乎很少或者完全沒有做任何語法抽象的,這種語言我們通常稱之為低級語言,這種更加接近硬件,而且是不可以在不同硬件間移植的。

          但是隨著現(xiàn)代軟件系統(tǒng)越來越龐大復雜,大量經(jīng)過了封裝的高級語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程序員在開發(fā)過程中能夠更簡單,更有效率,使軟件開發(fā)人員得以應付快速的軟件開發(fā)的要求。

          高級語言

          高級語言是高度封裝了的編程語言,與低級語言相對。

          它是以人類的日常語言為基礎的一種編程語言,使用一般人易于接受的文字來表示(例如漢字、不規(guī)則英文或其他外語),從而使程序編寫員編寫更容易,亦有較高的可讀性,以方便對電腦認知較淺的人亦可以大概明白其內容。

          如流行的java,c,c++,C#,pascal,python,lisp,prolog,F(xiàn)oxPro,易語言,中文版的C語言習語言等等,這些語言的語法、命令格式都不相同。

          同匯編語言一樣,高級語言離機器語言更加遠了,計算機無法直接誒識別高級語言。所以,想要讓計算機執(zhí)行高級語言,就需要將其轉化為機器語言。

          ?

          文對常用的反編譯工具進行簡單介紹

          JD-GUI、procyon-decompiler、luyten、crf

          反編譯工具分類

          JD-GUI

          JDK7以及之前可以使用 JD-GUI,如果版本>=1.8 各種問題

          http://java-decompiler.github.io

          procyon-decompiler

          如果版本>=1.8 ,可以使用 procyon-decompiler,不過是命令行界面

          https://bitbucket.org/mstrobel/procyon/downloads/

          luyten

          luyten是Procyon的GUI,只需要下載luyten即可,不用下載Procyon

          https://github.com/deathmarine/Luyten

          下載地址

          https://github.com/deathmarine/Luyten/releases

          crf

          crf也可以支持更高版本

          http://www.benf.org/other/cfr/

          小結

          如果你的版本<=7,都可以使用,如果版本更高,請使用除了JD-GUI以外的選擇

          使用

          JD-GUI

          略,JD-GUI網(wǎng)上教程很多,不再介紹。

          procyon-decompiler

          可以直接解析class文件到cmd窗口顯示

          也可以將反編譯之后的文件保存到指定位置,如果需要保存在指定位置,需要增加 -o命令參數(shù),并且需要指定保存的路徑

          直接顯示:

          java -jar D:\ApplicationFiles\program\procyon-decompiler-0.5.30.jar D:\ProgramData\ideaProjects\...\news\NewsController.class

          保存文件:

          java -jar D:\ApplicationFiles\program\procyon-decompiler-0.5.30.jar D:\ProgramData\ideaProjects\...\news\NewsController.class -o C:\Users\noteless\Desktop\dddddd

          luyten

          luyten是圖形化界面

          通過File直接打開class文件即可

          當然,也可以進行文件保存等操作

          注意

          直接打開luyten的時候,給出了下面的提示信息

          但是,系統(tǒng)中的java環(huán)境是沒有問題的,也是一直在使用的,CMD下運行java或者javac命令都沒有問題

          這是為什么?

          據(jù)網(wǎng)上分析是因為使用了免安裝版本的JDK,簡單說不是從官網(wǎng)下載可執(zhí)行程序一步一步安裝而來

          這也就導致了注冊表中不存在JDK的信息

          一種變通的途徑就是借助于命令,通過在命令提示符下面輸入 java -jar .\luyten-0.5.4.exe打開

          (此時,我的文件存在于桌面上,所以使用的當前路徑)

          如果設置到其他位置,請給出路徑,比如

          也可以進一步設置為bat命令

          文件就一行內容:

          java -jar D:\ApplicationFiles\program\luyten-0.5.4.exe

          再進一步可以創(chuàng)建一個快捷方式,使用下文的方式,就可以直接使用WIN鍵+R打開

          https://www.cnblogs.com/noteless/p/10471005.html

          另一種方法,就是手動設置注冊表

          還有一種方法是重新安裝JDK,走一遍過程

          建議通過命令java -jar就好了,改注冊表后續(xù)出現(xiàn)什么奇怪問題,自己可能都忘記了是自己改出來的

          重新安裝麻煩費事

          CFR

          http://www.benf.org/other/cfr/

          CFR更新還是蠻及時的

          它的使用,與procyon-decompiler沒有區(qū)別

          可以直接反編譯呈現(xiàn)在CMD中,也可以輸出到文件中

          直接解析:

          C:\Users\noteless>java -jar D:\ApplicationFiles\program\cfr-0.141.jar C:\Users\noteless\Desktop\NewsController.class

          輸出文件:

          java -jar D:\ApplicationFiles\program\cfr-0.141.jar C:\Users\noteless\Desktop\NewsController.class --outputdir C:\Users\noteless\Desktop\xxx

          文章來源:https://www.cnblogs.com/noteless/p/10592362.html


          主站蜘蛛池模板: 精品一区二区AV天堂| 视频一区二区精品的福利| 国产嫖妓一区二区三区无码| 国产麻豆媒一区一区二区三区| 激情爆乳一区二区三区| 精品无码成人片一区二区| 久久久91精品国产一区二区三区 | 一区五十路在线中出| 学生妹亚洲一区二区| 国产成人无码精品一区二区三区| 精彩视频一区二区三区| 2018高清国产一区二区三区| 国产丝袜视频一区二区三区| 色综合视频一区二区三区| 另类国产精品一区二区| 亚洲Av高清一区二区三区| 亚洲日韩精品无码一区二区三区| 无码精品人妻一区二区三区AV| 蜜芽亚洲av无码一区二区三区| 亚洲男女一区二区三区| 久久久久99人妻一区二区三区| 爆乳熟妇一区二区三区| 一区精品麻豆入口| 一区在线免费观看| 国产情侣一区二区三区| 色视频综合无码一区二区三区 | 中文字幕乱码亚洲精品一区| 无码人妻精品一区二区三区东京热| 一区二区三区免费精品视频 | 精品一区二区三区电影| 日韩免费视频一区| 国产伦精品一区二区三区免费迷 | 亚洲日本va午夜中文字幕一区| 国产成人一区二区三区在线| 一区二区三区在线| 不卡一区二区在线| 日本欧洲视频一区| 亚洲国产一区二区a毛片| 精品一区二区三区东京热| 麻豆亚洲av熟女国产一区二 | 欧洲无码一区二区三区在线观看|