精华内容
下载资源
问答
  • 可执行文件的相似度比较

    千次阅读 2010-06-03 10:57:00
     二进制可执行文件的相似度分析一直是一个难题。大家都知道,即使是同一份源代码,使用同一个编译器,可用不同的编译参数进行编译后,代码也会产生极大的差异。当发生有人因为盗用别人的源代码而产生的侵权后...

     

    二进制可执行文件的相似度分析一直是一个难题。大家都知道,即使是同一份源代码,使用同一个编译器,可用不同的编译参数进行编译后,代码也会产生极大的差异。
    当发生有人因为盗用别人的源代码而产生的侵权后,如果不能够将二者的源代码拿出进行比较的话,判断是否抄袭非常困难。因此,一直以来或多或少,总会有人无 所顾忌的将开放源代码的软件拿来加入到自己的软件中,或者干脆就是在那些源代码的基础上稍加修改和更换了版权信息就宣称是自己研发的。因为他们知道,只要 不把自己的源代码公诸于众,那么抄袭就很难判定。
    下面我就详细说一下我采用的分析方法。
    2.1 ELF可执行文件相似度分析方法
    这次分析起始,我就碰到了一些难题。如果对二进制可执行文件进行基于字节的相似性分析,即使匹配上某些字节,也很难说明两段代码的相似性,另外匹配也很容 易受到各种噪音的干扰而产生很低的相似度,可是噪音却无法被去除。
    因此,使最小比较单元具有明确的语义和合理的过滤噪音是我首先要解决的问题。
    2.1.1 反汇编
    二进制文件的比较难以确定最小单元语义的根本问题在于二进制文件是以字节为单位,然而每个字节却没有特定的含义。你很难说 89 e5和83 EC  89中的89相同说明什么,在这个例子中,前者的89 e5是i386的一条指令,而后者的89则是一个立即数,所以他们相同实际上什么都不说明。
    针对这次分析,由于都是可执行代码,而且都采用了ELF的文件格式。由于这个特点,我首先将所有操作系统的内核通过objdump反汇编成汇编代码。这样 做有一个直接的好处,就是每一行都是一条汇编语句,而每一条汇编语句又是一个程序不可分的最小逻辑单元。这样,接下来的分析就可以基于行来进行相似性的分 析,因为每出现一行相同就说明有一个最小的逻辑单元相同,如果出现连续的行相似,那么就说明有连续的代码段相似。相同的行越多两个内核就越相似。
    并且经过反汇编后,就避免了因文件内包含的其他无关信息,如字符串、资源文件、数据文件等,对分析结果产生的影响。
    这个方法依旧无法避免因编译参数差异所造成的相似度下降的影响。虽然如此,但是我很幸运,从这次分析的结果看,依旧得到了不低的相似度。
    2.1.2 过滤噪音
    噪音的出现有很多原因,可能是内存分布不同、代码的增删导致的偏移地址的变化,对相同含义的常量而数值却不同等等。这些值的差异,可能会造成不同的执行结 果,但是却对两段代码的相似性比较影响不大。请看下列两个代码段:

    左边的代码是来自FreeBSD 5.3内核的,而右边的代码来自麒麟2.0.21/18的内核。通过人的分析,我们可以得出这两段代码实际上是相同的。可是对于计算机程序比较的时候,就 不尽然。
    请注意上述的有颜色的数字。用蓝色表示的 代码地址 [4]、绿色表示的 偏移地址、红色表示的立即数、深蓝色表示的函数偏移地址和粉色表示的函数地址,这些数字的不同,就造成了代码比较时候的失败。上述13行代码,如果就这样比较的话,只有函数名一行可以匹配。因此虽然是相同的代码,却只有7.7%的相似度。下面我们就来去除这些干扰。
    首先,我们将代码行地址、函数跳转地址和函数偏移地址去除。代码行所在的地址,实际上是说明了代码所在内存的位置,内存的位置会随着代码的删改而很容易产 生变动,这些对我们比较代码逻辑没有意义。其中有些绝对地址,我们将其替换为“{Address}”,这样既不受地址变化的影响,又不至影响了代码的含 义。
    然后我们将绿色的偏移地址替换成特定字符串“{Offset}”。产生偏移地址的原因一般有两种,一种是结构体,另一种是数组。即使不对结构体删改,而仅 仅是对结构体的声明顺序的变动都可以造成偏移地址的不同,我们在这里只关心程序在这里用到了一个偏移地址,而不关心用的到底是偏移了多少。数组的用法虽然 不常出现,但是即使出现其中的位置也是很容易发生变动的。因此在这里,我们也将偏移地址的数值替换成统一的字符串。
    最后,我们来处理红色的立即数。当然立即数并不是只有上述的几种情况下出现,虽然在上述的例子中,两边的立即数都完全一样,单是在某些情况下还是会出现不同。
    立即数在程序中一般是常量,而常量有可能是与系统相关的数值,或者仅仅是一个符号,而不在乎具体数值。无论是什么含义,常量虽然在执行过程中不会改变,在 设计过程中却很容易发生变动。不过对我们分析代码逻辑没有太大的影响,因此,在分析的时候我们对数值进行模糊化,将其替换为“{Number}”这个特定 字符串。
    至此,上述代码将会变为:

    <freebsd4_sigcode>:    | <freebsd4_sigcode>:
    freebsd4_sigcode():                       | freebsd4_sigcode():
    call   *{Offset}(%esp)                    |   call   *{Offset}(%esp)
    lea    {Offset}(%esp),%eax               |   lea    {Offset}(%esp),%eax
    push   %eax                              |   push   %eax
    testl {Number},{Offset}(%eax)           |   testl {Number},{Offset}(%eax)
    jne    <freebsd4_sigcode+{Offset}>       |   jne    <freebsd4_sigcode+{Offset}>
    movl   {Offset}(%eax),%gs                |   movw   {Offset}(%eax),%gs
    mov    {Number},%eax                     |   mov    {Number},%eax
    push   %eax                              |   push   %eax
    int    {Number}                          |   int    {Number}
    jmp    <freebsd4_sigcode+{Offset}>       |   jmp    <freebsd4_sigcode+{Offset}>
    nop                                      |   nop
    现在这两段代码的相似度将变成真实的100%。

     

    展开全文
  • 初次接触wxWidgets,在写一个跨平台的程序时,发现在Windows平台上竟然无法通过下列代码更改exe可执行文件的图标:SetIcon(wxICON(main));但在Linux下测试是有效的。网上查资料,也没有人提到这个事。可能是我自学...
    初次接触wxWidgets,在写一个跨平台的程序时,发现在Windows平台上竟然无法通过下列代码更改exe可执行文件的图标:
    SetIcon(wxICON(main));
    但在Linux下测试是有效的。网上查资料,也没有人提到这个事。可能是我自学编程的原因吧,只好自己解决。通过研究wxWidgets的例子程序,发现他们都将图标放在了资源文件里(rc文件),决定尝试一下。这是资源文件:

    #include <wx/msw/wx.rc>

    app  ICON  "res/main.ico"

    #define VERSIONINT  1,0,0,1
    #define VERSIONSTR  "1, 0, 0, 1"

    1 VERSIONINFO
        FILEVERSION     VERSIONINT
        PRODUCTVERSION  VERSIONINT
        FILEOS          VOS__WINDOWS32
        FILETYPE        VFT_UNKNOWN
    BEGIN
        BLOCK "StringFileInfo"
        BEGIN
            BLOCK "040904b0"
            BEGIN
                VALUE "CompanyName", "QPSOFT.COM"
                VALUE "FileDescription", "Portable Money"
                VALUE "FileVersion", VERSIONSTR
                VALUE "InternalName", "PMoney"
                VALUE "LegalCopyright", "Copyright ? 2008 QPSOFT.COM"
                VALUE "OriginalFilename", "pmoney.exe"
                VALUE "ProductName", "PMoney"
                VALUE "ProductVersion", VERSIONSTR
            END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation", 1033, 1200
        END
    END

    这是在MainFrm中的设置方式,并实现了跨平台:
    #ifdef __WXMSW__
        SetIcon(wxICON(app));
    #else
        SetIcon(wxICON(main));
    #endif // __WXMSW__

    问题解决,特别记录一下。哦,对了,gimp在编辑图标时真的很好用!可以编辑xpm图标,也可以编辑ico图标。
    展开全文
  • 代码文件/* 下列代码保存到 plus.cpp */int my_plus(int x,int y) { return x + y; } /* 下列代码保存到 minus.cpp */ int my_minus(int x,int y) { return x - y; } /* 下列代码保存到 my_math.h */ int ...

    文件列表:
    这里写图片描述

    代码文件

    /* 下列代码保存到 plus.cpp */
    
    int my_plus(int x,int y)  
    {  
        return x + y;  
    }  
    
    /* 下列代码保存到 minus.cpp */
    int my_minus(int x,int y)  
    {  
        return x - y;  
    }  
    
    /* 下列代码保存到 my_math.h */
    int my_plus(int x,int y); 
    int my_minus(int x,int y);
    /* 下列代码保存到 lib_test.cpp */
    #include"my_math.h"  
    #include<stdio.h>  
    int main()  
    {  
    
        printf("[my_plus ] = %d\n",my_plus(3,5));
        printf("[my_minus] = %d\n",my_minus(3,5));
        return 0;
    } 
    

    makefile文件

    /* 下面内容保存到 lib.mak */
    SHELL = /bin/sh  
    CC = g++
    AR = ar  
    
    CFLAG = -O2 -W -Wall  
    
    INCLUDE_PATH = -I.  
    LIB_TARGET = ./libmath.a  
    PLUS_OBJ = plus.o  
    PLUS_SRC = ./plus.cpp  
    
    MIN_OBJ = minus.o 
    MIN_SRC = ./minus.cpp
    
    all : $(LIB_TARGET)  
    $(PLUS_OBJ): $(PLUS_SRC)  
        $(CC) $(CFLAG) $(INCLUDE_PATH) -c $(PLUS_SRC)  
    
    $(MIN_OBJ): $(MIN_SRC)  
        $(CC) $(CFLAG) $(INCLUDE_PATH) -c $(MIN_SRC)  
    
    $(LIB_TARGET) : $(PLUS_OBJ)  $(MIN_OBJ)
        $(AR) cq $@ $^  
    
        rm -f $(PLUS_OBJ)
        rm -f $(MIN_OBJ)
    
    clean:  
        rm -f $(PLUS_OBJ)
        rm -f $(LIB_TARGET)
    /* 下面内容保存到 app.mak */
    SHELL = /bin/sh  
    CC = g++  
    
    INCLUDE_PATH = -I.  
    TEST_TARGET = ./test  
    TEST_SRC = ./lib_test.cpp  
    LDFLAGS := ./libmath.a  
    all :
        $(CC) -g $(TEST_SRC) $(LDFLAGS) -o $(TEST_TARGET) $(INCLUDE_PATH)  
    
    clean:
        rm -f $(TEST_TARGET)

    编译连接

    编译生成静态库
    在linux终端使用命令:

    make -flib.mak

    效果如下图
    这里写图片描述

    编译生成可执行文件
    使用命令:

    make -fapp.mak

    效果如下图
    这里写图片描述

    运行:
    这里写图片描述

    展开全文
  • VS2019 VS2017 指定的任务可执行文件“cmd.exe”未能运行。函数不正确。解决方案 在VS2017和VS2019出现错误提示: C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(132,5): ...

    VS2019 VS2017 指定的任务可执行文件“cmd.exe”未能运行。函数不正确。解决方案

    在VS2017和VS2019出现错误提示:
    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(132,5): error MSB6003: 指定的任务可执行文件“cmd.exe”未能运行。函数不正确。

    并且尝试重装了VS多次后,可以尝试用下列方法解决:

    方法1:

    关闭当前VS工程,临时以管理员身份运行VS ,重新打开工程,编译即可。
    永久方法:百度搜一下关键字”Win10 VS2019 设置 以管理员身份运行“,根据文章提示每次打开VS都默认用管理员身份运行。

    我参考的是这篇文章

    方法2:

    项目、属性、配置属性、生成事件、后期生成事件、命令行: 查看自己有哪些命令,临时删掉,编译完毕后,自己进入报错项目的根目录自己打开CMD运行一次,如我这边的是“xcopy …\Lib …\res\scripts\common\Lib /Y /i /e”

    展开全文
  • 并且写了几个Python小程序想和朋友分享一下顺便推荐这个很棒的编程语言,但是遗憾的是朋友的电脑没有安装Python,而且还是用Windows系统,所以最好的办法是把Python程序转换为Windows上的可执行文件。首先要下载...
  • 这种病毒我遇到过很多次,之前win7系统时我没有管它,仅仅只是打开显示隐藏文件便不影响使用,但是当我换成win10后发现这种方法不管用了,后来在网上找到一种方法很实用,下面就来教大家如何将U盘文件恢复。...
  • 创建可执行的Jar文件

    千次阅读 2004-09-25 21:02:00
    创建可执行的Jar文件 假定我们已经创建好了一个GUI程序,但我们使用的是java命令从命令行启动。很显然,这会让Windows用户感到不舒服。一个较好的解决办法是将这个(或这些)class文件打包成一个可执行的jar文件。具体...
  • Powershell执行文件和脚本

    万次阅读 2019-04-17 09:11:17
    脚本:脚本和批处理都属于可执行文件,它们只是包含了若干命令行解释器能够解释和执行的命令行代码。 执行批处理文件:批处理是扩展名为”.bat”的文本文件,它可以包含任何cmd控制台能够处理的命令。当批处理文件...
  • 2. 给可执行文件签名,假设要签名的文件名为 test.exe  Signtool sign /v /s My /n xxx /t http://timestamp.verisign.com/scripts/timestamp.dll test.exe  注意这里的 xxx 要与第一步的 xxx 完全相同  如果...
  • Java入门-生成可执行jar文件的教程

    万次阅读 2010-03-10 15:48:00
    -C 改变到指定的目录,并且包含下列文件: 如果一个文件名是一个目录,它将被递归处理。 清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。 示例1:将两个class文件存档到一个...
  • 文件exer1的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列哪个命令是对的? 正确答案: A 你的答案: C (错误) chmod a+x g+w exer1 chmod g+w exer1 chmod 765 ...
  • 对shell脚本赋予可执行权限

    千次阅读 2020-09-27 18:05:21
    对1.sh文件赋予可执行权限: chmod u+x 1.sh 对文件夹下所有shell文件赋予可执行权限: chmod u+x *.sh
  • 可执行程序加载到内存的过程

    千次阅读 2018-10-08 09:27:36
    2、 elf为现在非常流行的可执行文件的格式,它为程序运行划分了两个段,一个段是可以执行的代码段,它是只读,可执行;另一个段是数据段,它是可读写,不能执行。 3、 loader会启动,通过m...
  • Linux执行mount挂载覆盖文件的还原

    千次阅读 2019-02-15 19:05:58
    随着业务增长需要挂载新的数据盘,由于误操作容易覆盖掉已经存在的文件夹,这时候不要删除文件夹下的 lost+found 文件,直接卸载掉新挂载的数据...连接系统执行数据盘的文件系统挂载,具体参考下列文档 Linux格式...
  • exe执行文件变白色无图标解决方法

    千次阅读 2019-04-08 17:31:03
    在命令提示符下输入下列命令即可恢复。  按键 “WIN+R” 输入即可cmd  然后输入分别输入 :  taskkill /im explorer.exe /f  cd /d %userprofile%\appdata\local  del iconcache.db /a  start explorer....
  • 演示文件 I/O 操作loadTOCNode(2, summary);本文中的示例讲述基本的文件 I/O 操作。“分步示例”部分说明如何创建一个演示下列六种文件 I/O 操作的示例程序: • 读取文本文件
  • 使用 ShellExecuteEx 打开文件执行程序可以使用 ShellExecuteEx 打开文件执行程序,与 ShellExecute 比较,ShellExecuteEx 提供了更多的控制,但是看起来使用也更复杂。 原型:BOOL ShellExecuteEx( _Inout_ ...
  • Shell学习01:创建和执行脚本文件

    千次阅读 2019-06-18 16:17:32
    执行 # 直接新建脚本文件并进入编辑 vim ShellTest.sh # 或者 # 先新建脚本文件,再进入编辑页面 touch ShellTest.sh vim ShellTest.sh 在脚本文件编辑页面中放入 #!/bin/bash echo "Hello World !" #! 是一...
  • QT5可执行程序缺少dll问题

    千次阅读 2015-07-28 14:51:24
    QT5可执行程序缺少DLL问题
  • C语言文件操作

    千次阅读 多人点赞 2019-08-04 08:07:14
    实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是存放在外部介质(如磁盘等)上的,在使用时才调入内存中来。从用户的角度看,Linux系统的文件...
  • 首先为了排除$PATH问题,我是直接到./arm/3.4.1/bin/目录下,采用指明路径的形式来执行的,操作如下: ern@MI:~/usr/local/arm/3.4.1/bin$ ./arm-linux-gcc -v bash: ./arm-linux-gcc: 没有那个文件或目录但是...
  • 文件包含】文件包含漏洞知识总结

    千次阅读 多人点赞 2019-06-28 08:38:41
    文件包含】文件包含漏洞知识总结 ...和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。 什么叫包含呢?以PHP为例,我们常常把...
  • e代表可执行的类,亦即main方法所在的类。书写时要加上包名,在本例中是后面的test.CardLayoutDemo; f代表生成的jar包的名称,在本例中是CardLayoutDemo.jar。此包名可以随意命名,没有规定; test最后面的这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,273
精华内容 90,909
关键字:

下列属于可执行文件的是