我们可以使用Cython、Nuitka对代码进行打包,编译成.so文件、.dll文件或者是可执行文件,从而在一定程度上避免别人看到你的源代码。...我在字节的时候,内部的一个系统就是使用Cython打包的,然后部署到客户的服务器上。 Cython、Nuitka在打包大型项目时,需要写大量的配置文件甚至是额外的程序,有一定的使用成本。...如果你对安全的要求并没有那么高,那么其实你只需要对Python代码进行混淆,就能防止自己的代码被人轻易看到了。 我们可以使用Pyminifier来对Python代码进行混淆。...由于这个程序的代码很久没有更新了,因此如果你的Python版本比较高,那么需要首先降一下setuptools的版本,然后再安装pyminifier: pip install "setuptools<58.0.0..." pip install pyminifier 安装完成以后,我们来对代码进行混淆,执行如下命令: pyminifier --nonlatin --replacement-length=50 main.py
在保护Python代码安全方面,有多种混淆工具可供选择,包括 Cython, Nuitka, Pyminifier 和 IPA guard。...这些工具能够将 Python 代码转换为二进制文件或混淆代码,提高代码的安全性。然而,需要注意的是,混淆并不能完全阻止专业攻击者对代码的分析,因此在选择工具时需综合考虑实际安全需求。...优点: 编译后的二进制文件不易被逆向工程分析,提高了代码的安全性。 缺点: 需要编写额外的配置文件或程序,处理大型项目时可能较为复杂。...Pyminifier 特点: Pyminifier 是一个简单易用的 Python 代码混淆工具,可通过 pip 安装并使用命令行操作。 优点: 操作简单,可快速对代码进行混淆。...开发者在选择混淆工具时,应根据实际需求和项目规模综合考虑,选择最适合的解决方案。同时,定期更新和维护混淆策略也是保持代码安全的重要措施。
主要有以下几种模式: 全缓冲模式(Fully Buffered): 数据只有在缓冲区满时才会被刷新到屏幕上。通常用于文件I/O。...行缓冲模式(Line Buffered): 当遇到换行字符(LF, \n)时,缓冲区内容会被刷新到屏幕上。常见于终端I/O。 一些标准输出流(如stdout)在连接到终端时默认使用行缓冲模式。...在行缓冲模式下: 当输出流遇到换行字符时,缓冲区的内容会被立即刷新到屏幕上,从而实现行缓冲的机制。 在许多现代终端和编程环境中,输出一个换行字符通常意味着会将当前行的数据刷新到屏幕。...输出回车字符后,下一次的输出会从行首开始,覆盖当前行的内容。 3、换行回车在屏幕缓冲区中的作用 行缓冲模式:换行字符(\n)会触发缓冲区刷新,将内容显示到屏幕上。...回车字符(\r):不触发缓冲区刷新,而是移动光标,通常与手动刷新缓冲区结合使用,以实现动态行更新。 缓冲区刷新模式(全缓冲、行缓冲和无缓冲)控制了何时将数据从缓冲区刷新到屏幕。
事实上,这就是 print 函数真正所做的;它会在正打印的字符串后面加上回车换行符,并调用sys.stdout.write。...始终在重定向 stdout 之前保存它,这样你可以在后面将其设回正常。 打开一个新文件用于写入。 将所有后续的输出重定向到我们刚打开的新文件上。...这样只会将输出结果“打印”到日志文件中;在IDE窗口中或在屏幕上不会看到输出结果。 在我们将 stdout 搞乱之前,让我们把它设回原来的方式。 关闭日志文件。...将我们新打开的日志文件的文件对象赋给 stderr 重定向标准错误。 引发一个异常。从屏幕输出上我们可以注意到这样没有在屏幕上打印出任何东西。所以正常跟踪信息已经写进 error.log。...我们所做的全部是在函数的开始处添加三行代码,用来检查是否 source 是“-”,如果是,我们返回sys.stdin。实际上,就是这样!
随着研究的深入,此文章会进一步更新,目前我们所知道的有: 新型Apache Struts 目标为Windows和Linux系统 Zealot的攻击复杂,多平台,且及其模糊 Zealot利用的服务器均有以下两种漏洞...图5 内置64进制编码的 python代码 Little Snitch 和未知类别 可以看到,这个python代码会检查是否“Little Snitch” 进程是否在执行(“Little Snitch”...图8 在HTTP响应中应用的 RC4解密路径 Windows 被利用后 如果检测到Windows,STRUTS 载荷会通过一种隐蔽的方法运行一个PowerShell interpreter,即64进制编码的代码...该脚本使用“pyminifier”进行混淆,这是一个Python代码最小化,混淆和压缩的公共包。原脚本是一个64进制编码的脚本,压缩过20次。...随着漏洞利用在windows设备上的进行,它会下载 “zealot.zip” 和“raven64.exe”文件。
主要有以下几种模式: 全缓冲模式(Fully Buffered): 数据只有在缓冲区满时才会被刷新到屏幕上。通常用于文件I/O。...回车字符(\r):不触发缓冲区刷新,而是移动光标,通常与手动刷新缓冲区结合使用,以实现动态行更新。 缓冲区刷新模式(全缓冲、行缓冲和无缓冲)控制了何时将数据从缓冲区刷新到屏幕。...综合使用换行和回车字符,可以实现灵活的终端输出效果,特别在实时显示和动态更新场景中非常常见。 从您提供的代码来看,您有两个几乎相同的代码块,但你希望了解的现象可能是与终端缓冲和输出可见性相关的。...如果你希望在没有换行符的情况下立即刷新输出缓冲区,可以在 printf 后调用 fflush(stdout): 修改后的代码块2: #include #include stdout) 确保输出立即可见,尤其是在待运行一段时间的代码(如 sleep())之后进行输出时。
以一个开源项目pyminifier (https://github.com/qiyeboy/pyminifier)来说明混淆的技巧方法,这个项目已经有4年没更新,有一些bug,但是依然值得我们学习和入门...- 用于混淆Python 代码 token_utils.py - 用于收集Python Token 从项目代码中,可以看到pyminifier的混淆方法是基于Token的,即基于词法分析,假如大家之前做过混淆的话...n' 代表所在的行 Token还原代码 能从源文件中提取token 列表,如何从token列表还原为源代码呢?...在pyminifier中,有两个缩小Python代码的方法:一个是精简方式,另一个是使用压缩算法的方式。...精简 在minification.py中使用的是精简方式,具体代码如下: def minify(tokens, options): """ Performs minification on
本应该打印在显示器中,但是打印到在指定文件中,这种技术叫做重定向。...在C语言层面对应的struct FILE*对应的结构体除了_fileno还有语言级别的文件缓冲区,在使用printf/fprintf时,并不是通过1号文件操作符将数据直接写到操作系统内部,而是直接写入对应的语言级别的文件缓冲区里...如果你运行这段代码,你将看不到hello world的输出在终端上,而是在log.txt文件中。...当在使用fork时,write数据已经写到操作系统内部,乃至硬件上,但是printf和fprintf的消息依旧在语言级别的stdout对应的缓冲区中。...具体地说,1>表示将stdout重定向到文件all.txt,2>&1表示将stderr重定向到与stdout相同的位置,即all.txt文件。
一个节点(索引节点)是在一个表项,包含有关文件的信息(元数据),包括: 文件类型,权限,UID,GID 链接数(指向这个文件名路径名称个数) 该文件的大小和不同的时间戳 指向磁盘上文件的数据块指针 有关文件的其他数据...(3) 链接数:硬链接会增加链接数,软链接不增加。 (4) 节点编号:硬链接相同,软链接不相同。 (5) 删掉原始文件是否会影响到链接文件?...,但打包的数据不是记录到文件,而是传达到stdout,经过管道后,将tar -cvf- /home 传送给后面的tar -xvf-,后面的这个- 则是取前一个命令的stdout,因此,就不需要使用临时file...复杂管道的故障排除 -同时查看和记录输出 文件查找 在文件系统上查找符合条件的文件 文件查找:locate,find 非实时查找(数据库查找):locate 实时查找:find Locate命令 locate...,[],[^] -iname“文件名称”:不区分字母大小写 -inum n 按inode号查找 -samefile name 相同inode号的文件 -links n 链接数为n的文件 -regex “
所以如果包含\n的话立即打印到显示器上 如果不包含的话改字符串不做刷新,要么程序要么结束自动刷新,要么我们进行强制刷新的操作 如果我们想让不带\n的消息进行刷新的话怎么办呢?...那么我们就进行主动刷新的操作 我们在代码的后面加上fflush(stdout);就行了 输出后我们立即进行刷新,将我们的数字显示出来 但是我们发现我们的数字一打印完就会消失了,光标一直回到开头 最后被命令行覆盖了...随着进步不断增加,我们括号中的#就会增加,右边的数字也是显示的进度 然后右边的斜杠就是我们的光标移动 我们这里声明在.h文件中,实现在.c文件中,然后我们在main.c中进行编译操作 我们将我们的Makefile...不推荐使用(现代 POSIX): 在 POSIX.1-2008 标准中,usleep 已被标记为不推荐使用(deprecated),建议使用更精确的 nanosleep 或 clock_nanosleep...~ 但是我们这个进度条的右侧的中扩号不是固定的,而是随着#的增加而往右边进行移动的 所以我们必须预留出足够大的空间来进行#的填充操作 所以这个右括号不应该随着进度条的移动而移动 我们将代码改成这样子
它将光标移动到当前行的开头位置,但不移动到下一行。 【功能】:在Linux系统中,\r通常用于在同一行上连续输出不同的内容。如果有新的字符输入,它们将覆盖已存在的字符。...这使得在同一行内更新文本内容成为可能。 在制作进度条等动态文本输出时,\r非常有用。通过不断更新同一行的内容,可以创建出动态的视觉效果。...标准输出流是一个缓冲流,当数据写入到标准输出流时,并不会立即显示出来,而是先存储在缓冲区中,当缓冲区被填满或者手动调用fflush函数时,才会将缓冲区的内容刷新到显示器上。 3....上打开vim编辑器创建progress.c代码,将上述进度条代码写上去,然后使用make/makefile工具搭配gcc的使用,将progress.c编译成可执行文件progress,然后在命来行输入....所以对于进度条代码,我们可以将其设置我们喜欢的颜色,只需要在循环打印前后设置和取消字体颜色,代码如下: 然后我们使用make命令重新编译progress.c源文件: 运行结果如下: ✨模拟真实下载速度的进度条
使得无论操作对象是普通文件、目录、设备,用户都可以通过相同的文件系统与之交互。...这些个文件提供统一的文件操作接口(write、read、open、close等),无论操作对象是键盘、鼠标还是其他什么硬件,用户都可以通过相同的接口与之交互。...2.缓冲区的刷新策略 通过以下代码观察缓冲区: 在程序sleep的十秒之间printf不会打印,等sleep结束后才会打印。 注意printf没有带\n。...3.用户级缓冲区 引子——观察下列代码在bash不同指令下的执行情况: 1 #include 2 #include 3 #includestdout默认采用的是行刷新,在进行fork之前三条C函数已经将数据打印到显示器上了,FILE中不在存有相应数据了; ②如果我们进行了>,写入的文件不再是显示器,而是普通文件,采用的刷新策略也不再是行缓冲而是全缓冲
C++时,使用C++风格的C语言代码 int main() { //C语言 printf("hello printf->stdout\n");//...,来完成对应的读写,不关心底层的差异化 操作系统也有自己的wirte和read,本质上是拷贝,将应用层的数据拷贝到缓冲区里,在调用底层不同设备的方法,所以看起来就是Linux下一切皆文件 4....me,打开新文件发现本来应该打印到显示器的内容,打印到log.txt中了 本来应该打印到显示器上的内容,打印到文件里 ,这种现象叫做重定向 ---- 在文件描述符表中,最小的,没有被使用的数组元素分配给新文件...,这叫做输入重定向 追加重定向 关闭文件描述符1后,导致printf不会打印在显示器上,而是追加到log.txt文件中 运行可执行程序,无显示,都追加到log.txt文件中 ---- 重定向函数...,打印出三行信息,说明重复打印了 ---- 若将fork函数注释掉后,发现 两者显示结果相同\ ---- struct FILE除了会封装fd之外,还会预留一部分输出缓冲区 当把字符串想写入stdout
重定向 一、重定向的解释 还记得上面我们在测试代码时候 close(1) 后我们再怎么使用 printf() 函数都没有用了吗,这里我们就来解释一番: 其实是因为 printf 默认就是向显示器中打印内容数据...,而当我们把 stdout 所对应的在 fd_array[] 中的位置置空了之后,我们这个进程就无法找到 stdout 这个文件了,这个时候自然就没办法向屏幕打印内容,接下来我们看下面的代码: #include...} 通过上述运行结果我们能看到信息没有打印在屏幕上面,反而是打印到了或者说是拷贝到了 log.txt 中,这其实不奇怪,因为我们 close(1) 之后,fd_array[1] 就空了,那么新文件...的时候其实调用的就不是 stdout 这个文件了,而是 stdout 位置处的新文件,如下图所示: 这其实也就是重定向!具体一点叫做 输出重定向!...程序替换是在磁盘与内存阶段,程序替换是将代码进行覆盖。重定向是在 PCB 与 files_struct 改变指向的阶段,它们是在内核数据结构中,并不会与文件系统产生影响,它们是相互独立!
前言 在上文中,我们讲解了pyminifier中简化和压缩代码的功能。本篇作为第二篇,也是最终篇,讲解一下最重要的功能:代码混淆,学习一下这个项目的混淆策略。...大家如果觉得不错的话,一定要分享到朋友圈哈,写了快5000字,基本上每一个细节都给大家拆分出来了,贴了一部分关键代码,会长一些,一定要有耐心哟。...一.混淆效果 在讲解混淆策略之前,先看一下混淆的效果,恶不恶心,哈哈。对比着混淆的结果,再结合我的讲解,会理解地更加深入。 原始代码 专门设计了一段代码,基本上涵盖了经常出现的语法内容。...,接着遍历token,获取源文件中模块调用的函数,和之前的方法一样通过赋值的方式进行替换,举个例子:原代码: import os os.path.exists("text") 混淆后的代码: import...在Py3中,支持unicode字符作为变量名称,所以基本上是使用unicode字符作为数据源,混淆后会出现各个国家的语言符号,看着着实恶心,而Py2则是使用的ASCII码的大小写作为数据源。
文件:要搜索的文件列表。如果不指定文件,则 grep 将从标准输入中读取数据。...一些常见的 grep 用法示例: 在文件中搜索特定字符串(不区分大小写): grep -i "search_text" file.txt 在多个文件中递归搜索特定字符串并显示包含匹配项的文件名: grep...这通常是因为我们手动构建 Rust 或从源代码仓库中获取 Rust 的最新版本。这种情况的话,在使用rustup update进行版本更新的时候,会有问题。所以我推荐安装官方的二进制发布版。...} 在代码中不包含文件名的情况下,很难确定哪个文件是NotFound。...❞ ---- 打印错误信息 通过stderr来打印错误,以使用户和其他工具更容易将其输出重定向到文件或其他工具。 ❝在大多数操作系统上,程序可以写入两个输出流,stdout和stderr。
也就是说在把echo命令的输出写入文件之前, temp.txt中的内容首先会被清空。.../cmdRW.sh /root/Templates 0 RIGHT [root@entel1 Templates]# ---- 默认stderr打印到屏幕上 下面的命令会将stderr文本打印到屏幕上...---- 工作原理 就输出重定向而言, >和>>并不相同。尽管两者可以将文本重定向到文件,但是>会先清空文件,然后再写入内容,而>>会将内容追加到现有文件的尾部。...当使用重定向操作符时,输出内容不会在终端打印,而是被导向文件。重定向操作符默认使用标准输出。 如果想使用特定的文件描述符,你必须将描述符编号置于操作符之前。...null设备通常也被称为黑洞,因为凡是到这儿的数据都将一去不返。 ---- 补充内容 从stdin读取输入的命令能以多种方式接收数据。
前言 因为有Qmsg酱 这样的一个QQ通知服务,于是我想做一个版本更新通知的东西玩玩,宝塔版本更新通知的我已经搞定了,宝塔是开源的没有加密,分析一下面板代码接口就出来了,刚好最近授权了一个小储云程序,于是也想做一个小储云商城通知更新的程序...这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。...-r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。...-x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据。 -S 在向raw文件输出的同时,将解码结果打印到控制台。 -l 在处理每个包时即时刷新输出。 -X 扩展项。...-f 'tcp dst port 80' -w abc.txt` 刷新你想抓包的页面地址(我抓包的是小储云商城的更新接口,狂点刷新那个检查更新就行了) 在ssh结束(ctrl+c)抓包,然后下载abc.txt
文件的读写本质不是通过C/C++的库函数来操作的(这些库函数只是为用户提供方便),而是通过文件相关的系统调用接口来实现的 2、系统文件IO 2.1 文件相关操作 C语言中文件操作,在操作一个文件之前我们首先要打开它...其中的原因文章开头就已经提到过,因为一个程序在启动前默认会打开三个文件流stdin、stdout、stderr,怎么证明这件事呢?...如果我们想在显示器上打印整型1234,而显示器只认字符,所以我们就需要先把1234转换为4个字符,在通过write写到显示器上,这样很麻烦,所以通过对write封装,得到一个printf函数,我们想打印任何类型都可以通过指定打印类型就可以完成打印...动态库连接原理: 可执行程序、库、.o文件都有特定的格式ELF。 链接就是将我们的一个个具有相同属性的section进行合并。...除了保护物理内存,做权限检查,让进程以统一的视角看物理内存,还有是编译器在编译代码的时候不用考虑物理内存的情况,统一使用虚拟地址,以线性的方式看待整个代码和数据,实现操作系统和编译器的解耦。
Python中sys 模块中的一个方法是stdout ,它使用其参数直接显示在控制台窗口上。这些种类的输出可以是不同的,像一个简单的打印语句,一个表达式,或者一个输入提示。...print() 方法,它有相同的行为,首先转换为sys.stdout() 方法,然后在控制台显示结果。sys.stdout 方法的语法sys.stdout参数不涉及任何参数。...我们使用sys.stdout 作为输出文件对象。返回值该方法不返回任何值,只在控制台直接显示输出。...它将返回sys.stdout.write() 方法中传递的参数并在屏幕上显示。...我们将所有的控制台输出存储在同一个日志文件中。这样,我们可以存储任何打印到控制台的输出,并将其保存到日志文件中。