背景

手上有个简单的小程序,用来识别公司应用的登录窗口,自动填写用户名密码,点击登录(要是有保存用户名密码功能多好啊)

今天忽然想看一下实现原理是啥,源码是啥

主要工具及环境

DIE pyinstxtractor uncompyle6 pycdc 编译好的pycdc vs2019 win10x64 python3.9.6

分析exe

下载Detect It Easy 软件,并打开我们的小程序
上面的PyInstaller表明这是一个python程序,使用pyinstaller打包成exe

首先解包这个exe

既然是python打包的,先解包看看里面有啥

  • 下载pyinstxtractor ,随后使用python pyinstxtractor xxx.exe解包,输出如下

E:\xxxx>python pyinstxtractor.py xxxx.exe
[+] Processing xxxx.exe
[+] Pyinstaller version: 2.1+
[+] Python version: 309
[+] Length of package: 59527603 bytes
[+] Found 1053 files in CArchive
[+] Beginning extraction…please standby
will make file struct.pyc
will make file pyimod01_os_path.pyc
will make file pyimod02_archive.pyc
will make file pyimod03_importers.pyc
will make file pyimod04_ctypes.pyc
[+] Possible entry point: pyiboot01_bootstrap.pyc
[+] Possible entry point: pyi_rth_subprocess.pyc
[+] Possible entry point: pyi_rth_pkgutil.pyc
[+] Possible entry point: pyi_rth_multiprocessing.pyc
[+] Possible entry point: pyi_rth_inspect.pyc
[+] Possible entry point: pyi_rth__tkinter.pyc
[+] Possible entry point: xxxx.pyc

will make file tk\xmfbox.tcl
will make file PYZ-00.pyz
[+] Found 536 files in PYZ archive
[+] Successfully extracted pyinstaller archive: xxxx.exe
You can now use a python decompiler on the pyc files within the extracted directory

  • 由此我们得到了所有的pyc文件存放于xxxx_extracted目录下,pyc文件是python编译后产生的文件,还需将其反编译成py文件才能得到源码

反编译pyc文件

解出来了一堆pyc文件,pyc是py文件编译后生成的,需要反编译一下

  • 首先安装pip install uncompyle6,也可从网站下载源码
  • 运行命令uncompyle6 xxxx_extracted\xxxx.pyc
  • 如果pyc是python3.8及以下版本,则可直接得到源码文件,否则将得到如下提示

换个方式反编译pyc文件

由于这个exe是python3.9生成的,uncompyle6不支持。只能另觅他法,我们换pycdc再试一下

  • 下载pycdc 这是一个c++写的反编译pyc的工具
  • 使用cmake配置好pycdc工程,编译得到pycdas.exe pycdc.exe两个程序,拷贝到我们的e:\xxxx目录下,编译好的pycdc
  • 运行命令pycdc xxxx_extracted\xxxx.pyc > xxxx.py
  • 如果幸运则直接得到完整python文件,如果pyc内有pycdc不支持的指令,则只能得到部分py代码,并报错

    打开xxxx.py看一下
    中间代码略
    可以看出由于有不支持的指令JUMP_IF_NOT_EXC_MATCH,反编译工作只执行了一部分
    到底少了点什么呢?

大杀器–反编译字节码看看

既然不能直接得到py文件,我们使用大杀器吧

  • 执行命令pycdas.exe xxxx.exe_extracted\xxxx.pyc > xxxx.txt
    打开xxxx.txt
    我们看到已经得到了完整的字节码,LOAD_GLOBAL 读取一个全局变量,类似java字节码的感觉,对照一下左右的代码很容易读懂。

  • 随后就需要我们耐心的读xxxx.txt中的字节码,将pycdc生成的xxxx.py中缺少的部分自行补上,

  • 最后由于生成的xxxx.py部分语句并不符合语法,需要自己修改一下,再通读一下代码进行修正。

总结

  1. 我们首先使用DIE 工具探测出exe文件 是pyinstaller生成的
  2. 随后使用了uncompyle6 尝试反编译,由于uncompyle6不支持python3.9生成的pyc,这一步没有成功
  3. 随后使用了pycdc尝试反编译,由于碰到了不支持的JUMP_IF_NOT_EXC_MATCH指令,成功了一部分
  4. 最后使用了大杀器pycdas,得到了字节码,补全了代码(照着字节码看我们自己也能翻译出来python源码)

