比如说我写了三个py程序,main m1m2在main中导入了m1 在m1中导入了m2。那么,可以直接在main中用m2吗?

1.使用类似三目运算符的方式来实现一个数的绝对值 if else
# 输入一个数,然后利用一个语句求它的绝对值
#输入一个整数,判断是否在0~100之间
#python支持复合的条件表达式
3.字符和Unicode编码之间的转换
4.判断是否是回文字符串,类似这种"abcba"
  • 解析,判断思路,如果是回文的话,则其字符串反转之后和原来的字符串是相同的.
#使用切片的方式实现字符串的翻转 #如果翻转之后的字符串和原来的字符串相等,则是回文.
5. "字符串" * n 表示的是重复打印n次字符串.利用这个可以打印一个矩形框
#打印一个5*5矩形框,当使用一个字符串和一个数字用*联系起来的时候,表示的是重复.
6.一个字符串去除首尾两个字符的方法.
  • 在字符串中,下标-1代表最后一个字符的下标,同时len(s) - 1也代表最后一个字符的下标.
#输入一个字符串,去除字符串的收尾两个字符
#方法一,利用最后一个下标的值是-1,来进行切割
#方法二,利用最后一个下标的值是len(s) - 1,来进行切割
    fillchar参数是可选的,如果不填,则默认用空格填充.
    返回值,这个函数返回一个长度为width的新字符串,原来的字符串居中显示,两边的用空格或者fillchar填充
# 输入三行文字,让这三行文字在一个方框内居中显示
# 如输入(不要输入中文):

1> 首先是求出最大的字符串长度,确定它的宽是len + 2个空格
2> 然后让所有的字符串居中打印即可.

  • 带有fillchar参数的例子,注意当width没有原来的字符串长度大时,原字符串原样返回.当width两边的剩余为奇数时,则左边会比右边的少1个.
8.已知一个字符串,打印这个字符串中的Unicode码最大的字符,以及它的Unicode码时
  • 分析循环遍历字符串,先假设最大的字符的Unicode码是max_ch,然后循环比较即可.利用ord()
#先设定最大的字符的unicode码为0
9.列表的前面插入数据,中间插入数据,后面插入数据,以及删除尾部操作演示
# 用索引和切片操作将原列表L 改变为: # 将原列表反转, 删除最后一个元素 #先利用列表索引切片赋值插入4,注意这里赋值相当于是插入操作,在原列表上进行的. #然后在列表的头部插入[1,2] #在5的后面插入6,也就是最后面
10.使用列表的方法生成40个斐波拉切数.
  • 始终用列表的最后两项作为斐波拉契数的最后两位.有三种方式,其中最简单的一种就是利用下标-1和-2
#生成40个斐波拉切数,利用列表
 L = [1,1] #先声明一个列表存放前两项
 #用a和b代表最后两项
 #然后让a,b还是最后两项
11.将用户输入的带有数字的字符串转换为数字列表.
#先将字符串按逗号进行分割,得到的是一个字符串列表 #利用列表推导式,将每一项转换为int #以上的代码也可以简化为一行 #还有一种笨重的方法,使用循环来做.
    方法2.使用count(x),判断这个元素出现的个数
    方法3.使用集合,集合具有自动去重功能
#方法1,in 和 not in.遍历L,如果元素不在L2内,就追加上去 #使用列表推导式,这里是无序的.
13.统计字符串中出现过的字符,以及每个字符出现的次数.
    方法1. 将字符串去重放入列表中,遍历这个列表,然后使用count每个字符出现的个数.
    方法2.可以使用字典,将字符作为字典的键,因为键是不能重复的,而个数就一直累加就可以了.
#统计字符串出现的字符,以及各个字符出现的次数
#去重然后遍历,无序的.
#如果按照出现的顺序,可以使用列表
14.单词和解释(字典的使用)
  • 输入单词和解释,将单词和解释存放起来,然后输入一个单词,查询单词对应的解释.如果输入空的时候,结束输入
#先创建一个字典用来存放单词的和解释 # 如果输入为空,结束录入
15.判断100到999之间的水仙花数,水仙花数是指个位的三次方,十位的三次方和百位的三次方的和等于自身.
    方法1,最原始的方法,求出个位数,十位数,百位数,然后做运算即可.
    方法2,将数转换为字符串,然后通过取字符串的各个值,即可取到相应的位的值
