如何跟踪python脚本实例在linux上怎么运行

注:仅做周内/双休判断,不做双休以外的节假日判断。本站对该功能可能引发的风险概不负责╮( ̄▽ ̄)╭
绿色通道一键直达
后使用快捷导航没有帐号?
查看: 1296|回复: 5
用linux的娃可以考虑使用小虾的搜狗python代理脚本上网(未...
本帖最后由 warmsun0220 于
16:53 编辑
网上找到小虾的搜狗代理脚本(个人认为其实西工大的猫最核心就是小虾的脚本,不过又加了个自动改变系统代理等功能罢了),用linux的同学则可以考虑直接用python脚本直接来运行。终端运行python xiaoxia.py。别忘了改一下浏览器或者系统代理。
PS:用一会之后速度和win下就差得很远,过一段时间就报 request time out ,不知道西工大的猫有没有优化过,作者能帮忙公布一下改动就好了。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
貌似linux不能用免费流量,再说搜狗有linux版本吗?用wine???
qinchao 发表于
貌似linux不能用免费流量,再说搜狗有linux版本吗?用wine???
小哥&&代理脚本 好不好&&服务器通过搜狗的唯一识别码验证& &通过验证你就是“搜狗”,可以通过教育网服务器上网& & win下不用搜狗的浏览器还不是一样可以用西工大的猫
走的是收费资源
herbin 发表于
走的是收费资源
你确定?但我看开了之后ip变为背景搜狗教育网IP(跟西工大猫一样)啊&&
用代理当然就不走流量了
请求时间那个问题估计是python程序本省问题需要优化
kingson 的锐捷超了 6
Powered by您现在的位置: &
Python延迟指定时间执行特定任务脚本
Python延迟指定时间执行特定任务脚本
  函数功能说明:
  指定时间间隔(day,hour,min,second)一个或多个选项,例如,从现在开始延迟 5分钟/1小时,运行一个hello函数。
  from datetime import date, time, datetime, timedeltaimport time
  def hello():&
print "hello world."
  def runTask(func, day=0, hour=0, min=5, second=0):&
# get current time &
now = datetime.now()&
strnow = now.strftime('%Y-%m-%d %H:%M:%S')&
print "now:",strnow&
# get net_run time&
period = timedelta(days=day, hours=hour, minutes=min, seconds=second)&
next_time = now + period&
strnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')&
print "next run:",strnext_time&
while True:& & &
now = datetime.now()& & &
strnow = now.strftime('%Y-%m-%d %H:%M:%S')& & &
# if system time eq next_time run the specific task(hello func)& & &
if str(strnow) == str(strnext_time):& & & & &
print strnow& & & & &
func()& & & & &
print "task done."& & & & &
  runTask(hello, min=3)
  Python 的详细介绍:请点这里Python 的下载地址:请点这里
  推荐阅读:
  《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]
  Python脚本获取Linux系统信息
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
单击提交则表示您同意developerWorks
的条款和条件。 .
所有提交的信息确保安全。
developerWorks 社区:
我的概要信息
选择语言:
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具
比如 inotify-sync(文件系统安全监控软件)、 glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控。
本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写。
, 系统管理员, 中科思密达有限公司
曹江华,毕业于工科大学机电一体化专业,从事 CAD 设计。后从事小型数据库的应用。1999 年开始从事构建网络、管理维护、数据库管理工作。关注开放系统和网络安全。出版多本 Unix/Linux 安全管理书籍。
Python 版本说明
Python 是由 Guido van Rossum 开发的、可免费获得的、非常高级的解释型语言。其语法简单易懂,而其面向对象的语义功能强大(但又灵活)。Python
可以广泛使用并具有高度的可移植性。本文 Linux 服务器是 Ubuntu 12.10, Python 版本 是 2.7 。如果是 Python 3.0 版本的语法上有一定的出入。另外这里笔者所说的 Python 是 CPython,CPython 是用 C 语言实现的 Python 解释器,也是官方的并且是最广泛使用的 Python 解释器。除了 CPython 以外,还有用 Java 实现的 Jython 和用.NET 实现的 IronPython,使 Python 方便地和 Java 程序、.NET 程序集成。另外还有一些实验性的 Python 解释器比如 PyPy。CPython 是使用字节码的解释器,任何程序源代码在执行之前先要编译成字节码。它还有和几种其它语言(包括 C 语言)交互的外部函数接口。
工作原理:基于/proc 文件系统
Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。proc 文件系统提供的信息如下:进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的进程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。系统信息:如果需要了解整个系统信息中也可以从/proc/stat 中获得,其中包括 CPU 占用情况、磁盘空间、内存对换、中断等。CPU 信息:利用/proc/CPUinfo 文件可以获得中央处理器的当前准确信息。负载信息:/proc/loadavg 文件包含系统负载信息。系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。表 1 是 /proc 目录中的主要文件的说明:表 1 /proc 目录中的主要文件的说明文件或目录名称描 述apm高级电源管理信息cmdline这个文件给出了内核启动的命令行CPUinfo中央处理器信息devices可以用到的设备(块设备/字符设备)dma显示当前使用的 DMA 通道filesystems核心配置的文件系统ioports当前使用的 I/O 端口interrupts这个文件的每一行都有一个保留的中断kcore系统物理内存映像kmsg核心输出的消息,被送到日志文件mdstat这个文件包含了由 md 设备驱动程序控制的 RAID 设备信息loadavg系统平均负载均衡meminfo存储器使用信息,包括物理内存和交换内存modules这个文件给出可加载内核模块的信息。lsmod 程序用这些信息显示有关模块的名称,大小,使用数目方面的信息net网络协议状态信息partitions系统识别的分区表pcipci 设备信息scsiscsi 设备信息self到查看/proc 程序进程目录的符号连接stat这个文件包含的信息有 CPU 利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间swaps显示的是交换分区的使用情况uptime这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲version这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息下面本文的几个例子都是使用 Python 脚本读取/proc 目录中的主要文件来实现实现对 Linux 服务器的监控的 。使用 Python 脚本实现对 Linux 服务器的监控对于 CPU(中央处理器)监测脚本 1 名称 CPU1.py,作用获取 CPU 的信息。清单 1.获取 CPU 的信息#!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
import pprint
def CPUinfo():
''' Return the information in /proc/CPUinfo
as a dictionary in the following format:
CPU_info['proc0']={...}
CPU_info['proc1']={...}
CPUinfo=OrderedDict()
procinfo=OrderedDict()
nprocs = 0
with open('/proc/CPUinfo') as f:
for line in f:
if not line.strip():
# end of one processor
CPUinfo['proc%s' % nprocs] = procinfo
nprocs=nprocs+1
procinfo=OrderedDict()
if len(line.split(':')) == 2:
procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
procinfo[line.split(':')[0].strip()] = ''
return CPUinfo
if __name__=='__main__':
CPUinfo = CPUinfo()
for processor in CPUinfo.keys():
print(CPUinfo[processor]['model name'])简单说明一下清单 1,读取/proc/CPUinfo 中的信息,返回 list,每核心一个 dict。其中 list 是一个使用方括号括起来的有序元素集合。List 可以作为以 0 下标开始的数组。Dict 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系。OrderedDict 是一个字典子类,可以记住其内容增加的顺序。常规 dict 并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在 OrderedDict 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。可以使用 Python 命令运行脚本 CPU1.py 结果见图 1
# Python CPU1.py
Intel(R) Celeron(R) CPU E3200
@ 2.40GHz图 1.运行清单
1也可以使用 chmod 命令添加权限收直接运行 CPU1.py
#chmod +x CPU1.py
# ./CPU1.py对于系统负载监测脚本 2 名称 CPU2.py,作用获取系统的负载信息清单 2 获取系统的负载信息#!/usr/bin/env Python
def load_stat():
loadavg = {}
f = open("/proc/loadavg")
con = f.read().split()
loadavg['lavg_1']=con[0]
loadavg['lavg_5']=con[1]
loadavg['lavg_15']=con[2]
loadavg['nr']=con[3]
loadavg['last_pid']=con[4]
return loadavg
print "loadavg",load_stat()['lavg_15']
简单说明一下清单 2:清单 2 读取/proc/loadavg 中的信息,import os :Python 中 import 用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import 模块名 [as 别名],如果只需要导入模块中的部分或全部内容可以用形式:from 模块名 import *来导入相应的模块。OS 模块
os 模块提供了一个统一的操作系统接口函数,os 模块能在不同操作系统平台如 nt,posix 中的特定函数间自动切换,从而实现跨平台操作。
可以使用 Python 命令运行脚本 CPU1.py 结果见图 2
# Python CPU2.py
图 2.运行清单
2对于内存信息的获取
脚本 3 名称 mem.py,作用是获取内存使用情况信息
清单 3 获取内存使用情况#!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
def meminfo():
''' Return the information in /proc/meminfo
as a dictionary '''
meminfo=OrderedDict()
with open('/proc/meminfo') as f:
for line in f:
meminfo[line.split(':')[0]] = line.split(':')[1].strip()
return meminfo
if __name__=='__main__':
#print(meminfo())
meminfo = meminfo()
print('Total memory: {0}'.format(meminfo['MemTotal']))
print('Free memory: {0}'.format(meminfo['MemFree']))
简单说明一下清单 3:清单 3 读取 proc/meminfo 中的信息,Python 字符串的 split 方法是用的频率还是比较多的。比如我们需要存储一个很长的数据,并且按照有结构的方法存储,方便以后取数据进行处理。当然可以用 json 的形式。但是也可以把数据存储到一个字段里面,然后有某种标示符来分割。
Python 中的 strip 用于去除字符串的首位字符,最后清单 3 打印出内存总数和空闲数。
可以使用 Python 命令运行脚本 mem.py 结果见图 3。
# Python mem.py
图 3.运行清单 3 对于网络接口的监测
脚本 4 名称是 net.py,作用获取网络接口的使用情况。
清单 4 net.py 获取网络接口的输入和输出#!/usr/bin/env Python
import time
import sys
if len(sys.argv) & 1:
INTERFACE = sys.argv[1]
INTERFACE = 'eth0'
STATS = []
print 'Interface:',INTERFACE
ifstat = open('/proc/net/dev').readlines()
for interface in
if INTERFACE in interface:
stat = float(interface.split()[1])
STATS[0:] = [stat]
ifstat = open('/proc/net/dev').readlines()
for interface in
if INTERFACE in interface:
stat = float(interface.split()[9])
STATS[1:] = [stat]
while True:
time.sleep(1)
rxstat_o = list(STATS)
RX = float(STATS[0])
RX_O = rxstat_o[0]
TX = float(STATS[1])
TX_O = rxstat_o[1]
RX_RATE = round((RX - RX_O)/)
TX_RATE = round((TX - TX_O)/)
print RX_RATE ,'MB
',TX_RATE ,'MB'
简单说明一下清单 4:清单 4 读取/proc/net/dev 中的信息,Python 中文件操作可以通过 open 函数,这的确很像 C 语言中的 fopen。通过 open 函数获取一个 file object,然后调用 read(),write()等方法对文件进行读写操作。另外 Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。最后清单 4 打印出网络接口的输入和输出情况。
可以使用 Python 命令运行脚本 net.py 结果见图 4
#Python net.py
图 4.运行清单
4监控 Apache 服务器进程的 Python 脚本
Apache 服务器进程可能会因为系统各种原因而出现异常退出,导致 Web 服务暂停。所以笔者写一个 Python 脚本文件:
清单 5 crtrl.py 监控 Apache 服务器进程的 Python 脚本#!/usr/bin/env Python
import os, sys, time
while True:
time.sleep(4)
ret = os.popen('ps -C apache -o pid,cmd').readlines()
if len(ret) & 2:
print "apache 进程异常退出, 4 秒后重新启动"
time.sleep(3)
os.system("service apache2 restart")
print "Error", sys.exc_info()[1]
设置文件权限为执行属性(使用命令 chmod +x crtrl.py),然后加入到/etc/rc.local 即可,一旦 Apache 服务器进程异常退出,该脚本自动检查并且重启。
简单说明一下清单 5 这个脚本不是基于/proc 伪文件系统的,是基于 Python 自己提供的一些模块来实现的 。这里使用的是 Python 的内嵌 time 模板,time 模块提供各种操作时间的函数。
在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控。本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 、系统负载、内存和 网络使用情况的监控脚本的编写方法。
参考资料 :介绍了 list 类,并演示了众多方法中的一些方法,了解如何使用这些方法简化困难的编程任务。
:该书介绍许多 Unix 和 Linux 系统管理工具。
:该书对 Python 标准库中的一百多个模块进行了生动的讲解。
在 寻找为 Linux 开发人员(包括 )准备的更多参考资料。加入 。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
IBM PureSystems(TM) 系列解决方案是一个专家集成系统
通过学习路线图系统掌握软件开发技能
软件下载、试用版及云计算
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=LinuxArticleID=958271ArticleTitle=用 Python 脚本实现对 Linux 服务器的监控publish-date=调试逆向 【原创】获取 EVE Online 游戏中Python脚本代码的方法 [祝大家元旦快乐] [文字模式]
- 看雪安全论坛
查看完整版本 : 调试逆向
jaskell庆祝元旦快乐!从看雪论坛学到很多,也回报点。
获取 EVE Online游戏中Python脚本代码的方法
首先,通过观察游戏文件不难发现 decompiled.code 文件中可能包含的就是Python脚本代码。但是如何才能得到解密的原始字节码呢?因此我们的思路首先围绕这个问题展开。
既然代码已经加密保存,那么程序运行中自然需要解密,因此如果我们能够跟踪到解密代码的部分,自然容易得到Python代码的字节码。为此,我们不妨从Python运行引擎的源代码中开始分析,可能更容易找到线索。
首先,我们先用IDA反汇编一下游戏的主程序文件Exefile.exe ,可以发现程序中有Python的不少API函数调用。并且调用位于blue.dll模块中,通过动态跟踪我们可以进一步确认blue.dll模块即为Python23.dll换名而得。具体过程这里不多叙述,我们只把注意力集中在Python源代码分析上。
我们可以猜想一下那些API是游戏运行时必须调用的?可能这会有个更好的开始。我猜想字节码的版本识别函数PyImport_GetMagicNumber可能是必须调用的。因此可以从这里入手看看。为此我们通过动态跟踪来确认一下,并且从动态跟踪的堆栈中了解函数的调用流程。
通过跟踪我们发现PyImport_GetMagicNumber 函数由 unmarshal_code函数调用。我们来了解一下这个函数的流程:
static PyObject *
unmarshal_code(char *pathname, PyObject *data, time_t mtime)
... ( 略 )
if (get_long((unsigned char *)buf) != PyImport_GetMagicNumber()) {
... ( 错误处理,略 )
if (mtime != 0 && !eq_mtime(get_long((unsigned char *)buf + 4),
... ( 错误处理,略 )
code = PyMarshal_ReadObjectFromString(buf + 8, size - 8);
... ( 略 )
为了让我们只关注关键部分代码,因此一些不太重要的代码这里都略过。从上面的代码中我们可以看到程序首先进行获取MagicNumber的工作和时间戳的认证,然后就通过PyMarshal_ReadObjectFromString函数把缓冲区中的代码数据转换为code代码对象。因此我们只要能够在这一行代码处进行拦截即可以得到每个Python模块的原始字节码。不过这个方法并不能得到那些没有运行的模块的字节码,因此这个方法仍有缺陷。而我们最好的方法是能够知道decompiled.code文件的加密方式,然后编写解密代码解密整个文件得到所有Python模块的字节码,为此我们继续追踪下去,希望能够找到解密的源头。
我们向上追溯跟踪,可以发现unmarshal_code函数由get_code_from_data函数调用,我们来分析一下源代码:
static PyObject *
get_code_from_data(ZipImporter *self, int ispackage, int isbytecode,
time_t mtime, PyObject *toc_entry)
PyObject *data, *
char *archive = PyString_AsString(self-&archive);
if (archive == NULL)
return NULL;
data = get_data(archive, toc_entry);
if (data == NULL)
return NULL;
modpath = PyString_AsString(PyTuple_GetItem(toc_entry, 0));
if (isbytecode) {
code = unmarshal_code(modpath, data, mtime);
code = compile_source(modpath, data);
Py_DECREF(data);
我们可以看到程序实际上是通过ZipImporter来管理数据,首先通过这个接口来提取原始数据流(即文件中保存的字节码),然后通过unmarshal_code函数把数据流转换成code对象并作为结果返回。这时我们如果通过IDA逆向blue.dll这段函数的汇编代码就会发现Stackless Python源代码与blue.dll中的汇编代码稍有不同(当然实际上我是走了不少弯路才发现这点的),我们来看一下汇编代码:
.text:100F5C30 get_code_from_data p
.... ( 略 )
.text:100F5C47
.text:100F5C48
.text:100F5C49
.text:100F5C4E
.text:100F5C50
.text:100F5C53
.text:100F5C55
short loc_100F5C5A
.text:100F5C57
.text:100F5C58
.text:100F5C59
.text:100F5C5A ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:100F5C5A
.text:100F5C5A loc_100F5C5A:
CODE XREF: get_code_from_data+25 j
.text:100F5C5A
[esp+8+arg_4], 0
.text:100F5C5F
.text:100F5C60
.text:100F5C61
short loc_100F5CBC
.text:100F5C63
offset aBlue_ &blue.crypto&
.text:100F5C68
PyImport_ImportModule
.text:100F5C6D
.text:100F5C6F
.text:100F5C72
.text:100F5C74
short loc_100F5CA4
.text:100F5C76
offset _Py_TrueStruct
.text:100F5C7B
.text:100F5C7C
offset aOo_1 &OO&
.text:100F5C81
offset aU &UnjumbleString&
.text:100F5C86
.text:100F5C87
PyObject_CallMethod
.text:100F5C8C
.text:100F5C8F
dword ptr [edi], 0FFFFFFFFh
.text:100F5C92
.text:100F5C94
short loc_100F5CA0
.text:100F5C96
edx, [edi+4]
.text:100F5C99
.text:100F5C9A
dword ptr [edx+18h]
.text:100F5C9D
....( 略 )
get_code_from_data+C6 j
.text:100F5D02
.text:100F5D04
.text:100F5D05
.text:100F5D06
.text:100F5D07
.text:100F5D08
.text:100F5D08 get_code_from_data endp
为了便于分析,同样我略去了很多无关紧要的汇编代码。从上面的代码中我们可以看到在get_data函数获取了数据流后到传入unmarshal_code函数之间多了一段对数据流进行进一步处理的转换代码。通过跟踪我们发现这段代码实现的功能正是解密加密的字节码的功能。这一段代码如果用 Python 表示即为 blue.crypto. UnjumbleString(data) 因此,我们需要进一步找到这个解密函数的位置。
通过搜索字符串我们不难发现这个函数的位置:
.text: UnjumbleString
proc DATA XREF: .data:101EC254 o
.text:100446AF
PyTuple_New
.text:100446BA
.text:100446BB
offset _Py_NoneStruct
[esp+34h+var_8], esi
_GetVerCryptKey
ecx, [esp+28h+var_4]
offset _Py_TrueStruct
.text:100446FE
offset _Py_NoneStruct
offset aO &OOOiO&
Py_BuildValue
.text:1004470E
offset _Py_NoneStruct
.text:1004474D
_CryptDecrypt
.text:1004479A
ecx, [esp+30h+var_1C]
.text:1004479E
.text:1004479F
PyObject_IsTrue
.text:100447AF
offset aZ &zlib&
PyImport_ImportModule
.text:100447BC
.text:100447BE
[esp+30h+var_14], eax
.text:100447FB
.text:100447FC
offset aO_2 &O&
offset aD &decompress&
PyObject_CallMethod
.text:1004486C UnjumbleString
从以上代码中我们来分析一下 UnjumbleString函数的解密流程,首先程序通过_GetVerCryptKey函数获取一个解密密钥,然后通过 _CryptDecrypt函数对加密数据进行解密操作,最后通过导入zlib模块,并调用其方法decompress对解密后的数据进行解压缩。到这里我们只需要了解密钥如何产生以及如何利用密钥进行解密操作即可以实现整个解密过程。因此我们进一步需要分析的目标是 _GetVerCryptKey 以及 _CryptDecrypt 函数的具体实现。
分析 _CryptDecrypt 函数我们可以发现其只是利用Windows API 中的 CryptDecrypt 函数对数据进行解密,_GetVerCryptKey 函数也只是简单地获取内存中的密钥,而函数内并不具体产生密钥。从这些信息中我们初步可以判断程序是通过 Windows 的Crypto API 函数实现加解密操作。由于Crypto API 规范基本一致,因此最终我们的目标锁定在密钥是如何产生的问题上?
通过查找对密钥地址进行引用的函数,我们可以得知密钥的产生位于sub_函数的代码中:
.text: ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text: sub_
proc CODE XREF: sub_ p
.text: var_18
= dword ptr -18h
.text: hKey
= dword ptr -0Ch
.text: hPubKey
= dword ptr -8
.text: dwDataLen
= dword ptr -4
0F0000000 dwFlags
1 dwProvType
.text:1004252A
offset pszP &Microsoft Enhanced Cryptographic Provid&...
.text:1004252F
0 pszContainer
offset phP phProv
ds:CryptAcquireContextA ; Acquire a handle to a particular
key container within a particular CSP
.text:1004253C
.text:1004253E
short loc_
edx, phProv
offset phK phKey
.text:1004254B
.text:1004254D
.text:1004254F
94 dwDataLen
offset pbD pbData
push hProv
.text:1004255A
ds:CryptImportK Transfer a cryptographic key
.text:1004255A
from a key blob to the CSP
short loc_
.text: loc_:
CODE XREF: sub_E j
ecx, [eax]
.text:1004256B
offset byte_101A8F68
0FFFFFFFEh
dword ptr [ecx+34h]
.text:1004257B
.text:1004257D
.text: ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text: loc_:
CODE XREF: sub_ j
eax, phProv
edx, [esp+18h+hKey]
.text:1004258D
push phKey
.text:1004258E
push hProv
[esp+28h+hPubKey], 0
.text:1004259B
.text:1004259D
[esp+28h+hKey], 0
ds:CryptGenK Generate random cryptographic keys
for use with the CSP module
.text:100425AB
.text:100425AD
short loc_100425FE
.text:100425AF
ecx, [esp+18h+hKey]
esi, ds:CryptExportK Export cryptographic keys out of
a cryptographic service provider
in a secure manner
eax, [esp+18h+dwDataLen]
.text:100425BD
push pdwDataLen
.text:100425BE
7 dwBlobType
CryptExportK Export cryptographic keys out of
a cryptographic service provider
in a secure manner
.text:100425CB
short loc_100425FE
.text:100425CD
edx, [esp+18h+dwDataLen]
push uBytes
ds:LocalAlloc
.text:100425DA
.text:100425DC
.text:100425DE
short loc_100425FE
ecx, [esp+18h+hKey]
eax, [esp+18h+dwDataLen]
push pdwDataLen
push pbData
.text:100425EA
.text:100425EC
7 dwBlobType
.text:100425EE
CryptExportK Export cryptographic keys out of
a cryptographic service provider
in a secure manner
short loc_
ds:LocalFree
.text:100425FE
.text:100425FE loc_100425FE:
CODE XREF: sub_D j
.text:100425FE
sub_+AB j ...
.text:100425FE
eax, [esp+18h+hKey]
.text:1004260A
.text:1004260B
ds:CryptDestroyKey
.text: ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text: loc_:
CODE XREF: sub_ j
eax, [esp+18h+hKey]
.text:1004261A
.text:1004261C
short loc_
.text:1004261E
.text:1004261F
ds:CryptDestroyKey
.text: loc_:
CODE XREF: sub_+FC j
[esp+18h+hKey], 0
.text:1004262D
edx, [edi+0Ch]
ecx, [edi+10h]
.text: loc_:
CODE XREF: sub_ j
short loc_1004263E
byte ptr [ecx], 1
.text:1004263C
short loc_
.text:1004263E ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:1004263E
.text:1004263E loc_1004263E:
CODE XREF: sub_ j
.text:1004263E
byte ptr [eax+ecx], 0
.text: loc_:
CODE XREF: sub_C j
short loc_
.text:1004264A
.text:1004264C
.text:1004264E
edx, [esi+eax*2+4]
.text:1004265A
.text:1004265C
.text:1004265E
short loc_
.text: loc_:
CODE XREF: sub_ j
short loc_
byte ptr [ecx], 1
short loc_1004266D
.text: ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text: loc_:
CODE XREF: sub_ j
byte ptr [edx+ecx], 0
.text:1004266D
.text:1004266D loc_1004266D:
CODE XREF: sub_ j
.text:1004266D
short loc_
.text: loc_:
CODE XREF: sub_E j
.text:1004267A
short loc_
.text:1004267C
esp, [esp+0]
.text: loc_:
CODE XREF: sub_ j
short loc_
byte ptr [ecx], 1
short loc_1004268D
.text: ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text: loc_:
CODE XREF: sub_ j
byte ptr [edx+ecx], 0
.text:1004268D
.text:1004268D loc_1004268D:
CODE XREF: sub_ j
.text:1004268D
short loc_
.text: loc_:
CODE XREF: sub_A j
ecx, [ecx+eax*2]
.text:1004269B
short loc_
.text:1004269D
ecx, [ecx+0]
.text: loc_:
CODE XREF: sub_ j
short loc_
byte ptr [ecx], 1
short loc_100426AD
.text: ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text: loc_:
CODE XREF: sub_ j
byte ptr [eax+ecx], 0
.text:100426AD
.text:100426AD loc_100426AD:
CODE XREF: sub_ j
.text:100426AD
short loc_
.text: loc_:
CODE XREF: sub_B j
ecx, [esp+18h+dwDataLen]
eax, [esp+18h+hPubKey]
.text:100426BC
push phKey
.text:100426BD
.text:100426BF
push dwDataLen
push pbData
push hProv
ebp, ds:CryptImportK Transfer a cryptographic key
from a key blob to the CSP
.text:100426CA
CryptImportK Transfer a cryptographic key
.text:100426CA
from a key blob to the CSP
.text:100426CC
.text:100426CD
.text:100426CF
ds:LocalFree
eax, [esp+18h+hKey]
.text:100426DB
short loc_
.text:100426DD
.text:100426DE
ds:CryptDestroyKey
.text: loc_:
CODE XREF: sub_BB j
short loc_
.text: loc_:
CODE XREF: sub_ j
sub_ j ...
.text:100426ED
edx, [eax]
.text:100426EF
offset byte_101A8F68
0FFFFFFFEh
dword ptr [edx+34h]
.text:100426FC
eax, [esp+28h+hPubKey]
short loc_1004270E
ds:CryptDestroyKey
.text:1004270E
.text:1004270E loc_1004270E:
CODE XREF: sub_E5 j
.text:1004270E
.text:1004270F
.text: ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text: loc_:
CODE XREF: sub_C6 j
eax, [esp+18h+hPubKey]
.text:1004271B
ecx, phProv
offset hK phKey
push hPubKey
8C dwDataLen
.text:1004272E
offset byte_101AE848 ; pbData
push hProv
CryptImportK Transfer a cryptographic key
from a key blob to the CSP
short loc_
.text:1004273A
eax, [esp+18h+hPubKey]
.text:1004273E
short loc_
ds:CryptDestroyKey
.text: loc_:
CODE XREF: sub_ j
.text:1004274A
.text:1004274B
.text:1004274D
.text:1004274E
.text: sub_
以上代码虽然稍长,我们分析后还是很容易了解其功能实现。大体上它可以分为以下几个步骤:
1) 通过CryptAcquireContextA 函数向CSP申请一个新的密钥容器。
2) 通过CryptImportKey函数把一段blob数据转换成密钥放入容器中。
3) 通过CryptGenKey函数生成一个随机的会话密钥或者是公/私密钥对。
4) 通过CryptExportKey函数导出密钥到申请的内存中。
5) 对内存中的密钥数据进行多重变换。
6) 重新通过CryptImportKey 函数导入内存中的数据到密钥容器中。
到此,我们只要详细分析并实现这些步骤即可以得到一个合法的密钥,然后通过调用相应的Crypto API 函数对加密数据进行解密,最后用zlib.decompress解压缩即可以得到我们需要的原始字节码。
美丽破船支持~~~~~~~~~~~
新年快乐哦·~~
wysea祝大家新年快乐!
chimney;): 新年快乐!
foxabuLZ想想如何编写decompiler比较实际哈。开个玩笑。不过呢可以LZ考虑把2.4 -〉的开源反编译工具升级一下。
PS,把python inject进去执行,直接调用即可,用不着解密这么麻烦。嘿嘿
acpp好好学习,天天向上。先发到10个帖子再说
dior蓝蓝支持~;):写的不错~
newkey如果做的好,应该没那么容易,blue.dll可能已经修改了很多,直接修改python的解码过程
linklcLZ 是怎么知道这是ZLIB的压缩算法的
nbw据说有个老外做EVE刷钱,赚了非常多,住上了别野,连门铃都是用的EVE的背景音乐
小子贼野据说有个老外做EVE刷钱,赚了非常多,住上了别野,连门铃都是用的EVE的背景音乐
钱途无量:3:
bbbsl据说有个老外做EVE刷钱,赚了非常多,住上了别野,连门铃都是用的EVE的背景音乐
老外不都是别野么?:o:
gddcxysqw拜读 顺便标记
nbw老外不都是别野么?:o:
不是的,老外穷人也很多。你啥时候也弄个别野出来我过去膜拜下。
kvllz他现在就是别野 这你都不知道?
forgot我记得直接解zip包啊}

我要回帖

更多关于 运行python脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信