从exe程序反汇编得到py源码相关推荐

  1. Ubuntu 16.04下Caffe-SSD的应用(四)——ssd_pascal.py源码解读

    前言 caffe-ssd所有的训练时的参数,全部由ssd_pascal.py来定义,之后再去调用相关的脚本和函数,所以想要训练自己的数据,首先要明白ssd_pascal.py各个定义参数的大体意思. ...

  2. 【python】又拍云采集工具助手exe带python图片采集源码

    [python]又拍云采集工具助手exe带python图片采集源码 论坛的老哥要的东西!练手试了一下! 技术比较渣,见谅! 拿去玩! 适合想要获取 又拍云 相册图片的需求! 自己测试了一下,没有用多线 ...

  3. 机器狗写入到userinit.exe文件的下载者源码(c及汇编)

    机器狗源码(C语言的),将病毒体从资源中提取出来写入到第一个分区的指定文件中 // Test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  4. 基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...

    文件名称: RSA下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 169 KB 上传时间: 2014-04-23 下载次数: 0 提 供 者: 姚双奇 详细说明: ...

  5. tinkphp1.0贺岁版小程序应用平台系统源码

    介绍: tinkphp1.0贺岁版小程序应用平台系统源码 安装说明:直接放入服务器或者空间,访问域名根据安装向导进行安装. 程序魅力:此程序是类似微信小程序一样的机制系统,但不是微信小程序,跟微信不搭 ...

  6. 微信程序短视频去水印源码 开源产品未加密未授权相关文章

    微信程序短视频去水印源码 开源产品未加密未授权相关文章 看到咸鱼上还有人卖这套源码,所以就把这套源码 免费分享出来 开源产品,未加密未授权,可调用别人的接口和自己的接口. PS:源码仅供技术学习参考, ...

  7. emlog程序音乐歌曲网源码

    简介: emlog程序音乐歌曲网源码 使用方法: 首先需要安装好emlog6.0.1系统,登录后台直接上传模板应用即可! 内附模板使用修改说明! 网盘下载地址: http://kekewangLuo. ...

  8. 初识exe程序反汇编小感

    [原创]初识exe程序反汇编小感 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...

  9. 详解:Spark程序的开始 SparkContext 源码走一走

    Spark程序的开始 SparkContext 源码走一走 什么是SparkContext IDEA中看看源码 ** Main entry point for Spark functionality. ...

  10. 新版WIFI小程序分销系统微信源码序WiFi大师版流量主搭建独立源码WiFi分销源码

    网传版本,未测试,新版WIFI大师v4.47小程序源码,WIFI分销系统带流量主和独立运行版. 更新内容: 1.后台更多板块列表新增分页 2.平台管理端图标优化 3.平台管理端新增平台统计 4.优化后 ...

最新文章

  1. python开发环境和运行环境的区别_Django 开发环境与生产环境的区分详解
  2. RYU控制器的学习笔记(三) 利用观察者模式通知app处理报文
  3. python中print用法
  4. 找出1-100中缺失的两个数
  5. HDU - 4027 Can you answer these queries?(线段树)
  6. vue项目使用大华摄像头怎样初始化_Vue接入监控视频技术总结
  7. java伪代码生成器_JAVA单例模式的实现伪代码
  8. net 开发 【要学习】
  9. SQLSERVER数据库设置varchar类型主键自增方法
  10. 语义分割之原图与mask的可视化
  11. php方便,两个方便测试PHP特性的小程序
  12. 【ROS学习笔记】(一)常用命令的解释与举例
  13. httpsecurity 类方法介绍_java知识学习25-内部类 - 那种意境
  14. Elasticsearch自动补全(拼音查询自动补全)
  15. 电阻器颜色代码在线计算机,色环电阻计算器
  16. 五子棋人机交互c语言代码,Windows人机交互程序设计教学课件-第10课 五子棋程序.ppt...
  17. 技术美术知识学习4200:SSAO算法
  18. 用VS2008制作主题和皮肤
  19. cab文件介绍及制作方法 1
  20. 阿里研究院副院长:数字化转型的十个本质

热门文章

  1. HZRecorder+科大讯飞语音转换文字
  2. finereport java无符合资料_Java报表工具FineReport常见的数据集报错错误代码和解释...
  3. android无线投屏到win,无线投影仪怎么连接,看过教程,原来操作这么简单!
  4. 石头科技财报背后:不甘再当小米打工仔?
  5. 苹果4s怎么越狱_苹果4S怎么下载东西
  6. 串口液晶屏和并口液晶屏的区别
  7. 优秀开源项目YYKit
  8. Oracle标准建表语句
  9. 【人话版】WEB3黑暗森林中的隐私博弈
  10. oracle查看数据库文件大小