-
2017-09-12 20:33:41
@csrf_exempt def handle_upload(request): print("***************************") file_obj = request.FILES.get('file') if file_obj: # 处理附件上传到方法 request_set = {} print('file--obj', file_obj) # user_home_dir = "upload/%s" % (request.user.userprofile.id) accessory_dir = settings.accessory_dir if not os.path.isdir(accessory_dir): os.mkdir(accessory_dir) scr = Image.open(file_obj) img= np.asarray(scr)
更多相关内容 -
查看浮点数float 在内存中二进制数 c#
2021-07-03 00:30:16查看浮点数float 在内存中二进制数,可以验证自己所计算的float数的二进制数是否正确。 查看浮点数float 在内存中二进制数,可以验证自己所计算的float数的二进制数是否正确。 -
JavaScript读写二进制数据的方法详解
2020-12-10 18:59:48在类型化数组出现之前,我们是无法直接通过 JavaScript 操作二进制数据,通常都是操作 JavaScript 中的数据类型,由运行时转化成二进制。这就多了一个转化的过程,尽管 JavaScript 对数据类型做了很多优化以提高效率... -
C++实现读入二进制数并转换为十进制输出
2020-12-31 17:15:11已知一个只包含0和1的二进制数,长度不大于10,将其转换为十进制并输出。 输入描述 输入一个二进制整数n,其长度不大于10 输出描述 输出转换后的十进制数,占一行 样例输入 110 样例输出 6 solution: 很多学过C... -
将二进制文件读到内存当中
2018-07-20 15:03:13用c语言将二进制执行文件读到缓冲区当中,并打印出PE结构信息 -
binprotect:利用二进制重写技术的追溯二进制保护
2021-05-26 21:24:50BinProtect提出了一种工具,该工具能够转换二进制形式的程序(ELF32),以追溯地合并在编译时尚未集成的安全性机制。 受编译时保护机制的启发,BinProtect集成了以下四种简短描述的四种安全强化措施: BinProtect... -
TCL脚本存取二进制文件应用举例
2020-07-25 07:40:33之前介绍了本人研究如何使用TCL脚本来存取二进制文件,这是因为我们在具体项目中实际使用得到,今天就给大家介绍下如何使用。 -
利用动态二进制分析方法实现内存自动检测
2020-10-16 19:17:43探讨了采用前沿的动态二进制分析技术检测软件中与内存相关错误,为程序员定位错误位置、查找错误、消除错误原因提供准确的信息的方法,为致力于内存程序错误检测技术的研究人员提供参考。在C/C++软件中的内存错误... -
e9patch:强大的静态二进制重写工具
2021-07-24 12:28:02E9Patch - 强大的静态二进制重写器 E9Patch 是一个强大的静态二进制重写工具,用于x86_64 Linux ELF 二进制文件。 E9补丁是: 可扩展:E9Patch 可以可靠地重写大型/复杂的二进制文件,包括 Web 浏览器(大小超过 ... -
Sojobo:二进制分析框架
2021-02-05 04:03:08Sojobo-二进制分析框架 Sojobo是框架的仿真器。 创建该文件是为了简化对潜在恶意文件的分析。 它是完全在.NET中开发的,因此您无需安装或编译任何其他外部库(该项目是自包含的)。 使用Sojobo,您可以: 模拟(32... -
python实现在内存中读写str和二进制数据代码
2020-12-20 09:57:39# 利用python在内存中读写str和二进制数据 from io import StringIO from io import BytesIO f = StringIO() print(f.write('hello ')) # 6 print(f.write('world!')) # 6 print(f.getvalue()) # hello world! f = ... -
精彩编程与编程技巧-将数据转换为内存二进制形式字符串...
2009-10-10 17:50:57精彩编程与编程技巧-将数据转换为内存二进制形式字符串 ... -
内存图片二进制数据直接转为 OpenCV 数据格式的方法
2019-07-18 17:12:06在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据。 这个时候,当你的应用程序读到内存里的二进制图片...想了多种方法解决这个问题,还是百度的力量大。
在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据。
这个时候,当你的应用程序读到内存里的二进制图片数据时,怎么样直接转为 OpenCV 可以使用的图片格式呢,答案是用 cv::imdecode 这个函数。
即先构造一个 char 字符串序列的 vector,用来存储图片的二进制数据,然后再转为 cv::Mat 成为可以被 cv::imdecode 使用的数据格式,然后直接类型转换为 IplImage 数据格式。
同样,如果你需要把 IplImage 或 cv::Mat 压缩并写到一段内存块里时,就需要使用 cv::imencode 这个函数,使用方法类似。
具体的实现代码参考:
string fname = "D:/image.jpg"; //! 以二进制流方式读取图片到内存 FILE* pFile = fopen(fname.c_str(), "rb"); fseek(pFile, 0, SEEK_END); long lSize = ftell(pFile); rewind(pFile); char* pData = new char[lSize]; fread(pData, sizeof(char), lSize, pFile); fclose(pFile); //! 解码内存数据,变成cv::Mat数据 cv::Mat img_decode; vector<uchar> data; for (int i = 0; i < lSize; ++i){ data.push_back(pData[i]); } img_decode = cv::imdecode(data, CV_LOAD_IMAGE_COLOR); cv::flip(img_decode, img_decode, -1); img_decode.channels(); //! 将cv::Mat数据编码成数据流 vector<unsigned char> img_encode; cv::imencode(".jpg", img_decode, img_encode); unsigned char *encode_data = new unsigned char[lSize]; for (int i = 0; i<lSize; i++){ encode_data[i] = img_encode[i]; }
如果需要解码的图像格式特殊,如unit16的深度图,请在调用imdecode时选择CV_LOAD_IMAGE_UNCHANGED
Specific color type of the loaded image:
CV_LOAD_IMAGE_COLOR the loaded image is forced to be a 3-channel color image
CV_LOAD_IMAGE_GRAYSCALE the loaded image is forced to be grayscale
CV_LOAD_IMAGE_UNCHANGED the loaded image will be loaded as is. -
asp.net实现图片以二进制流输出的两种方法
2020-10-23 05:09:13主要介绍了asp.net实现图片以二进制流输出的两种方法,以简单实例形式分析了asp.net实现以二进制流形式读写图片文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 -
在Linux中直接运行Windows二进制程序
2020-03-04 11:31:28虽然大多数linux爱好者都不怎么使用Windows,但是不少人还是习惯了某些Windows下的软件,而不愿意从开源仓库中寻找替代品。当然,你可以用拥有Wine的GNU/Linux系统解决这个问题。但是还有令人感觉不如意的地方:每次... -
Java读取和写入二进制大文件的方法.rar
2019-07-10 18:32:56Java读取和写入二进制大文件的方法,应该说是一个基于二进制的大文件块,演示了如何自定义缓存区,并使用不具有缓冲功能的DataInputStream 和DataOutputStream 类来读写二进制的大文件块数据,运行效果请参见如下... -
如何在内存中执行二进制代码之linux平台
2020-06-07 21:13:45之前写了一篇关于win平台下,从内存执行二进制码的文章,所以此文主要修改自那篇。 大家可能会很好奇,我们的任意程序,不就是在内存中执行的二进制机器码吗? 不,今天我要说的是,我们如何把实现指定功能的一段二...之前写了一篇关于win平台下,从内存执行二进制码的文章,所以此文主要修改自那篇。
大家可能会很好奇,我们的任意程序,不就是在内存中执行的二进制机器码吗?
不,今天我要说的是,我们如何把实现指定功能的一段二进制机器码,放到我们的程序中,然后在需要的时候,直接调用它。
当然,这段代码也有其他用途,故而有了shell code的昵称,参考百度百科:
https://baike.baidu.com/item/shellcode/4051847?fr=aladdin
思考:
我们需要解决以下问题- 二进制代码从哪里来?
- c/c++中如何调用它?
这些问题,接下来,都会得到解决。
不过,我们先来看看效果。一、执行二进制代码效果
main.c:
#include <stdio.h> #include <string.h> #include <sys/mman.h> typedef int(*AddFunc)(int, int); int main() { // int add(int a, int b)函数64位系统下二进制码 unsigned char add_binaryCode[] = { 0x55, 0x48, 0x89, 0xe5, 0x89, 0x7d, 0xfc, 0x89, 0x75, 0xf8, 0x8b, 0x55, 0xfc, 0x8b, 0x45, 0xf8, 0x01, 0xd0, 0x5d, 0xc3 }; // 申请EXECUTE属性内存 void* execBuf = mmap(NULL, sizeof(add_binaryCode), PROT_WRITE | PROT_EXEC,MAP_ANON | MAP_PRIVATE, -1, 0); // 拷贝二进制码 memcpy(execBuf, add_binaryCode, sizeof(add_binaryCode)); // 执行二进制码 AddFunc func = (AddFunc)execBuf; int ret = func(1, 2); printf("result:%d\n", ret); // 释放内存 munmap(execBuf, sizeof(add_binaryCode)); return 0; }
Ubuntu环境64位下编译执行
gcc main.c -o main.out ./main.out
add_binaryCode中装的是add函数二进制码,C函数形式如下:
int add(int a, int b) { return a + b; }
我们不能在数组中执行二进制码,这样会报异常,故需要申请带可执行属性的内存,然后拷贝到其中,强转类型后,调用此函数。
运行结果:
运行结果正确,且没有报异常。
小结:
我们可以把逻辑代码封装为函数,并转换为二进制码,然后在c/c++中进行调用执行。
到此我们解决了,在c/c++中如何执行二进制码的问题。
接下来,我们来解决二进制码如何生成的问题。
二、二进制代码的生成
个人认为有2种方式生成二进制码
1.纯手写十六进制机器码
2.采用c/c++等高级语言编写程序,编译后,对其反汇编进而获得十六进制机器码
第一种,好比回到了纸带打孔编程的石器时代,需要了解x86指令集及其对应机器码,能力有限,直接放弃。
接下来,采用第二种方式,大概讲下,怎么通过自己写的函数,去提取生成的二进制码。
1. 编写add测试函数
add.c:
int add(int a, int b) { return a + b; }
2. 编译,生成*.o文件
gcc -c add.c -o add.o
3. 提取add函数二进制码
objdump -j .text -d add.o
每行":"后面的十六进制数字就是机器码。如下:
故,我们把这些机器码拷贝出来,放到数组中
unsigned char add_binaryCode[] = { 0x55, 0x48, 0x89, 0xe5, 0x89, 0x7d, 0xfc, 0x89, 0x75, 0xf8, 0x8b, 0x55, 0xfc, 0x8b, 0x45, 0xf8, 0x01, 0xd0, 0x5d, 0xc3 };
这些机器码就是我们add函数编译后生成的二进制码,即最终在内存中,cpu执行的机器码。我们让这个数组按照第一节中的方式,就可以在c/c++代码中进行调用执行了。
三、从文件中读取二进制码并执行
似乎本节的意义并不大,无非就是读取出来,放到buffer中,再执行罢了,主要的执行原理、二进制码生成都已经讲完了,这个就留给大家自行扩展吧。
四、总结
机器码的获取,比较关键的就是objdump这条命令。
另外执行时,比较关键的是,需要把机器码放到mmap指向的内存中去,不能在普通内存中执行。
参考链接:
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。
本文涉及工程代码,公众号回复:08ExecBinaryFromBuffer_linux,即可下载。
-
利用C/C++二进制读写png文件的方法示例
2020-12-26 04:46:21二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ... -
二进制文件流读写-C++ IO流
2020-06-11 21:56:58二进制文件流读写-C++ 为什么要用二进制写文件 计算机在物理上的存储是以二进制方式存储的,那么文本文件与二进制文件的区别就是物理存储上的吗? 不,而是逻辑上的,这两者只是在编码层次上有差异,文本文件是基于...二进制文件流读写-C++
为什么要用二进制写文件
计算机在物理上的存储是以二进制方式存储的,那么文本文件与二进制文件的区别就是物理存储上的吗?
不,而是逻辑上的,这两者只是在编码层次上有差异,文本文件是基于字符编码的文件,常见编码有ascll编码,unicode编码等,二进制文件是基于值编码的文件,可以根据应用,指定某个值是什么意思(这样一个过程可以看作是自定义编码);
文本文件基本上是定长编码的,基于字符,每个字符在具体编码中是固定的,ascll码是特定的编码,而二进制可以看作是变长编码
第一:
使用二进制文件比较节约空间,比如在存储数字,特别实型数字时,二进制更节省空间
第二:
计算机物理内存中都是用二进制无格式存储起来的,所以二进制存储到文件就更快捷,如果存储为文本文件时,需要转换的过程,所以在数据量很大时,两者的差别就会体现出来
第三:
一些比较精确的数据,使用二进制存储不会造成有效位丢失.
文本文件与二进制文件的区别:
-
写入数字 1,实际写入的是 字符 '1'
-
二进制文件:写数字1,实际写入的是整数 1 ;
-
1的二进制是0001 (所占4个字节,最低是1, 追高3个字节都是0);
写入二进制文件
使用文件流对象的write方法写入二进制数据.
-
演示
输出入一个整数:
-
读二进制文件
使用文件流的read方法.
-
演示
-
-
输出结果为:
-
-
更多技术交流欢迎来到~奇牛
-
-
-
-
-
redis存储二进制数据测试代码
2015-09-30 10:37:41redis存储二进制数据测试代码 -
C语言把浮点数转换为二进制数的方法和示例
2020-04-25 16:41:53浮点数据转换为二进制的方法是: 1)把浮点数拆分成两部分,小数点前面的整数和小数点后面的小数。 2)分别把整数和小数部分转换为二进制,保存在字符串中。 3)输出转换后和二进制字符串。 1、整数部分转二进制字符... -
floatbin浮点数的二进制/16进制表示转换工具(附带源代码)
2018-03-26 16:37:47floatbin浮点数的二进制/16进制表示转换工具(附带源代码) 很实用,代码也值得参考 -
linux-k3s轻量级Kubernetes易于安装内存减半所有二进制文件都小于40mb
2019-08-13 12:37:38k3s - 轻量级Kubernetes, 易于安装,内存减半,所有二进制文件都小于40mb -
1M字节内存,为什么地址编码需要20位二进制位
2021-02-16 15:37:491MB=1024KB=2^10KB ...按照这个运算逻辑,1M字节内存,地址编码应该需要23位二进制位。 但是因为内存中字节是最小的寻址单位,无法寻址到bit。所以此处的“位”指的是多少“位”字节,而不是多少“位”比特。 ... -
详解C++编程中对二进制文件的读写操作
2020-12-31 04:13:29二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ... -
010 Editor 是一款很好用的编辑器,其中有一个很好的特点是可以运行模板文件来分析二进制文件。
2022-04-13 19:02:49010 Editor 是一款很好用的编辑器,其中有一个很好的特点是可以运行模板文件来分析二进制文件。查看和编辑硬盘驱动器上的任何二进制文件(文件大小无限制)和文本文件,包括Unicode文件,C / C ++,XML,PHP等。 ... -
如何在内存中执行二进制代码之win平台
2020-06-07 17:43:43大家可能会很好奇,我们的任意exe程序,不就是在内存中执行的二进制机器码吗? 不,今天我要说的是,我们如何把实现指定功能的一段二进制机器码,放到我们的程序中,然后在需要的时候,直接调用它。 当然,这段代码... -
C#二进制图片的存储或读取
2015-04-30 15:16:31C_图片转换成二进制流并且保存到sql_server数据库,或者存储。