#先使用笨方法,将这个数的个十百提取出来 #十位,对100求余数,然后地板除10 #百位,直接对100地板除 #判断条件,如果是满足条件就返回True #利用字符串,字符串的三个元素就是对应了个十百位上的数
16.按行打印100以内的全部素数,利用函数来做
  • 使用函数,以及print函数的end的用法.2是素数
# 打印100以内的素数
17.python的局部变量和全局变量

定义在函数内部或函数形参的变量为局部变量.
局部变量只能在函数内部使用,首次对变量赋值时创建了局部变量,再次赋值的时候修改了绑定关系.
函数调用时被创建,函数调用结束之后销毁.

定义在函数外部,模块的内部的变量称为全局变量
所有的函数都可以访问全局变量,但是在函数内部不可以直接访问,必须事先用global声明,否则会被当成创建了一个局部变量

1> 全局变量在函数内部首次使用的时候,要加上global声明,否则会被当成是局部变量的声明和创建
2>局部变量只能在声明他的函数的内部访问,而全局变量则可以在整个模块内访问.


global y #这里是错误的,因为全局变量在声明之前被赋值了. global v #这里是错误,形参不能声明为全局变量. #一个变量不可能同时被声明为全局变量和形参变量.
    globals()和locals()函数返回的是一个字典,里面存放的是变量名和变量值的键值对.
    其中globals()返回的是当前模块所有的全局变量,不仅仅局限于你自己使用的全局变量.
  • 函数名就是变量,它在创建的时候可以绑定一个函数名.函数变量还可以改变绑定关系.
  • 函数变量使用()的调用方法,可以调用它绑定的函数.

先查找本地变量 -> 包裹这个函数外部函数的内部变量 -> 全局变量 -> 内置(内建)变量
本地变量在赋值的时候一般会创建或改变本地变量.

告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
1)nonlocal语句只能在被嵌套的函数内部使用
2)访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作
3)当有两层或两层以上的函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作
4)nonlocal语句的变量名列表里的变量名,不能出现在此函数的形参列表里.

#nonlocal语句只能使用在嵌套函数的内部函数,如果没有外部函数,则nonlocal语句会报错
#如果有多层,就近选择最近的层.
#创建一个两个数和的匿名函数,创建一个两个数差的匿名函数 # lambda依托于后面的表达式,并且表达式的结果只有一个 #后面只有是个合法的表达式都是可以的
#eval计算表达式的值

前两个输出跟上面解释的eval函数执行过程一样,不做过多解释。关于最后一个数字34,我们可以看出是:x = 1, y = 3是没有疑问的。关于z为什么还是30而不是4,这其实也很简单,我们只需要在理一下代码执行过程就可以了,其执行过程相当于:

  • 再来一个实例,eval()的参数问题
v = eval('x + y',{'x':1})#第二个参数必须是字典,并且必须包含表达式里的所有的元素
  • 函数式编程(函数可以作为参数插入另一个函数,还可以返回一个函数)

1> 特点1: 函数名也是一个变量,可以赋值给一个变量
2> 特点2:函数可以作为另外一个函数的参数出入
3> 特点3:函数可以作为另外一个函数的返回值.

用每一个函数完成完成细小的功能,然后一系列函数任意组合之后可以完成更大的功能.

当一个函数在运行时,不读取或改变除局部作用域以外的其他变量的时候,此函数为可重入函数.可重入函数有一个特性,如果每一次的参数一样,则其结果也是一样的.

    满足下列条件之一的即为高阶函数

1> 函数接收一个或多个函数作为参数传入
2> 函数的返回值依旧是一个函数

用函数和可迭代对象作为参数,用函数的返回值重新生成一个新的可迭代对象作为返回值.

function的参数的个数必须和后面的可迭代对象的个数一样.并且迭代调用结束的标志是可迭代参数有一个迭代结束就停止

# (用函数式和高阶函数map实现) #生成可迭代对象it,里面存放的就是各项的平方 # 以上代码可以简化为一行 # 可以使用匿名函数代替mypow #可以使用sum(iterable) 一个可迭代对象的求和公式

对iterable进行过滤,将iterable作为参数依次传递给function,如果function的返回值为True,就保留,如果为False就丢弃掉.然后将保留的数据作为一个可迭代对象返回.

#写一个过滤器求出100~200之间的所有的素数的和

默认升序返回一个新的列表包含了按照指定规则所有项目的迭代.不改变原来的可迭代对象

