精华内容
下载资源
问答
  • 二进制允许使用的代码
    千次阅读
    2021-05-23 11:13:40

    看看这个行不行?希望对你有帮助……

    #include "stdafx.h"

    #include "stdio.h"//

    #include "string.h"//

    #include "conio.h"//

    #include "stdlib.h"//

    void convert(char *input, char *output){

    int i=0,j,nx,lein,ii;

    char cx;

    lein=strlen(input);

    if(nx=lein%4){//处理最左端不足4位的情况

    for(cx=0;i

    *output=cx+(cx>9 ? 0x37 : '0');

    i=1;

    }

    for(ii=nx;ii

    for(j=0,cx=0;j<4;(cx<<=1)+=(*(input+ii+j++)=='1' ? 1 : 0));

    *(output+i++)=cx+(cx>9 ? 0x37 : '0');

    }

    *(output+i)=NULL;

    }

    void main(void){/*主程序*/

    char i,ii,rc,(*pBin)[1001],output[251];

    int nDec=0,n;

    printf("要输入几组二进制数?\nnGroup=");

    scanf("%d",&n);

    if(!(pBin=(char (*)[1001])malloc(n*1001))){

    printf("申请内存失败!\n");

    exit(0);

    }

    for(ii=0;ii

    printf("请输入第%d个二进制数!\nBin%d=",ii+1,ii+1);

    for(i=0;;){

    if((rc=getch())==0xD || i==1000){

    printf("\n");

    break;//遇到回车或长度到1000位则结束输入

    }

    else if(rc=='\b' && i){//处理退位修改

    printf("\b%c\b",' ');

    i--;

    }

    else if(rc=='0'||rc=='1'){//只允许输入'1'和'0'

    printf("%c",rc);//显示输入字符

    if(!i && rc=='0') continue;//不要前导0

    pBin[ii][i++]=rc;//存储输入字符

    }

    }

    pBin[ii][i]=NULL;//设置字符串结束标记

    }

    for(i=0;i

    convert(pBin[i],output);//调用自定义函数转换成十六进制串

    printf("Case %d:0x%s\n",i+1,output);

    }

    free(pBin);

    }

    温馨提示:答案为网友推荐,仅供参考

    更多相关内容
  • .},{September 10,2015} 作者:{克里斯·安德伍德(Chris Underwood)和蒂姆·凯洛格(Tim Kellogg)} 描述{允许用户输入一个二进制编号(例如1001。)和一个基数来将其转换为(例如2) 设置下载文件。 在浏览器中...
  • 此文档为《十进制小数和二进制小数相互转换》,让C++初学者更好的理解进制转换【独家出版,未经允许,禁止侵权】
  • piperun是一个简单的C程序,它允许您执行从标准输入读取的已编译ELF二进制文件。 用法 gcc -c t/hello.c -o /dev/stdout | ./piperun 或者 make check 只需运行make然后将已编译的ELF二进制文件通过./pipeprun到....
  • 这篇文章将介绍三个作者溯源的工作,从二进制代码和源代码两方面实现作者去匿名化或识别。这是三篇非常经典的安全论文,希望您喜欢。一方面自己英文太差,只能通过最土的办法慢慢提升,另一方面是自己的个人学习笔记...

    《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。

    前一篇带来了清华唐杰老师的分享“图神经网络及认知推理总结和普及”或“Graph Neural Networks and Applications—A Review”。这篇文章将介绍两个作者溯源的工作,从二进制代码和源代码两方面实现作者去匿名化或识别。这是两篇非常经典的安全论文,希望您喜欢。一方面自己英文太差,只能通过最土的办法慢慢提升,另一方面是自己的个人学习笔记,并分享出来希望大家批评和指正。希望这篇文章对您有所帮助,这些大佬是真的值得我们去学习,献上小弟的膝盖~fighting!

    前文赏析:


    一.NDSS18:二进制代码的作者去匿名化(代码风格+AST+RF)

    原文作者:Aylin Caliskan-Islam, Fabian Yamaguchi, Edwin Dauber, et al.
    原文标题:When Coding Style Survives Compilation: De-anonymizing Programmers from Executable Binaries
    中文标题:当编码风格在编译中幸存下来时:从可执行二进制文件中对程序员进行去匿名化
    原文链接https://arxiv.org/abs/1512.08546
    发表会议:2018 NDSS

    在这里插入图片描述

    1.摘要

    根据代码风格(coding style)识别计算机程序作者的能力直接威胁到程序员的隐私和匿名性。

    虽然最近的工作发现,源代码(source code)可以高精度地溯源至(attributed to)作者,但可执行二进制文件(executable binaries)作者的归属问题似乎要困难得多。因为源代码中存在许多显著的特征,例如变量名,但在编译过程中会被删除,并且编译器优化可能会改变程序的结构,进一步掩盖已知对确定作者身份(authorship)有用的特征。

    本文从机器学习角度实现程序员去匿名化任务,使用一组新颖的特征,包括将可执行二进制文件反编译为源代码所获得的特征。同时采用来自源代码作者溯源领域的一组强大的技术以及嵌入在汇编中的风格表征,从而成功地对大量程序员进行去匿名化处理。

    本文实验通过谷歌GCJ(Google Code Jam)数据集评估了方法的有效性,其中,100名候选程序员的溯源准确率高达96%,600名候选程序员的溯源准确率为83%。我们首次提出了一种可执行二进制文件的作者溯源方法,该方法对基本混淆、一系列编译器优化设置和去符号表的二进制文件具有鲁棒性。此外,本文使用混淆的二进制文件和在单作者GitHub存储仓库以及最近泄露在 Nulled.IO 黑客论坛中的“在野”真实代码来执行程序员去匿名化实验。结果表明,那些想要保持匿名的程序员需要采取极端的应对措施来保护他们的隐私。

    在这里插入图片描述


    2.引言

    如果遇到一个“在野”可执行的二进制样本,我们可以从中学到什么?
    在本文的工作中,我们展示了程序员的风格指纹或编程风格在编译过程中是能被保留下来的,并且可以从可执行的二进制文件中提取。这意味着,如果我们有一组已知的潜在候选程序员,以及由这些候选程序员编写的可执行二进制样本(或源代码),就可以推断出程序员的身份。

    可执行二进制文件的作者去匿名化影响了隐私和匿名性。但在软件取证、版权、审查等领域中需要实现作者溯源,我们的工作能有效实现二进制文件的去匿名化。此外,白宫和DARPA指出“需要增强溯源能力以识别不同端设备和C2基础设施的虚拟角色和恶意网络运营商”。

    方法对比突出本文贡献:

    • Rosenblum经典工作:可以直接从可执行二进制文件中提取控制流图等结构,首次针对二进制代码提出一种自动检测代码风格特征的方法并确定程序作者
    • 本文工作:首次证明可执行二进制文件的自动反编译(automated decompilation)提供了额外有用的特征。具体而言,我们生成反编译源代码的抽象语法树(abstract syntax trees),利用随机森林分类器能有效地组合特征,从而提升作者溯源的准确性。

    具体方法为:分析人员需要将每个标记的二进制样本转换为一个数值特征向量,再利用机器学习技术推导出一个分类器,并预测匿名二进制文件最有可能的程序员。此外,我们发现二进制混淆、启用编译器优化或剥离可执行二进制文件的调试符号会降低去匿名化的准确性。

    • 关键点:经过分解和反编译获得的特征向量如何来预测源代码中的特征,如何重构二进制代码的编程风格特征(指纹)

    N. Rosenblum, X. Zhu, and B. Miller. Who wrote this code? Identifying the authors of program binaries. Computer Security–ESORICS, 2011.

    相关工作:

    • Linguistic stylometry
    • Source code stylometry
    • Executable binary stylometry

    3.本文方法

    Our ultimate goal is to automatically recognize programmers of compiled code.

    数据表示对于机器学习的成功至关重要。 因此,我们为可执行二进制作者溯源设计了一个特征集,目标是准确地表示与程序员风格相关的可执行二进制文件的属性。我们通过使用额外的字符串和符号信息来增强从反汇编器中提取的低级特征,从而获得该特征集,最重要的是,该方法结合了从反编译器获得的高级语法特征(syntactical features)。

    本文方法的框架图如下所示,包括四个关键步骤:

    • Disassembly(反汇编)。我们首先对二进制程序进行反汇编,以获得基于机器代码指令、引用字符串、符号信息和控制流图(CFG)的特征(第 4.1 节)。
    • Decompilation(反编译)。 我们继续通过反编译将程序翻译成类似C语言的伪代码。随后将代码传递给C语言的模糊解析器,因此,我们获得了可以从中提取语法特征和n-gram的抽象语法树(第 4.2 节)。如图中函数f声明及变量a定义。
    • Dimensionality reduction(降维)。 借助反汇编器和反编译器的特征,我们利用基于信息增益和相关性的特征选择技术,选择其中对分类特别有用的特征(第 4.3 节)。
    • Classification(分类)。最后,在相应的特征向量上训练一个随机森林分类器,生成一个可用于自动执行二进制作者溯源的程序(第4.4节)。

    关键特征:

    • Instruction features
    • Lexical features
    • AST & CFG features

    在这里插入图片描述

    (1) Feature extraction via disassembly
    利用反汇编器提取低级特征。按照Rosenblum方法从可执行二进制中提取原始指令轨迹,同时反汇编程序会提供符号信息以及代码中引用的字符串,再从反汇编器中获得函数的控制流图,提供基于程序基本块的特征。

    • The netwide disassembler:基本的反汇编器,能够解码指令。从头到尾反汇编二进制文件,遇到无效指令时跳过该字节。
    • The radare2 disassembler:从动态和静态符号表中提取符号并获得动态库函数知识,生成相应的控制流图。

    (2) Feature extraction via decompilation
    与反汇编器相比,反编译器不仅揭示程序的机器代码指令,而且还额外重构更高层次的结构,试图将可执行二进制文件转换为等价的源代码。特别而言,反编译器可以重构控制结构,如不同类型的循环和分支结构。我们利用了代码的这些语法特性,因为它们在源代码作者身份溯源的上下文中已经被证明是有价值的。我们从伪代码中提取了两种类型的特征:

    • lexical features(词法特征):单词组合以捕获程序中使用的整数类型、库函数名称,以及当符号信息可用时内部函数的名称。
    • syntactical features(语法特征):抽象语法树。

    在这里插入图片描述

    (3) Dimensionality reduction
    特征提取会产生大量特征,从而产生具有数千个元素的稀疏特征向量。然而,并不是所有的特征都具有同样的信息来表达程序员的风格。因此,需要进行特征选择的降维操作。我们使用信息增益准则,然后基于相关性的特征选择来识别将每个作者表示为一个类的信息量最大的属性。

    • 方法一:information gain(WEKA编写代码)
    • 方法二:correlation based feature selection

    We use information gain criteria followed by correlation based feature selection to identify the most informative attributes that represent each author as a class.

    (4) Classification
    我们使用随机森林分类器,它是由决策树集合构成的集成学习算法,其中每棵树都是在随机抽样获得的数据的子样本上进行训练。(kappa编写代码)


    4.实验评估

    (1) GCJ数据集
    我们在一个基于年度编程竞赛GCJ的数据集上评估了可执行二进制作者溯源方法。本文的分析重点是已编译的C++代码,这是比赛中使用最流行的编程语言。我们收集了2008年至2014年的解决方案,以及作者名称和问题标识符。

    • Google Code Jam Programming Competition. code.google.com/codejam.

    为了创建实验数据集,我们首先用GNU编译器集合的gcc或g++编译了源代码,并且没有对二进制文件进行任何优化。我们还编译了具有1级、2级和3级优化的源代码,即O1、O2和O3标志。

    • To create our experimental datasets, we first compiled the source code with GNU Compiler Collection’s gcc or g++ without any optimization to Executable and Linkable Format (ELF) 32-bit, Intel 80386 Unix binaries.

    我们感兴趣的是识别二进制文件中的编码样式特征。应用当前方法,我们提取了100名作者的750,000种代码属性表示,最终保留了53个高度区分的特征。实验结果如下图所示:

    在这里插入图片描述

    通过源代码特征向量与预测原始特征向量的余弦相似度比较,我们得出如下图所示的实验结果,900个余弦相似度度量的平均值为0.81。该结果表明:

    • 反编译代码很好地保留了原始源代码特征的转换形式,即重构的特征接近于源代码的特征。因此,本文方法可以重构原始源代码特征。

    在这里插入图片描述

    (2) 真实场景
    此外,本文使用混淆的二进制文件和在单作者GitHub存储仓库以及最近泄露在 Nulled.IO 黑客论坛中的“在野”真实代码来执行程序员去匿名化实验。

    在这里插入图片描述


    5.讨论和结论

    本文实现了二进制文件的作者溯源(去匿名化)研究,展现了代码方格是能在编译后提取的,并且在GCJ和Github真实数据集中进行了程序员去匿名化实验。其中,100名候选程序员的二进制溯源准确率高达96%,600名候选程序员的溯源准确率为83%。

    同时,本文通过两种不同的反汇编器、控制流图和一个反编译器,获得了这种编码样式的精确表示,有效提取53个关键特征。程序员风格会以令人惊讶的程度嵌入到可执行的二进制文件中,即使它被混淆、编译器优化或符号被剥离降低了风格分析的准确性,但在仍能应用于程序员去匿名化任务中。结果表明,那些想要保持匿名的程序员需要采取极端的应对措施来保护他们的隐私。

    Programmer style is embedded in executable binary to a surprising degree, even when it is obfuscated, generated with aggressive compiler optimizations, or symbols are stripped. Compilation, binary obfuscation, optimization, and stripping of symbols reduce the accuracy of stylistic analysis but are not effective in anonymizing coding style.

    未来工作:

    • 计划研究代码片段和功能级别的代码风格信息
    • 对去匿名化协作生成的二进制文件开展多作者溯源研究
    • 对高度复杂的编译和混淆方法开展研究

    6.个人感受

    写到这里,这篇论文就分享结束了,再次感谢论文作者及引文的老师们。接下来是作者的感受,由于是在线论文读书笔记,仅代表个人观点,写得不好的地方,还请各位老师和博友批评指正,感恩遇见,读博路漫漫,一起加油!

    • 先前的工作多集中于源代码作者溯源,提取具有作者编程(代码)风格的特征是关键。然而,二进制代码会因为编译、混淆等处理导致编程风格丢失,并且恶意攻击中常以可执行二进制文件为主。因此,针对二进制代码的作者溯源或去匿名化研究直观重要。
    • 该论文摘要的方法论部分似乎还可以补充下,同时摘要的实验部分没有之前看到的顶会论文清晰。
    • 论文的方法比较简单,包括反汇编、反编译、降维和分类四个部分,所使用的分类方法为随机森林,提取的特征我们也能想到。从现在来看,很容易想到,但2018年能写到这样还是挺佩服的,也值得我们学习。个人认为,相比于模型的新旧,安全论文更看重模型如何解决实际问题以及是否贴合创新。
    • 实验部分希望自己今后能复现下,包括GCJ数据集(源码编译二进制)和真实数据集,同时可以深入思考如何进一步提升性能,动态特征和静态特征如何更好地结合实现作者溯源,真正去解决恶意二进制代码作者溯源难点。此外,一篇好论文通常会有真实的实验支撑,实验需要和我们的方法论互补且结合。
    • Caliskan-Islam和Rosenblum两个团队在代码去匿名化领域做了较多工作,推荐大家去系统学习。同时,APT溯源、作者溯源存在怎样的区别或关联呢?预计2023年初,我会详细写一篇文章总结各类溯源及检测技术 。

    二.UsenixSec15:基于代码风格的源代码去匿名化(AST+RF+特征)

    原文作者:Aylin Caliskan-Islam, Richard Harang, Andrew Liu, et al.
    原文标题:De-anonymizing Programmers via Code Stylometry
    原文链接https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-caliskan-islam.pdf
    发表会议:2015 Usenix Sec

    在这里插入图片描述

    1.摘要

    源代码作者溯源是对匿名代码贡献者的一个重大隐私威胁。然而,它还可以将成功的攻击归因于受感染系统上遗留的代码,或帮助解决编程领域中的版权、著佐权和剽窃问题。

    在这项工作中,我们研究了使用编码风格对 C/C++ 的源代码作者进行去匿名化的机器学习方法。我们的代码风格特征集是一种在源代码中发现的编码风格的新颖表示,它反映了来自抽象语法树的属性的编码风格。

    我们基于随机森林和抽象语法树的方法溯源了更多的作者(1600和250),并且在更大的数据集(Google Code Jam)上具有比先前工作更高的准确率(94%和98%)。此外,这些新特征是健壮的,难以混淆的,并且可以用于其它编程语言,如Python。

    我们还发现:

    • (i)由困难的编程任务产生的代码比容易的任务更易于溯源;
    • (ii)熟练的程序员(可以完成更困难的任务)比不熟练的程序员更容易溯源。

    在这里插入图片描述


    2.引言

    程序员会在源代码中留下指纹吗?每位程序员都有一个独特的“编码风格”(coding style)吗?
    或许,程序员更喜欢空格而不是标签,或者更喜欢while循环而不是for循环,再或者更微妙地说,比起单一代码更喜欢模块化代码。

    这些问题有很强的隐私和安全影响。开源项目的贡献者可能会隐藏他们的身份,无论他们是Bitcoin的创造者,还只是一个不希望她的雇主知道她的业余活动的程序员。他们可能生活在一个禁止某些类型软件的制度中,比如审查规避工具。

    另一方面,代码溯源可能会有帮助取证,比如发现代写、抄袭和版权纠纷调查等。它也可能给我们提供关于恶意软件作者身份的线索。警惕的攻击者可能只留下二进制文件,但其他的攻击者可能会留下脚本语言编写的代码或下载到被破坏系统中进行编译的源代码。

    本文在先前研究的基础上,展示了抽象语法树能携带作者相关的“指纹”,从而提升准确率。本文的贡献如下:

    • 首先,我们将语法特征(syntactic features)作用于代码风格(code stylometry)。
      提取这些特征需要使用模糊解析器(fuzzy parsing)解析不完整的源代码以生成抽象语法树。这些特征为迄今为止几乎完全未开发的代码样式添加了一个组件。我们提供的证据表明,这些特征更为基础且更难混淆。我们的完整特征集由大约12万个基于 布局(layout)、词法(lexical)和语法(syntactic) 的特征组成。有了这个完整的特征集,我们比先前的工作具有更高的准确率。
    • 其次,本文将该方法扩展到1600名程序员并且未损失很多准确率。
    • 最后,该方法不是特定于C或C++的,可以应用于任何编程语言。

    本文从GCJ比赛中收集C++源代码,利用基于词袋的随机森林分类器来实现源代码的程序员溯源。最后,我们分析了程序员的各种属性、编程任务类型,以及会影响溯源成功的特征。我们从12万个特征中确定了最重要的928个特征,其中44%是语法性的,1%是基于布局的,其余的特征是词汇性的。当使用词汇、布局和句法特征时,平均有70行代码的8个训练文件是足够的。我们还观察到,具有更高技能的程序员更容易识别,而且程序员的编码风格在困难任务的实现中比更容易的任务更独特。

    研究动机:

    • Programmer De-anonymization:bitcoin作者去匿名化
    • Ghostwriting Detection:剽窃行为检测、学生作业抄袭判定(代码风格相似性)
    • Software Forensics:恶意代码作者取证
    • Copyright Investigation:版权调查和代码版权纠纷
    • Authorship Verification:授权验证(one-class SVM)

    在这里插入图片描述


    3.本文方法

    本文研究目标之一是创建一个分类器以自动确定源文件最有可能的作者。机器学习是解决该问题的一个选择,然而,它们的成功关键取决于一个具有代表性编程风格特征集的选择。为此,我们:

    • 首先,解析源代码,从而获得广泛的反映编程语言用法的可能特征(第3.1节)。
    • 然后,定义不同特征来表示程序代码的语法和结构(第3.2节)。
    • 最后,训练一个随机森林分类器用于分类未知的源代码。

    (1).Fuzzy Abstract Syntax Trees

    迄今为止,源代码作者溯源的方法主要集中于代码的顺序特征表示上,如字节级和特征级的n-gram。虽然这些模型非常适合捕获命名约定和关键字的偏好,但它们完全是与语言无关,因此无法对仅在语言结构组合中明显的作者特征进行建模。例如,作者倾向于创建深度嵌套的代码、异常长的函数或较长的赋值链接,这不能单独使用n-gram来建模。

    针对不完整代码,我们使用模糊解析器解析代码,从而生成对应的抽象语法树。生成的语法树构成了我们特征提取过程的基础。虽然它们很大程度上保留了创建n-grams或bag-of-words表示所需的信息,但它们允许提取大量特征,这些特征对代码结构中可见的程序员习惯进行编码。

    下图是一个源代码转换为抽象语法树的示例,抽象语法树都包含一个对应的节点,树的叶子节点使经典的语法特征如关键字、标识符和操作符,内部节点表示显示的操作如何组合这些基本元素来形成表达式和语句。

    在这里插入图片描述

    在这里插入图片描述


    (2).Feature Extraction

    为了更清晰地表达源代码的程序风格,本文提出了代码风格特征集(Code Stylometry Feature Set,CSFS),这是一种专门为代码风格开发的源代码表示方法。该特征集包括词汇特征、布局特征和语法特征。其中,词汇特征和布局特征只能从源代码中获得,而语法特征只能从AST中获得。

    • Lexical Features
    • Layout Features
    • Syntactic Features

    首先从源代码中提取数字特征,这些数字特征表达了对某些标识符和关键字的偏好,以及一些关于函数使用或嵌套深度的统计数据。词汇和布局特性可以从源代码计算,而不访问解析器,使用编程语言的基本知识。此外,我们对源文件进行标记化,以获得每个标记的出现次数,即所谓的单词单图。表2给出了词汇特征的概述。

    在这里插入图片描述

    此外,我们还考虑了表示代码缩进的布局特性。例如,我们确定大多数缩进的行是以空白还是制表符开头,并确定空格与文件大小的比率。表3给出了对这些特征的详细描述。

    在这里插入图片描述

    语法特征集描述了依赖于语言的抽象语法树和关键字的属性。计算这些特性需要访问一个抽象的语法树,所有这些特征对于源代码布局和注释的更改都是不变的。表4给出了语法特征的概述,我们通过对数据集中的所有C++源文件进行预处理来生成抽象语法树并获得这些特征(TF、IDF、TFIDF)。

    在这里插入图片描述

    抽象语法树得58种节点类型如下表所示。AST节点的平均深度显示了程序员倾向于使用特定结构片段的嵌套或深度。最后计算每个C++关键字的项频率,每个特征都被写入一个特征向量,以表示特定作者的解决方案文件,这些向量随后被用于机器学习分类器的训练和测试。

    在这里插入图片描述


    (3).Classification

    由于会产生大量特征且存在矩阵稀疏问题。因此,我们采用WEKA的信息增益准则进行特征选择,该准则评估类的分布的熵与给定特定特征的类的条件分布的熵之间的差异:

    在这里插入图片描述

    为了减少特征向量的总大小和稀疏性,我们只保留那些信息增益非零的特征。最后构建随机森林分类器进行源代码作者溯源。

    在这里插入图片描述


    4.实验评估

    实验数据集是在Google Code Jam (GCJ)的基础上构建的数据集,包括1600名程序员,实验结果如下图所示:

    在这里插入图片描述

    在这里插入图片描述

    同时进行了混淆、不同编程语言的实验。

    在这里插入图片描述

    在这里插入图片描述


    5.结论

    当前,源代码的编程风格已经被广泛应用于隐私、安全、软件取证、剽窃、版权侵权纠纷和作者验证领域。源代码编程风格对于代码去匿名化是一个迫在眉睫的问题。

    本文首次系统性使用词法、布局和语法特征来研究源代码的编程风格,并对1600位作者进行分类,其准确率为94%,对250位作者进行分类,准确率为98%。本文方法提高了源代码作者溯源的准确率和规模。此外,传统方法仅能识别50个作者,分析的文本需要5000个单词,本文通过训练550行代码和8个解决方法即可实现。特别而言,本文的研究表明:

    • 基于代码风格特征集(code Stylometry Feature Set)的源代码作者溯源比常规风格作者溯源更有效

    在这里插入图片描述

    未来工作:

    • 由于恶意代码通常只能使用二进制格式,因此研究二进制文件如何保留语法特征是一件有趣的工作
    • 进一步提高分类精度,例如,我们想探讨使用具有联合信息增益的特性是否会提高性能
    • 设计捕获抽象语法树更大片段的特征来提升性能,这些更改(以及添加词法和布局特征)可能会对Python的结果提供显著的改进
    • 代码是否可以自动规范化以删除样式信息,同时保留功能和可读性

    6.个人感受

    这篇文章针对源代码去匿名化开展研究,完成于2015年,整个文章的亮点是:

    • 源代码编程风格特征的总结,即(Code Stylometry Feature Set,CSFS),包括词汇、布局和语法三类特征,其中通过抽象语法树提取语法特征,词汇特征和布局特征从源代码中统计获得。

    接着,通过特征提取、降维和向量表征来构建具有编程风格的源代码向量,最后构建随机森林分类器完成任务。方法论和前面二进制作者溯源比较相近,现在回头看,方法和实验略微简单,但仍有很多值得我们学习的地方,包括:

    • 如何更少地结合人工经验(特征工程)完成该任务,是否能结合源代码本身特性来构建深度学习模型完成分类,深度学习又将如何实现呢?
    • 如何解决代码混淆、编译优化等溯源问题,包括二进制溯源、多作者溯源等
    • 在特征工程中如何构建更好地降维方法识别更关键的特征,并提高作者溯源的可解释性(tanE)
    • 如何与实际安全问题结合,包括APT溯源、无文件攻击溯源等

    写一篇好的顶会真难,值得我们学习,继续加油!


    三.总结

    写到这里,这篇文章就分享结束了,再次感谢论文作者及引文的老师们。由于是在线论文读书笔记,仅代表个人观点,写得不好的地方,还请各位老师和博友批评指正。

    后面作者将分享两篇基于深度学习的作者溯源论文,分别是:

    • Mohammed Abuhamad, et al. Large-Scale and Language-Oblivious Code Authorship Identification, 2018 CCS.
    • Saed Alrabaee, et al. CPA: Accurate Cross-Platform Binary Authorship Characterization Using LDA, 2020 IEEE TIFS.

    在这里插入图片描述

    在这里插入图片描述

    最后,用川大吴鹏博士的论文进行总结,非常推荐大家学习且感谢吴老师。

    • 吴鹏. 多形态软件代码同源判定技术研究[D]. 四川大学博士论文, 2021.

    软件代码同源研究集中在恶意代码同源以及软件代码作者识别等方面,其中恶意代码同源分析为了发现未知恶意代码变种以及恶意代码家族及关联关系分析,软件作者识别为了判定软件代码是否出于同一人或相同团队,既有利于软件知识产权保护又可实现软件代码溯源。

    软件代码作者编程过程中,不可避免会留下编程习惯,比如注释风格、排版布局等,编译过程尽管会损失部分代码风格特征,比如排版布局,但函数使用频率、代码模块架构模式等编程习惯依然会被保留,且不同软件代码编写者,鉴于其知识、经验、能力差异,其编程习惯几乎难以完全一致。以上特点确保了软件作者代码作者识别切实可行,加之其在软件知识产权保护、网络攻击溯源等领域极具应用前景,已对其展开了不少探索。

    软件代码作者溯源通常划分为源代码作者识别和二进制代码作者识别。两者已围绕编程习惯、编程风格等特征从关键字符文本、抽象语法树以及代码结构图等多个维度进行了尝试;方法层面从经典距离计算到分类聚类算法再到神经网络模型不断进步;研究对象从单一作者到多作者,单一平台到跨平台均展开了研究;甚至从逃避检测角度也受到了足够重视。但源代码习惯易被篡改、二进制代码习惯难以捕获等问题依然没有很好地解决,整体而言,相关方法难以大规模应用,亟需对其展开深入研究。

    在这里插入图片描述

    这篇文章就写到这里,希望对您有所帮助。由于作者英语实在太差,论文的水平也很低,写得不好的地方还请海涵和批评。同时,也欢迎大家讨论,继续加油!感恩遇见,且看且珍惜。

    在这里插入图片描述

    (By:Eastmount 2022-08-02 周四夜于武汉 http://blog.csdn.net/eastmount/ )


    展开全文
  • 专业动态二进制翻译器一个研究项目,研究ARM64到ARM64二进制转换,该转换允许在运行时根据用户规范对机器代码进行检测。什么是二进制翻译二进制翻译是一种在虚拟机和仿真器中常见的技术,在该技术中,程序需要获取并...
  • python转二进制

    2020-11-29 17:05:08
    在python中是否有将integer(或long)转换为二进制字符串的固定方法? google上有无数的dec2bin()函数。 但我希望我能用一个内置的函数库...struct处理二进制数据离不开python的struct模块,struct理解上你可以把它...

    o55g08d9dv.jpg广告关闭

    腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!

    在python中是否有将integer(或long)转换为二进制字符串的固定方法? google上有无数的dec2bin()函数。 但我希望我能用一个内置的函数库...

    struct处理二进制数据离不开python的struct模块,struct理解上你可以把它理解为c语言的结构体,使用该模块的pack和unpack方法,可以很容易的把二进制数据转换为常用的类型数据,如整型、字符型等 结构体如下:struct header { unsigned short id; char tag; unsigned int version; unsigned int count; }unpack将二...

    python 二进制文件处理采用python处理二进制文件,文件打开方式需要设置成rb或wb,使读写的数据流是二进制。 还需要进行二进制数据和普通数据之间的转换。 这时会用到python的包struct里的两个函数pack和unpack。 pack函数将普通数据打包成二进制数据; 而unpack数据将二进制数据分解成普通数据。 help(struct.unpack...

    我发现用python读取二进制文件特别困难。 你能帮我一把吗? 我需要读取这个文件,在fortran 90中,该文件很容易被 int*4 n_particles,n_groupsreal*4 group_id(n_particles)read (*) n_particles,n_groupsread (*) (group_id(j),j=1,n_particles) 详细地说,文件格式是:bytes 1-4 -- the integer 8.bytes 5-8 -- the...

    cfl8cqpz09.png

    print(done)简言之就是用struct.pack将要变成字节的数据打包然后以字节的形式写入到二进制文件,字节的形式是bx01,而非b0x01或者bx01之类的形式,可以用ultraedit查看:如果ultraedit只显示右侧不能显示左侧十六进制内容可以按下ctrl+h? 对于大于255的数字可以将‘b’换成‘h’或者‘l’,可以百度一下struct的用法...

    import matplotlib.pyplot as pltimport numpy as np f =open(bwall.bmpx, mode=rb)x = np.fromfile(f, dtype=np.ubyte)#x = xx = x#x = xx= x.reshape(60,32)#print((x))plt.imshow(x)plt.axis(off) # clear x- andy-axesplt.show()补充知识:python 利用二进制实现图片读取与拷贝今天休假一天,开心。 看到一篇是...

    f2.write(n) i = 0 breakf.close()f2.close()二进制文件使用 read( size)withopen(lgtm-monitor.dat, rb) as fp:data = fp.read(2) #type(data) === bytes text =int.from_bytes(data, byteorder=big)fp.close()...

    用 no way 来表示二进制文本。 python 2.6测试版:可以这样做:0b1100111或0b1100111... python 2.6测试版:也允许0o27或0o27(第二个字符是字母o)表示八进制。 python 3.0测试版:与2.6相同,但不再允许老版本027八进制的语法...

    如何在python中添加,减去和比较二进制数而不转换为十进制?...

    期望的输出将是这样的,其中对于a,向量表示索引1和1.2的存在,对于b,索引2,对于c,索引3. 注意,对于a,只有一个记录,但存在2个指数。 在数据集上循环索引时,我遇到了一些麻烦。 我的想法是循环索引设置与数据集中列表数量相同的时间量。 但我不认为这是最有效的方式,任何帮助将不胜感激!...

    过程记录查阅python27源码中的setup.py文件,发现python核心仅依赖glibc,c++等标准库,因此按以下默认的编译命令即可编译出依赖较少的python二进制程序了。 # 安装必要的编译工具链sudo yum install -y gcc make gcc-c++ glibc-staticlibstdc++-static curl -o https:www.python.orgftppython2.7. 13python-2...

    我试图理解python中的以下二进制搜索树节点插入实现。 我在insert函数中放了几个print语句。 我可以理解两个插入调用生成的前两个打印但我无法理解在第三次插入调用之前生成的第三个打印。 调试打印的实现如下: class node: def __init__(self, value):self.value = value self.left = none self.right = none def ...

    对于二进制代码的读取:import structwith open(valid0_0,rb) as f:#valid0_0二进制文件名 f.seek(0,2) n=f.tell() f.seek(0,0) buf=f.read(n)m=int(n4)#4是根据你数据的类型和你之前定义的buf长度确定 print(m,n)print(struct.unpack_from(str(m)+i, buf,0))关于seek的使用file.seek()方法标准格式是:seek(offset...

    一般来讲, mmap() 所暴露的内存看上去就是一个二进制数组对象。 但是,你可以使用一个内存视图来解析其中的数据。 比如:m = memory_map(data) memory...如果多个python解释器内存映射同一个文件,得到的 mmap 对象能够被用来在解释器直接交换数据。 也就是说,所有解释器都能同时读写数据,并且其中一个解释...

    简单转换理念:把二进制三位一组分开就是八进制,四位一组就是十六进制二进制与十进制:(1)二进制转十进制:“按权展开求和”(1011)2=1x2**3 + 0x2**2 ...011则表示十进制的916进制是以0x开头的: 例如:0x11则表示十进制的17python中进制转换:#10进制转为2进制 bin(10)0b1010 #2进制转为10进制 int(1001,2)9#10...

    十六进制 到 十进制使用 int() 函数 ,第一个参数是字符串 ‘0xff’ ,第二个参数是说明,这个字符串是几进制的数。 转化的结果是一个十进制数。 int(0xf,16) 15 二进制 到 十进制int(10100111110,2) 1342 八进制 到 十进制int(17,8) 15 其实可以看到,不管 几进制数 转换成 十进制数 ,都是用 int() 函数 。 之后后面...

    首先,先温习一下 二进制转十进制吧! 从最低位(最右)算起,位上的数字乘以本位的权重,权重就是2的第几位的位数减一次方。 eg.第2位就是2的(2-1次)方,就是2; 第8位就是2的(8-1)次方是128。 把所有的值加起来。 (for example:二进制1101,换算成十进制就是:12(1-1)+02(2-1)+12(3-1)+12(4-1)=1+0+4+...

    我在python中写了一些二进制反向数据的代码。 见下文: #! usrbinpythonimport sys data = sys.stdin.read()for i in reversed(data):sys.stdout.write(chr(int({:08b}.format(ord(i)), 2))) 该程序工作正常! $ echo -e halloc | xxd -b 00000000:01101000 01100001 01101100 01101100 01101111 hallo $ echo -e ...

    一些扩充 在解决上边的问题的过程中,搜索了许多相关的解决方法,对python中二进制串与通用字符串之间的转换有了一定的了解。 但都是关于纯英语字符串转换的,对上边的中文字符无用。 用下面方法转换中文字符串时会出现编码错误。 给定通用字符串 string = ‘a string’ , 需要把它转换为二进制串时,可以直接调用...

    是否有一个库函数对列表元组执行二进制搜索?...

    展开全文
  • 二进制,多么熟悉的字眼,相信只要是学计算机的,二进制绝对是入门的第一节课必学的知识点。你肯定经常会听说“计算机底层数据传输就是通过二进制流”、“二进制就是0和1”等等说辞。 对于二进制,更多的人还是停留...

    你好,这里是网络技术联盟站。

    二进制,多么熟悉的字眼,相信只要是学计算机的,二进制绝对是入门的第一节课必学的知识点。你肯定经常会听说“计算机底层数据传输就是通过二进制流”、“二进制就是0和1”等等说辞。

    对于二进制,更多的人还是停留在表面层的0和1,这个本身也没有错,不过既然今天写了这篇文章,那肯定是要从里到外扒个彻底。

    如果本文对您有帮助,欢迎收藏哦!

    让我们直接开始吧!

    什么是二进制?

    二进制是由Gottfried Leibniz发明的以 2 为底的数字系统,是四种数字系统之一

    四种数字系统分别是:二进制、八进制、十进制、十六进制。

    计算机系统中的所有数据都由二进制信息组成,二进制只有 2 个值:01

    在布尔逻辑中,单个二进制数字只能表示 True (1) 或 False (0) ,但是,可以使用多个二进制数字来表示大数并执行复杂的功能,任何整数都可以用二进制表示。

    在数字数据存储器、存储、处理和通信中,0 和 1 值有时分别称为“”和“”。

    二进制也可用于描述已编译的软件程序,一旦程序被编译,它就会包含称为“机器代码”的二进制数据,可以由计算机的CPU执行。

    二进制是如何工作的?

    上面我们提到二进制1和0表示高低电平,在晶体管中,“0”代表没有电流流动,“1”代表允许电流流动

    晶体管是控制电流的微型开关。

    通过这种方式,数据才得以传输。

    在计算的早期,将数据输入计算机的唯一方法是轻按开关或输入打孔卡或打孔纸带。

    二进制例子

    二进制数示例

    二进制中没有 2、3、4、5、6、7、8 或 9.

    每个二进制数字都简称为bit,也叫位,一位只能用于表示 2 个不同的值:0 和 1。

    bit是计算机上数据的最小单位,其他单位还有:Byte、kb、mb、gb、tb等,它们的换算方式如下:

    • 1 B = 8 bit
    • 1 K = 1024 B
    • 1 M = 1024 K
    • 1 G = 1024 M
    • 1 T = 1024 G

    当然了,还有更大的单位,比如:PB、ZB、EB、YB……

    如何阅读二进制?

    阅读二进制其实就是将二进制转化为我们可阅读的十进制的过程。

    二进制中的数字 0 到 15:

    由此看出二进制的权重是 2 的幂,而不是 10 的幂。

    举个栗子:

    我们二进制转十进制的时候,一般都是从右往左看,第一个数字是0,那么算出来就是0.

    第二个数字是1,那么算出来就是2.

    以此类推,最后二进制数11001010转为十进制就是0+2+0+8+0+32+64+128=234

    彩蛋:如果快速地将十进制转为二进制

    这里瑞哥教大家一个非常简单的方法:

    举个栗子,比如现在有个十进制数:200

    第一步:找小于其最大的2的次幂数

    意思就是小于200的最大的2的次方的数,我们快速的在脑海中回忆一下“2,4,8,16,32,64,128,258”,这个时候就确定这个数是128

    第二步:找第二个最大的2的次幂数

    首先 200 - 128 = 72

    72下一个最大的2的次幂数就是 64

    第三步:以此类推

    72 - 64 = 8

    答案就出来了:200 = 128 + 64 + 8 = 2^7+ 2^6+ 2^3

    也就是第4个、第7个、第8个为1,其他都为0.

    我用图来演示一下:

    首先记住这个换算:

    200可以由128、64、8组成:

    128、64、8所在位置为1,其他都为0:

    这样的是不是很快就能算出来十进制数200转换为二级制数就是11001000.

    这里是演示,所以步骤我列举的非常详细,但是这种方法是绝大数人使用的方法,一旦你掌握了,口算速度会非常快,大家可以刻意的去练习一下。

    最后

    计算机中一切都可以用二进制来表示,不管是图片、指令、文件还是视频都是可以用二进制数来表示,只是这些二进制数会根据类型进行编码,比如图片通常被编码成png、jpg等格式,指令就比较多了,比如“.bat”、“.py”、".sh"等,文件比如word、ppt、pdf等,视频比如mp4等。

    总结

    二进制0和1,两个简简单单、普普通通的数字构成了复杂的计算机系统,对于人类文明的进步可谓是不可衡量的,那么本文主要介绍了什么是二进制、二进制如何工作、二进制的例子,以及二进制和十进制互换算。

    朋友们,你们懂了吗?

    展开全文
  • 计算机内部表示任何数据都是用二进制。而与人进行交互时,可以将数据转换成人可以理解的内容:10进制、文字、图片、音频视频。不同进制的计算方式是相通的:| 十进制 十进制逢十进一 | 二进制 二进制逢二进一 | | —...
  • 【C语言】十进制转换二进制

    万次阅读 多人点赞 2021-06-25 09:35:40
    本题要求实现一个函数,将正整数n转换为二进制后输出。 函数接口定义: void dectobin( int n ); 函数dectobin应在一行中打印出二进制的n。建议用递归实现。 裁判测试程序样例: #include <stdio.h> ...
  • 而非预处理指令的代码行不需要使用该符号,直接换行即可。 原因:编译阶段会自动忽略空白符,而预编译阶段不会。 预处理 预处理是一种展开,下表是常用的一些预处理命令 还有下列几种预处理宏(是双下划线) __LINE__...
  • 十六进制和二进制转储 布莱恩·阿兰提科(Brian ... 第二个命令允许您转储文件中数据的二进制表示形式。 新颖/重要的设计决策的列表/说明:3个源代码文件和一个头文件用于构建程序。 Main.cpp包含main方法,fio.cpp
  • matlab转换java代码int2bin-bin2int 将整数数据类型转换为二进制字符串,然后再返回到Matlab中。 版本1.0、2016年4月10日 ...如果满足以下条件,则允许以源代码二进制形式进行重新分发和使用,无论是
  • python十进制转二进制python中十进制转二进制使用 bin() 函数。bin() 返回一个整数 int 或者长整数 long int 的二进制表示。下面是使用示例:>>>bin(10)'0b1010'>>> bin(20)'0b10100'补充:十进制...
  • 十进制转二进制的过程是:对十进制数取余,将最终的余数从下到上数则为其二进制,即可以按照这个思路来处理。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二...
  • IceBuddha 是一个十六进制查看器和通用二进制文件解析器,通过静态网页完成,并在浏览器中对解析脚本进行 python-to-javascript 转换。 试试看 接触 IceBuddha 由来自 (Scott Piper) 开发 执照 麻省理工学院执照 ...
  • JS十进制转二进制

    千次阅读 2020-08-01 08:52:00
    如果bin-bit小于转化后的二进制本身位数,则使用原本的位数,如dec-number为5,bin-bit为2,依然输出101,但同时在console中报个错。 一、十进制转二进制,不控制位数。 <!DOCTYPE html> <html> <...
  • 最全操作符详解即二进制,八进制,十进制,十六进制代码转换
  • Ghidra2Dwarf是一个ghidra插件,它允许将信息(例如函数,反编译的代码,类型)从ghidra导出到ELF二进制文件中的dwarf部分。 更具体地说,它将所有反编译函数导出到名为${program}_dbg.c的源文件中,并创建一个名...
  • 程序从源代码到可执行二进制程序的过程包括编译和链接两个阶段,编译和链接分别包含一些子阶段,本文对这些细微的子过程进行了描述
  • 二进制运算及转换(课件)

    千次阅读 2021-07-27 00:28:36
    二进制运算及转换(课件)计算机基础-二进制运算及转 换 课程导入 在日常生活中,人们广泛使用的是十进 制数,有时也会遇到其他进制的数。 数制 又叫进位计数制,指的是一种计数规则 二进制 十二进制 十进制 十进制 ...
  • 二进制加法器电路框图

    千次阅读 2021-05-26 03:36:13
    另一种常见且非常有用的组合逻辑电路,可以使用一些基本的逻辑门允许它将两个或多个二进制数加在一起是二进制加法器。一个基本的二进制加法器电路可以用标准的 AND 和 Ex-OR 门允许我们将两个单位二进制数“加”到...
  • C++二进制兼容性总结

    2021-08-11 09:30:40
    提示:文章写完后,目录可以自动生成,如何...对于一个库,如果使用旧版本的主程序,无需重新编译就可以连接新版本的库,并正常运行,则这个库是二进制兼容的。 如果主程序不需要修改,但需要重新编译才可以使用新版
  • 惰性二进制序列化

    2021-06-28 19:34:53
    LBScrates.io |文档.rs库名称代表惰性二进制序列化。我们称之为“懒惰”,因为它不会序列化/反序列化使用默认值初始化的结构字段,如0 、0.0 、"" 、Option::None 、空容器等。当涉及到大型结构时,这种简单的技术使...
  • 靓点:1、多对多交叉场景分配;2、php新特性-闭包使用、批处理函数array...//声明指定用户角色、允许值、允许清单public $allow_value=0,$allow_list=array(); //初始化场景、角色function __construct($scene,$allow_v
  • 在此模块的安装后任务中,它确定要安装在哪个平台上,并从ripgrep-prebuild平台的正确二进制文件中下载正确的二进制文件。 ripgrep二进制文件的路径导出为rgPath 。使用范例const { rgPath } = require ( 'vscode-...
  • 二进制、16进制、大端小端

    千次阅读 2021-11-19 14:22:16
    对应的文件就要用对应的软件来查看,但是做为开发,要时候是要查看文件的二进制的,比如我们写一个音频转换器的时候,发现转换后的音频无法播放,就需要查看此音频文件的二进制,以分析是哪里的数据出了问题,而看...
  • ASCII码采用多少位二进制编码

    千次阅读 2021-07-25 08:24:42
    ASCII码划分为两个集合:128个字符的标准ASCII码(7位二进制编码)和附加的128个字符的扩展ASCII码(8位二进制编码)。...ASCII码:美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给...
  • 最近在解析 png 数据文件, 发现一个文件操作中容易忽略的问题,问题描述如下:在使用 fread 读二进制文件(png 图片)的时候, 发现读取到内存中的数据和 二进制文件中的数据不一致, 同样, 在使用 fwrite 写二进制...
  • 详解JavaScript操作文件和二进制数据

    千次阅读 2020-12-29 06:02:54
    但是随着 ECMAScript 5 的出现,引入了 Blob 对象,允许直接操作二进制数据。当然在?ECMAScript 5 之前也可以操作二进制数据,但是速度慢还容易出错。charCodeAt()方法,支持一个个字节地从文字编码转成二进制数据,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 354,383
精华内容 141,753
热门标签
关键字:

二进制允许使用的代码