iterable可迭代对象,key排序规则,将可迭代对象带入key绑定的函数,按照结果进行排序,还可以指定可迭代对象的同一位置进行排序.reverse表示的是排序是否按照降序排列
reverse排序规则,False默认是升序排序,如果为True,表示的是降序排列

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。


  • key是一个方法,默认值是None,用来指定具体的排序算法;sorted对可迭代对象的每个元素使用key算法后再排序,返回一个排序后的可迭代对象。

# 按年龄排序,以列表元素tuple的第3个索引排序,升序排序
# 字符转换成小写后再排序,'a'和'A'值一样
#将names的内容按照每个元素的倒叙的排列顺序进行排列
    在嵌套函数中引用了自由变量的函数.这个自由变量就是外层嵌套函数中的变量(非全局变量).

1> 必须有嵌套函数
2> 内层嵌套函数必须引用外层函数的变量.这个变量就是自由变量
3>外层函数的返回值必须是内层函数

嵌套的内层函数可以使用外层函数中的局部变量,即使外层函数返回了,或者外层函数被删除了,内层函数依然可以使用外层函数的那个变量.

# 闭包,fn使用了变量y并且外层函数make_power的返回值是fn(内层函数)
# 这个闭包可以实现x的y次方
 #自右变量就是y,当函数make_power返回后,fn()依旧可以使用y的值
#假如让起实现平方的功能
"""闭包的作用: 当外部函数返回了, 外部函数的局部变量还可以被内部函数引用""" #当删除了fun_closule对象后, 外部参数还可以被内部函数引用.
  • 并且发现tmp内部函数和它的内存地址相同,即closule只是这个函数对象的一个引用。

  • 闭包的应用 (装饰器)

装饰器是一个函数,它用来包装另外一个函数.使得被装饰的函数在不改变原来代码的情况下添加新的功能.
装饰器的概念首先要明白两点:
装饰器函数是用被装饰的函数作为参数来实现的.将被装饰的函数带入到装饰器函数得到的返回值就是装饰过后的函数.

# 装饰器函数.以被装饰的函数为参数,返回内层函数.
#在内层函数内可以实现对被装饰的函数的功能的添加
# myfunc()函数前面加了装饰器,相当于是被装饰的函数的绑定对象改变了.
# 相当于是调用了如下代码:
# 将被装饰的函数作为参数传给装饰器函数,然后重新绑定了装饰器函数的返回值
  • 下面通过示例演示装饰器的好处
2.如果想要记录这个函数的执行时间,最初始的方法是入侵到原来的函数进行修改
# 计算一个函数的运行的时间,最暴力的方法
3.如果想不侵入原来代码,可以将原来的函数作为参数放入另外一个函数中.
#不改变原函数的代码的情况下统计函数执行所需的时间 #不改变原来的函数功能,但是每次都要执行该函数 #这里要统计时间的时候,每次都要调用deco()函数
  • 这样也有一个问题,就是每次要完成统计功能的时候都要调用deco()函数.
4.使用装饰器,既不改变原来函数的功能,又不需要重复调用deco()函数
# 既不需要入侵原函数,也不用重复调用
 
#声明myfunc()是一个装饰器函数

这里的deco函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数。其中作为参数的这个函数func()就在返回函数wrapper()的内部执行。然后在函数func()前面加上@deco,func()函数就相当于被注入了计时功能,现在只要调用func(),它就已经变身为“新的功能更多”的函数了。所以这里装饰器就像一个注入符号:有了它,拓展了原来函数的功能既不需要侵入函数内更改代码,也不需要重复执行原函数。

6.带有多个不定参数的装饰器
#带有不定参数的装饰器
7.如果要为函数添加多个功能,这时就需要为函数添加多个装饰器
25.python中有几种跳出双重循环的方法
  • 运用函数的return语句,把for循环封装为一个函数
  • 定义一个标志位,当内层循环结束的时候,同时结束外层循环
# 先判断标志位,是否要继续进行循环 # 内层循环更改标志位的值,通知外层循环可以终止
  • 用 break 关键字终止当前循环就不会执行当前的 else 语句,而使用 continue 关键字快速进入下一轮循环,或者没有使用其他关键字,循环的正常结束后,就会触发 else 语句。


  • 大体上分为三种(位置传参和关键字传参以及综合传参)
    位置传参又包含普通位置传参和序列传参(也是位置传参的一种)
    关键字传参又包含普通的关键字传参和字典传参
    综合传参是以上传参的方式混合使用
1.位置传参(实参和形参按照对应的位置进行传参)
2.序列传参(将实参序列按照*进行拆解,然后按照对应的位置进行传参)
3.关键字传参(按照形参的名称对形参进行赋值,实参和形参一一进行匹配)
# 此示例示意关键字传参
4.字典传参(是指实参为字典,将字典用**进行拆分后按照关键字传参的方式)

1> 字典的键名和形参名必须一致,字典的键名要在形参当中
2>字典的键名必须为字符串

# 此示例示意字典关键字传参
  • 函数的传参方式在能够确定形参能够唯一匹配到当前实参的情况下可以任意的组合.

位置传参在前,关键字传参在后.

myfunc(*"AB",300)#正确,前面是星号序列传参,位置传参,后面也是位置传参
  • 列表推导式 + filter + lambda 表达式实现数据列表的奇数和偶数分离
# 创建一个列表存放输入的数据,然后将数据按奇数和偶数分离成两个列表,返回给主函数
 # 存放输入的数据列表,这里我们直接生成
 # 将这个列表拆分成奇数和偶数列表,filter返回的是一个可迭代对象

1> 调用的时候可以不提供参数,使用默认的缺省参数就可.
2>缺省参数必须从右到左边依次存在,如果一个参数是缺省参数,则它的右边必须全部是缺省参数.
右边可以有可变参数,命名关键字参数,字典双星参数.
3>缺省参数可以有1个或多个,甚至可以全部是缺省参数.

*收集多余的位置传参.

  • 写一个函数可以接收n个参数,然后返回这些参数的和
# args实际上是一个元组

作用:强制*后面的参数必须是关键字传参.字典传参也是关键字传参的一种

    作用: 收集多余的关键字传参
# 双星号字典形参的用法
 ''' kwargs是一个字典,里面用键值对的方式存放了参数名称和对应的值
 作用就是收集多余的关键字参数
# 多余的关键字传参的个数是: 3
# *args是星号元组传参,会收集前面n个位置传的形参,a必须是命名关键字形参.
    python中参数传递的一般顺序是:
    位置传参 > 默认参数 > 星号元组传参 > 命名关键字传参 > 双星号字典传参

Python中的模块是一个以.py结尾的文件,里面包含了Python的对象定义和语句定义.
使用模块,可以让我们的代码的逻辑更加的清晰,使得代码的书写更加的规范.我们可以将我们的类
函数,语句,变量定义到一个模块当中,同时也可以使得代码的复用更加的简单.

在解析器的内部就可以直接使用
安装python时已经安装直接可以使用
需要自己安装之后才可以使用
需要自己手动导入才可以使用
将一个模块整体导入到当前模块
导入模块的1个或多个属性
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...

  • 斜阳拉倩影,月度几人秋? 悄问同心锁,生生世不休。 ——柳公子 新韵 平起

  • 人生在世,就算不牛逼,可总还是想要装逼的吧T-T。这几天因为一直装逼不成,所以打算起码要写一篇如何牛逼的文章装下逼...

  • 吃饱了,就要躺着风里消化,不能大动,累的慌![抠鼻][抠鼻][抠鼻] 错峰出行,没人用院子的时候,自己一个人享用,...

  • (1)积分当函数,利用函数思维 (2)积分当积分,利用积分技巧 变量替换分部积分一二重积分互相转化 例:(二重)证...

我正在尝试流式传输.WAV文件,同时去除其中一个声道,以便它只在一个扬声器上播放,同时降低音量。 我使用PyAudio的原因是我必须能够 一次传输多个文件 播放特定扬声器的声音(左/右) 中断播放声音文件 并且找不到允许这些功能的任何其他Python库。 我有以下代码,修改自PyAudio的流示例。它从一个扬声器播放WAV文件,但我无法找到以任何方式修改音量的方法。 ..

我构建了一个用于语音识别的Django应用程序,该应用程序使用用户的麦克风录制音频,然后将其转换为文本。它在本地运行得很好,但当我尝试在Heroku中部署它时,它给出了一个错误,即Pydio无法安装和 命令“GCC”失败,退出状态为%1。 我使用的是/Uberi/speech_recognition/issues/20 /repo ..

对于项目工作,我需要通过录制的音频文件或使用麦克风实时录制来测量音量。经过初步研究,我尝试使用声音文件库。使用soundfile读取该文件,并使用20*np.log10(np.sqrt(np.mean(np.absolute(a)**2)))计算了dB值。我得到了声音文件的负值。但是正常的声音可能在50-70分贝的范围内,我得到的是负值。有人能帮我解决这个问题吗? 推荐答案

我不知道如何解决这个问题.请帮帮我:) 我想将一台 PC 录制的声音数据发送到另一台 PC 并播放.(通过 UDP) 程序可能正常运行,但声音包含(?)不舒服的噪音.当我试图记录 &在一个程序序列中播放声音,它工作正常.没有噪音.如果即使在一台 PC 上使用 UDP,使用 IP 127.0.0.1,就会出现噪音.起初,我认为这是因为播放的声音在另一台 PC 中出现了,我通过制作缓冲区来 ..

我想禁止运行可执行文件的函数产生的所有终端输出. 我试图通过使用上下文管理器来抑制 Python 函数的输出,该上下文管理器在每次调用函数时都会临时重新定义 stdout 和 stderr.这会抑制函数中 print 调用产生的终端输出,但当函数调用产生终端输出的可执行文件时,它似乎不起作用. 那么,如何抑制 Python 函数调用的可执行文件的输出呢? 我的代码如下.我已经包含

通过 PyAudio 录制音频时,如何指定要使用的确切输入设备? 我的电脑有两个麦克风,一个是内置的,一个是通过 USB 的,我想用 USB 麦克风录音.流类有一个input_device_index 用于选择设备,但尚不清楚该指数与设备的相关性.例如,我怎么知道哪个设备索引 0 指的是?如果我不得不猜测,我会说 0 指的是内置设备,而 1 指的是 USB 设备,但我想找到一些程序化的方式来 ..

我写了一个小程序,它记录麦克风的声音并通过网络发送并在那里播放.我正在使用 PyAudio 来完成这项任务.它几乎可以正常工作,但在两台计算机上,我都收到来自 ALSA 的错误消息,表明发生了欠载.我在谷歌上搜索了很多,现在我知道什么是欠载了.但我仍然不知道如何解决这个问题.大多数时候声音很好.但是如果发生欠载,这听起来有点奇怪.在我的代码中有什么我应该注意的吗?感觉就像我犯了一个简单的错误,我很 ..

无事就翻翻大师傅们的博客,然后看到了一篇关于Stegosaurus隐写的,然后延伸到Python的import模块导入等部分知识。 于是开始学习延伸更多。

Stegosaurus是一个隐写工具,它是通过将payload隐藏在Python的字节码文件中。而且不会改变源代码的运行行为,也不会改变源代码的大小。
Payload 代码会被分散嵌入到字节码之中,所以类似 strings 这样的代码工具无法查找到实际的 PayloadPythondis 模块会返回源文件的字节码,然后我们就可以使用 Stegosaurus 来嵌入

pyc文件是python的字节码文件,是二进制文件,就是Python源文件在经过解释器编译后生成的字节码文件。现在实验一下。
在linux平台实验。

创建一个py文件,内容

执行一下,成功执行后,再看目录下文件,到那时没发现pyc文件

执行成功后,发现打印了两行,而且出现了一个文件夹__pycache__

在执行python3 m0re.py时,第一条命令是import test先导入test模块,一个模块在被导入时,PVM(python虚拟机)会在后台从模块包里面搜索test这个模块。Python 中所有加载到内存的模块都放在

1、 在当前目录下搜索这个模块
2、 在环境变量中PYTHONPATH中指定的路径列表依次搜索
3、在Python安装路径中搜索

sys.path返回导入模块时搜索路径集,是一个list列表

1、 从上面列出的目录里依次查找要导入的模块文件
3、 列表中的路径的前后顺序表明了python解释器在搜索模块时的前后顺序。

import只能导入模块,不能导入模块中的对象(类、函数、变量等)python不能像Java那样,直接通过import来导入某个对象或者类以及某个函数。

python的方法是这样的

importError,导入失败,这样导入是存在问题的。

所以这个程序的执行流程为

同样的,检查缓存中是否存在<module m0re>,因为m0re.py还正在执行,所以缓存中还没有这个module,同样是要创建新的module,然后就是再次执行m0re.py中的代码

当导入的模块与标准库中的模块重名,在导入时会发生覆盖导入,因为python解释器会首先在当前文件夹下搜索查找模块名。这里用一段代码来解释。创建random.py写入下面内容。

在导入包时,python解释器在当前目录下找到了random,就直接导入。不会进行下面的搜索。我们知道Python的标准库里面的random模块是存在randint方法的。然而,这里运行的话,会报错AttributeError

import默认就把本身作为模块导入,那么显然代码中没有randint方法,所以会导致报错;

经过多次测试,并不是所有的冲突都会出现。
比如下面这个例子time.py

这两个例子在网上查阅资料,是无法运行的,我的可以运行。
不止这两个,为了找个运行不起来的反例,我也是查阅了好多博客。
如果出现错误,解决办法那就是改下文件名,尽量避免命名与python文件内调用的模块重复。

无论是相对导入还是绝对导入,都是需要一个参照物的的。而绝对导入的参照物就是项目的根目录。

在一个目录中有下面的结构:

m0re作为根目录,如上图

绝对路径要求我们必须从最顶层的文件夹开始,为每个包或每个模块提供出完整详细的导入路径。

现在的python3.x中,绝对导入是默认的导入形式。它的优点是很明显的知道要导入的包或者模块在什么位置。

那么问题来了,如果导入包的话,顺序是什么?

这里重新构造一个目录如下

通常情况下,首先从根目录开始导入,所以第一步是写个test.py文件导入模块

先导入m0re,然后sys.module会创建dir1dir1.m0re两个模块,然后m0re.py中的函数就可以调用了。但是dir2中的函数不能调用,因为只是存在dir1这个模块,模块中关于dir2的内容还是空的。

执行import dir1.dir2后就可调用dir2中的函数了,此时的dir2算是被载入内存中了。

as 的作用就是,m1dir1.dir2.module1等效。作用一样。都可以进行调用内存中module1模块中的函数。

下面的三条语句都可以实现了。

一般都使用绝对导入,而相对导入使用不方便,很容易发生混乱,导致程序报错。

说了那么多,还是把之前引起思考的那个题目的知识点总结一下。bugkuCTF的题目QAQ

题目wp就不重复了,然后就是那个工具,Stegosaurus在github的项目地址为:

使用方法学习一下,以便自己以后查看。

-s #不覆盖,再生成一个文件,为隐藏信息后的文件。保留原来的文件 -r #查看这个文件,最多成隐藏多少字节的数据 -v #查看隐藏信息的详细过程,使用次数决定详细程度,一般使用两次就够-vv

单独列出,-e EXPLODE,为什么单独列出来这个,因为在github项目中,readme.md中没有这个参数,在本地执行确发现多了这个参数。

这个工具使用的话,按照github上面的使用方式使用,无法运行。报错如下:

多次尝试发现:只有-x参数可以正常使用。

其他参数无法使用。使用就会报错。猜想可能不是所有的python文件都可以隐藏payload

当然,猜想错误,pypycpyo文件均可隐藏信息。那这个报错怎么解决?

Google一下,发现答案就在项目中。

应该是python版本的问题,python3.6是没有问题的 ——作者

而作者打包的那个bin文件,是直接调用的python3.6(这个后面会提到,请继续看),我的windows主机是3.7,而我实验用的kali默认是3.8,所以才造成都无法使用的结果。
按照作者大大的办法,排除问题。

继续学习这个工具的参数

上面是隐藏前,发现可以插入的地方。然后下面的部分是隐藏后,最后生成的文件是m0re.cpython-36-stegosaurus.pyc,注意这里生成的pyc文件,cpython-36,可以看出是python3.6解释器解释生成的文件。所以上面说的作者打包的bin文件是直接调用python3.6的解释器的。
-e EXPLODE经过多次测试发现,这个参数后面还需要加上参数,并且这个参数是整型的,所以payload可以为

不是很理解这个参数,理解能力有点欠缺。下面说一下我的试验结果吧。
1.当payload > Carrier can support的长度,无法隐藏,可以使用这个参数,限制一下长度,不同宿主文件,可以隐藏的payload长度不同,因为代码中无用空间的大小不同,测试出来参数代表的长度也不一样。

学习到很多知识,首先是工具的使用,涉及到Python中import包的几种导入方式的详细过程。写这篇文章花了挺多的时间和心思的,还有许多不足之处,可能是我没理解到的,还请师傅们多多指点。


我要回帖

更多关于 py web 的文章

 

随机推荐