# Patent

## Title
Method for plagiarism detection of multithreaded program based on thread slice birthmark

## Abstract

A method for plagiarism detection of multithreaded program based on a thread slice birthmark includes steps of: 1) monitoring target programs during executing, real-time identifying system call, and recording related information comprising thread IDs, system call numbers, and return values; then pre-treating the information for obtaining a valid system call sequence Trace; 2) slicing the valid system call sequence Trace, for generating a series of thread slices Slice identified by the thread IDs; 3) generating dynamic thread slice birthmarks Birth of all the thread slices of two programs; 4) respectively generating corresponding software birthmarks PB1 and PB2 of the P1 and the P2 ; 5) matching based on a max bilateral diagram for calculating a max similarity between the software birthmarks PB1 and PB2; and 6) determines whether the program is plagiarized or not according to an average value of the birthmark similarity and a given threshold ε.

## Background
CROSS REFERENCE OF RELATED APPLICATION
This is a U.S. National Stage under 35 U.S.C. 371 of the International Application PCT/CN2014/076079, filed Apr. 24, 2014, which claims priority under 35 U.S.C. 119(a-d) to CN 201410076931.X, filed Mar. 4, 2014.
BACKGROUND OF THE PRESENT INVENTION
Field of Invention
The present invention relates to a field of program feature discovering and software plagiarism detecting, and more particularly to a method for plagiarism detection of multithreaded program.
Description of Related Arts
Due to various physical bottlenecks (such as high temperature, power dissipation, electricity leakage), CPU clock speed is more and more difficult to be increased. In recent years, CPU manufacturers have shifted focus to hyper-threading and multi-core technologies for improving CPU performance. With hyper-threading and multi-core technologies as a standard of conventional CPU, serial programs have been difficult to take full advantage of the calculation ability of the conventional CPU. As a main method for parallel computing, multithreaded programs have become a key for taking full advantage CPU performance and improving system efficiency.
However, problems of intellectual property protection of multithreaded programs is becoming worse and worse with the rapid development of software, such as legal disputes involving Samsung and Apple about plagiarism of mobile phone applications. Such events often happen, which greatly threats interests of large companies. Therefore, plagiarism of multithreaded program has become a big block in front of the healthy development of software industry.
As a result, a series of methods have been raised to prevent and detect software plagiarism, wherein plagiarism detection technology based on software birthmark is a main method. Software birthmark is features reflecting inherent attributes of a program, which is able to be uniquely identified. Related researches measure similarity of two programs through converting plagiarism detecting to similarity analysis and based on similarity calculation, wherein key technologies mainly relate to extraction of high quality software birthmark and similarity calculation.
However, the conventional software birthmark is mainly designed for single-threaded program, which uses the key information obtained during a single program execution as the software birthmark, without considering thread interleaving of multithreaded program during execution. With same inputting conditions, different threads of multithreaded program interleave during execution, causing difference of program behaviors, such as system calls sequence. Such situation generates great randomness of the conventional birthmark based plagiarism detection method during analysis of multithreaded program. In addition, the conventional plagiarism detection methods are limited as follows. 1) Most of the methods are based on source code, but source code is usually unavailable during plagiarism detection, and only binary code of detecting target is available. 2) The conventional software birthmark greatly depends on a specific operating system or programming language, and has a small scope of application. 3) Most of the conventional software birthmark cannot handle varied and thorough code obfuscation technologies.
SUMMARY OF THE PRESENT INVENTION
An object of the present invention is to provide a method for plagiarism detection of multithreaded program based on a thread slice birthmark, so as to overcome the conventional limitations of the birthmark-based plagiarism detection methods. According to the present invention, the method is able to be directly applied to the binary code, and no source code is needed, which has more practical significance. The present invention has sufficient detection ability for multithreaded programs, which is able to reduce the non-determinism due to thread scheduling, and is not limited to single-threaded programs. The method does not depend on a specific programming language, and has a wider scope of application. The method also has very good resistance to semantics preserving code obfuscation, which improves detecting ability for deep plagiarism.
Accordingly, in order to accomplish the above object, the present invention provides:
a method for plagiarism detection of multithreaded program based on a thread slice birthmark, comprising steps of:
1) monitoring target programs during executing based on a dynamic instrumentation technology, real-time identifying system calls of the target programs, and recording related information comprising thread IDs, calling addresses, system call numbers, function names, parameters, and return values; then pre-treating the information, and removing invalid system call for obtaining a valid system call sequence Trace;
2) slicing the valid system call sequence Trace based on the thread IDs, for generating a series of thread slices Slice identified by the thread IDs;
3) based on the thread slices and through extracting a fixed sub-sequence of the thread slices and counting an occurrence number thereof, respectively generating dynamic thread slice birthmarks Birth of all the thread slices of a first target program P1 and a second target program P2, wherein the first target program is an original program of a program owner, and the second program is a suspicious program which is considered as a plagiarized program;
4) respectively generating corresponding software birthmarks PB1 and PB2 of the P1 and the P2 based on all the thread slices thereof;
5) matching based on a max bilateral diagram for calculating a max similarity between the software birthmarks PB1 and PB2; firstly calculating similarities between each thread slice birthmark of the software birthmark PB1 and each thread slice birthmark of the software birthmark PB2; secondly generating a max similarity matching scheme MaxMatch(PB1,PB2) of the PB1 and the PB2 based on a weighted bilateral diagram matching algorithm; finally calculating a birthmark similarity Sim(PB1,PB2) of the PB1 and the PB2 based on the max similarity matching scheme; and
6) determining plagiarism according to a birthmark similarity average value after several inputting as well as a given threshold.
Preferably, in the step 1), dynamic system call identification rules are: if a name of a currently executing function is matched with a system call function name in a system call list of an operation system, then identify the executing function as the system call.
Preferably, in the step 1), a monitoring method comprises steps of: applying the dynamic instrumentation technology to the target binary programs, implanting corresponding analyzing codes before and after the execution of the functions of the target programs, for monitoring the target programs during executing.
Preferably, in the step 1), a system call sequence generating method comprises steps of: capturing every function to be executed through function-level monitoring during executing, and analyzing a type thereof, matching the system call list of the operation system for determining whether the function is one of the system calls; meanwhile, with the thread ID where system call is localized, recording each thread ID where executed system call is localized; capturing the related information comprising the parameters and the return values; then according to an analysis result, recording the system call and adding the system call into a dynamic system call sequence; wherein a recording format of each system call is: thread ID # calling address # system call number # function name # parameter # return value.
Preferably, in the step 1), the recorded system call sequence is pre-treated, and invalid system calls are removed for obtaining the valid system call sequence, wherein the format of each system call event in the system call sequence is analyzed, and the return value thereof is judged; if the return value is −1, which illustrates the system call fails, then the system call is deleted;
defining Trace(p,I)=e1, e2, . . . , en, be a valid system call sequence extracted during a runtime of a program p with inputting I and processed with pre-treating, wherein ei comprises the system call number and the thread ID of the system call.
Preferably, the step 1) specifically comprises steps of:
S201: judging whether the target program has functions to be executed; if there is, switching to step S202; if there isn't, switching to step S208;
S202: analyzing a type of the function to be executed, judging whether the function is a system call; if it is, switching to step S203; if it isn't, switching to step S207;
S203: analyzing the system call for obtaining the related information comprising the thread IDs, the calling addresses, the system call numbers, the function names, the parameters, and the return values;
S204: judging whether the return value is −1; if it is, switching to the step S201; if it isn't, switching to step S205;
S205: obtaining the thread ID thereof;
S206: adding the system call to the system call sequence;
S207: executing the system call, and switching to the step S201 for next analyzing; and
S208: outputting the system call sequence.
Preferably, in the step 2), a method for generating the thread slices comprises steps of: based on the valid system call sequence extracted, stripping the thread ID of every system call in the valid system call sequence, as well as the system call number thereof; dividing into the thread slices according to thread ID identification;
defining Slice(p,I,t)={ej|ejεTrace (p,I) and getThreadID(ej)=t}, jε{1,2, . . . n},1≦t≦m,tεN; wherein Slice(p,I,t) refers to the thread slice corresponding to the thread t, m refers to there are m threads during execution.
Preferably, the step 2) specifically comprises steps of:
S301: judging whether the dynamic system call sequence inputted has system call to be treated; if there is, switching to step S302; if there isn't, switching to step S304;
S302: extracting a piece of the system call from the dynamic system call sequence in sequence, stripping out the thread ID and the system call number;
S303: adding the system call into the thread slice corresponding to the thread ID thereof then switching to the step S301 for next analyzing; and
S304: outputting the thread slice collection obtained, for further generating the software birthmark.
Preferably, in the step 3), a method for generating the thread slice birthmarks comprises steps of: applying the k-gram algorithm to the thread slice t(p,I,m), for obtaining a set of k-length sub-sequences Set(p,I,t,k)={gj|gj=(ej, ej, . . . , ej+k−)}, wherein jε{1,2, . . . , n−k+1}; then summing a frequency of each unique k-gram, for finally generating a collection of key value pairs; defining BirthpI(k,t) as a dynamic system call thread slice birthmark of the program p under the inputting I and the thread ID identification t, shortly recording as Birth(t), which is represented as BirthpI(k,t)={g′j,freq(g′j)|g′jεSet(p,I,t,k) and ∀j1≠j2,g′j1≠g′j2}, wherein freq (g′j) refers to an occurrence number of g′j in the collection Set(p,I,t,k),k=4 or 5.
Preferably, the step 3) specifically comprises steps of:
S401: judging whether a length of the thread slice to be treated is larger than an adjustable parameter k; if it is, switching to step S402; if it isn't, switching to step S408;
S402: using the k-gram algorithm for generating the k-length system call sub-sequence;
S403: connecting every element in the k-length system call sub-sequence for forming a character string, calculating a hash value thereof as a key for finding whether a same element exists in a collection B (which is empty initially); if it does, switching to step S406; if it doesn't, switching to step S404;
S404: creating a new element (which is a key-value pair) by taking the hash value as a key thereof, and setting a key value thereof to 1;
S405: adding the generated key value pair to the collection B, and switching to step S407;
S406: finding the element in the collection B according to a hash key, and updating the key value of the element;
S407: deleting an initial element of the thread slice, then switching to the step S401 for a next round of treating; and
S408: outputting the collection B formed by the key value pairs, which is the dynamic system call thread slice birthmark.
Preferably, in the step 4), a method for generating the software birthmarks comprises steps of: defining SB={BirthpI(k,t)|1≦t≦m,tεN}, which refers to a collection of all the thread slice birthmarks of the program, then establishing a SS conversion for converting the SB to the software birthmark PB, wherein SS: SB→PB represents treating each two-tuple consisted of a thread identifier and the corresponding thread birthmark identified by the thread identifier as each element comprising the software birthmark, and obtaining PB={(t,BirthpI(k,t))|sbεSB}.
Preferably, in the step 5), a method for calculating the similarities of the thread slice birthmarks comprise steps of: defining two thread slice birthmarks as A={k1,v1,k2,v2, . . . , kn,vn} and B={k′1,v′1,k′2,v′2, . . . , k′m,v′m }, firstly calculating the similarities by cosine distance, Jaccard, Dice and Containment metrics, wherein:
a) calculating the similarity of the A and the B by the cosine distance:




  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        cosine
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
              A
              →
            
            ·
            
              B
              →
            
          
          
            
              
              
                A
                →
              
              
            
            ⁢
            
              
              
                B
                →
              
              
            
          
        
        ×
        θ
      
    
  
  ;




b) calculating the similarity of the A and the B by the Jaccard metric:




  
    
      sim
      ⁢
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Jaccard
        ⁢
        
          
        
        ⁢
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
            
              A
              ⋂
              B
            
            
          
          
            
            
              A
              ⋃
              B
            
            
          
        
        ×
        θ
      
    
  
  ;




c) calculating the similarity of the A and the B by the Dice metric:




  
    
      sim
      ⁢
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Dice
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            2
            ⁢
            
              
              
                A
                ⋂
                B
              
              
            
          
          
            
              
              A
              
            
            +
            
              
              B
              
            
          
        
        ×
        θ
      
    
  
  ;




and

d) calculating the similarity of the A and the B by the Containment metric:




  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Containment
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
            
              A
              ⋂
              B
            
            
          
          
            
            A
            
          
        
        ×
        θ
      
    
  
  ;




wherein




  
    θ
    =
    
      
        min
        ⁡
        
          (
          
            
              
              
                A
                →
              
              
            
            ,
            
              
              
                B
                →
              
              
            
          
          )
        
      
      
        max
        ⁡
        
          (
          
            
              
              
                A
                →
              
              
            
            ,
            
              
              
                B
                →
              
              
            
          
          )
        
      
    
  
  ;




finally, averaging for obtaining the similarity of the A and the B:





  
    
      
        sim
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      _
    
    =
    
      
        
          cosine
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Jaccard
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Dice
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Containment
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
      
      4
    
  
  ,




which is shortly recorded as simc(A,B).

Preferably, in the step 5), calculating the similarities between each thread slice birthmark of the PB1 and each thread slice birthmark of the PB2 specifically comprises steps of: defining the software birthmarks PB1={(t1,Birth(t1)),(t2,Birth(t2)), . . . , (tm,Birth(tm))}, and defining the software birthmarks PB2={(t′1,Birth(t′1)),(t′2,Birth(t′2)), . . . , (t′n,Birth(t′n))}; calculating the similarities between m thread slice birthmarks of the PB1 and n thread slice birthmark of the PB2, for generating a m*n similarity matrix SimMatrix(PB1,PB2), wherein SimMatrix(PB1,PB2)[i][j]=simc(Birth(ti),Birth(t′j)).
Preferably, in the step 5), generating the max similarity matching scheme MaxMatch(PB1,PB2) of the PB1 and the PB2 based on the weighted bilateral diagram matching algorithm specifically comprises steps of: based on SimMatrix(A,B), using the weighted bilateral diagram matching algorithm for calculating the max similarity matching scheme of all the thread slice birthmarks of the PB1 and the PB2, recording as MaxMatch(PB1,PB2), wherein MaxMatch(PB1,PB2)={(u1,v1),(u2,v2), . . . , (u1,v1)}, l=min(m,n), uiεkeyset(PB1), viεkeyset(PB2), ui≠uj if i≠j, vi≠vj if i≠j, and




  
    ∑
    i
    l
  
  ⁢
  
    
  
  ⁢
  
    
      sim
      c
    
    ⁡
    
      (
      
        
          u
          i
        
        ,
        
          v
          j
        
      
      )
    
  




has a maximum value among all possible matching schemes.

Preferably, in the step 5), calculating the birthmark similarity of the PB1 and the PB2 specifically comprises steps of: based on the max similarity matching scheme of the PB1 and the PB2, calculating




  
    
      Sim
      ⁡
      
        (
        
          
            PB
            1
          
          ,
          
            PB
            2
          
        
        )
      
    
    =
    
      
        
          ∑
          
            
              (
              
                
                  t
                  i
                
                ,
                
                  t
                  j
                  ′
                
              
              )
            
            ∈
            
              MaxMatch
              ⁡
              
                (
                
                  
                    PB
                    1
                  
                  ,
                  
                    PB
                    2
                  
                
                )
              
            
          
        
        ⁢
        
          
            
              sim
              c
            
            ⁡
            
              (
              
                
                  t
                  i
                
                ,
                
                  t
                  j
                  ′
                
              
              )
            
          
          ×
          
            (
            
              
                count
                ⁡
                
                  (
                  
                    t
                    i
                  
                  )
                
              
              +
              
                count
                ⁡
                
                  (
                  
                    t
                    j
                    ′
                  
                  )
                
              
            
            )
          
        
      
      
        
          
            ∑
            
              i
              =
              1
            
            m
          
          ⁢
          
            
          
          ⁢
          
            count
            ⁡
            
              (
              
                t
                i
              
              )
            
          
        
        +
        
          
            ∑
            
              j
              =
              1
            
            n
          
          ⁢
          
            
          
          ⁢
          
            count
            ⁡
            
              (
              
                t
                j
                ′
              
              )
            
          
        
      
    
  
  ,




wherein count(ti)=|keySet(Birth(ti))|, and count(t′j)=|keySet(Birth(t′j))|.

Preferably, in the step 6), a plagiarism determination module uses the birthmark similarities between the first program and the second program after several inputting, as inputting for calculating an average similarity value as the similarity of the programs, and determines whether the program is plagiarized or not according to the given threshold ε and outputting a detection result.
Preferably, in the step 6), a range of the given threshold ε is 0.2-0.3;
wherein




  
    sim
    ⁡
    
      (
      
        
          P
          A
        
        ,
        
          P
          B
        
      
      )
    
  
  =
  
    {
    
      
        
          
            
              
                ≥
                
                  1
                  -
                  
                    ɛ
                    ⁢
                    
                      
                    
                    ⁢
                    plagiarism
                    ⁢
                    
                      
                    
                    ⁢
                    exists
                    ⁢
                    
                      
                    
                    ⁢
                    between
                    ⁢
                    
                      
                    
                    ⁢
                    
                      P
                      A
                    
                  
                
              
              ,
              
                P
                B
              
            
          
        
        
          
            
              
                ≤
                
                  ɛ
                  ⁢
                  
                    
                  
                  ⁢
                  
                    P
                    A
                  
                
              
              ,
              
                
                  P
                  B
                
                ⁢
                
                  
                
                ⁢
                are
                ⁢
                
                  
                
                ⁢
                indiviual
              
            
          
        
        
          
            
              Otherwise
              ⁢
              
                
              
              ⁢
              no
              ⁢
              
                
              
              ⁢
              conclusion
            
          
        
      
      ;
    
  




wherein the sim(PA,PB) is an average value of the birthmark similarity between the first program and the second program.
Compared with the conventional technologies, the present invention has advantages as follows.
(1) According to the present invention, no source code is needed in the target for detection, and binary code is able to be directly analyzed, which has more practical value; wherein in most cases, suspicious program is published in binary code form, and source code thereof is unavailable until obtaining conclusive evidences, thus rendering the conventional source code plagiarism detection method useless. The invention is based on dynamic instrumentation for monitoring software, and binary code is directly analyzed, so as to get rid of the above limitation.
(2) According to the present invention, the underlying object to be analyzed is the system call, which is not dependent on a specific programming language, thus having a wider application range.
(3) The present invention is applicable to multithreaded program. Through performing thread slicing during generating the software birthmark, the randomness caused by thread scheduling during program execution is well reduced, so as to effectively improve detection accuracy.
(4) According to the present invention, the software birthmark is generated based on dynamic system call sequences extracted based on monitoring, which belongs to dynamic birthmark, thus having natural resistance to encryption, compression, packaging and other light confound methods, since program processed with the light confusion methods must be decrypted, decompressed or unpacked before executing.



BRIEF DESCRIPTION OF THE DRAWINGS
FIG. 1 is an overall flow chart of a method for plagiarism detection of multithreaded program based on a thread slice birthmark according to the present invention.
FIG. 2 is a flow chart of extracting dynamic system call sequence based on monitoring during executing.
FIG. 3 is a flow chart of conducting pre-treating and performing thread slicing.
FIG. 4 is a flow chart of generating dynamic thread slice birthmark.
FIG. 5 is a flow chart of calculating software birthmark similarity.



DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENT
Referring to the drawings, a preferred embodiment of the present invention is illustrated.
FIG. 1 is an overall flow chart of a method for plagiarism detection of multithreaded program based on a thread slice birthmark according to the present invention.
A method for plagiarism detection of multithreaded program based on a thread slice birthmark, comprises steps as follows.
S101: Applying dynamic instrumentation tools such as Pin and Valgrind, implanting analyzing codes to functions of target programs before and after executing, for providing function-level information monitoring of binary code programs.
Referring to FIG. 2, the step S101 specifically comprises steps of:
S201: judging whether the target program has functions to be executed; if there is, switching to step S202; if there isn't, switching to step S208;
S202: analyzing a type of the function to be executed, judging whether the function is a system call; if it is, switching to step S203; if it isn't, switching to step S207;
S203: analyzing the system call for obtaining the related information comprising the thread IDs, the calling addresses, the system call numbers, the function names, the parameters, and the return values;
S204: judging whether the return value is −1; if it is, switching to the step S201 for analyzing a next function to be executed; if it isn't, switching to step S205;
S205: obtaining the thread ID thereof;
S206: adding the system call to the system call sequence;
S207: executing the system call, and switching to the step S201 for next analyzing; and
S208: outputting the system call sequence.
For example, a system call sequence of a program P1 under inputting I is Trace(p1,I)=(t1,sc−1),(t1,sc−2),(t1,sc−3),(t1,sc−2),(t2,sc−2),(t2,sc−3),(t1,sc 4), wherein sc−i refers to a system call number of system call.
S102: Slicing the valid system call sequence based on the thread IDs, for generating a series of thread slices identified by the thread IDs; wherein specific steps of the step S102 are shown in FIG. 3:
S301: judging whether the dynamic system call sequence inputted has system call to be treated; if there is, switching to step S302; if there isn't, switching to step S304;
S302: extracting a piece of the system call from the dynamic system call sequence in sequence, stripping out the thread ID and the system call number;
S303: adding the system call into the thread slice corresponding to the thread ID thereof, then switching to the step S301 for next analyzing; and
S304: outputting a thread slice collection obtained, for further generating the software birthmark.
For the Trace (p1,I) obtained in the step S101, there are only two threads. Therefore, the Trace (p1,I) is sliced into two thread slices identified by the thread IDs: Slice(t1)=(t1,sc−1),(t1,sc−2),(t1,sc−3),(t1,sc−2),(t1,sc−4) and Slice(t2)=(t2,sc−2),(t2,sc−3).
S103: Based on the thread slice collection obtained by pre-treatment and an adjustable parameter k (usually 4 or 5), applying a k-gram algorithm for generating a series of k-length sub-sequences; meanwhile, summing occurrence frequencies of different sub-sequences, and forming a key value pair collection with the sub-sequences and the occurrence frequencies thereof as a dynamic thread slice birthmark; wherein generating the thread slice birthmark Birth comprises steps as shown in FIG. 4:
S401: judging whether a length of the thread slice to be treated is larger than an adjustable parameter k; if it is, switching to step S402; if it isn't, switching to step S408;
S402: using the k-gram algorithm for generating the k-length system call sub-sequence;
S403: connecting every element in the k-length system call sub-sequence for forming a character string, calculating a hash value thereof as a key for finding whether a same element exists in a collection B (which is empty initially); if it does, switching to step S406; if it doesn't, switching to step S404;
S404: creating a new element (which is a key-value pair) by taking the hash value as a key thereof, and setting a key value thereof to 1;
S405: adding the generated key value pair to the collection B, and switching to step S407;
S406: finding the element in the collection B according to a hash key, and updating the key value of the element;
S407: deleting an initial element of the thread slice, then switching to the step S401 for a next round of treating; and
S408: outputting the collection B formed by the key value pairs, which is the dynamic system call thread slice birthmark.
Generating the thread slice birthmarks of the above two thread slices when setting the value of k to 2 are respectively: for Slice(t1=(t1,sc−1),(t1,sc−2),(t1,sc−3),(t1,sc−2),(t1,sc−4), obtaining Set(p1I,t1)={(sc−1,sc−2),(sc−2,sc−3),(sc−3,sc−2),(sc−2,sc−4)} with the k-gram algorithm; then combining terms with same keys and modifying corresponding values thereof, finally generating a thread slice birthmark Birthp1I(2,t1)={(sc−1,sc−2),1,(sc−2,sc−3),1,(sc−3,sc−2),1,(sc−2,sc−4),1}; similarly, for Slice(t2)=(t2,sc−2),(t2,sc−3), obtaining a thread slice birthmark Birthp1I(2,t2)={(sc−2,sc−3),1}.
Taking the above program as the first program, then processing program P2 with the step S101 for obtaining a system call sequence Trace(p2,I)=(t′1,sc−1),(t′2,sc−2),(t′1,sc−2),(t′2,sc-3),(t′1,sc−3),(t′1,sc−2), (t′1,sc−4), executing the steps S102 and S103 for obtaining thread slice birthmarks thereof: Birthp2I (2,t′1)={(sc−1,sc−2),1,(sc−2,sc−3),1,(sc−3,sc−2),1,(sc−2,sc−4),1} and Birthp2I (2,t′2)={(sc−2,sc−3),1)}.
S104: respectively generating corresponding software birthmarks PB1 and PB2 of the P1 and the P2 based on all the thread slices thereof.
The step S104 specifically comprises steps of: defining SB={BirthpI(k,t)|1≦t≦m,tεN}, which refers to a collection of all the thread slice birthmarks of the program, then establishing a SS conversion for converting the SB to the software birthmark PB, wherein SS: SB→PB represents treating each two-tuple consisted of a thread identifier and the corresponding thread birthmark identified by the thread identifier as each element comprising the software birthmark, and obtaining PB={(t,BirthpI(k,t))|sbεSB}.
According to the above steps, a software birthmark PB1={(t1,Birthp1I(2,t1)),(t2,Birthp1I(2,t2))}, generated from the two thread slice birthmarks of the program P1 is obtained, and a software birthmark PB2={(t′1,Birthp2I(2,t′1)),(t′2,Birthp2I(2,t′2))} of the program P2 is obtained.
S105: calculating a max similarity between the software birthmarks PB1 and PB2 based on a maximal bilateral diagram matching, which specifically comprises steps as shown in FIG. 5:
S501: calculating the similarities between each thread slice birthmark of the PB1 and each thread slice birthmark of the PB2 specifically comprises steps of: defining the software birthmarks PB1={(t1,Birth(t1)), (t2,Birth(t2)), . . . , (tm,Birth(tm))}, and defining the software birthmarks PB2={(t′1,Birth(t′1)),(t′2,Birth(t′2)), . . . , (t′n,Birth(t′n))}; calculating the similarities between m thread slice birthmarks of the PB1 and n thread slice birthmark of the PB2, for generating a m*n similarity matrix SimMatrix(PB1,PB2), wherein SimMatrix(PB1,PB2)[i][j]=simc(Birth(ti),Birth(t′j)).
A method for calculating a similarity between two thread slice birthmark A={k1,v1, k2,v2, . . . , kn,vn} and B={k′1,v′1,k′2,v′2, . . . , k′m,v′m} comprises steps of calculating the similarities by cosine distance, Jaccard, Dice and Containment metric, wherein:
a) calculating the similarity of the A and the B by the cosine distance:




  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        cosine
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
              A
              →
            
            ·
            
              B
              →
            
          
          
            
              
              
                A
                →
              
              
            
            ⁢
            
              
              
                B
                →
              
              
            
          
        
        ×
        θ
      
    
  
  ;




b) calculating the similarity of the A and the B by the Jaccard metric:




  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Jaccard
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
            
              A
              ⋂
              B
            
            
          
          
            
            
              A
              ⋃
              B
            
            
          
        
        ×
        θ
      
    
  
  ;




c) calculating the similarity of the A and the B by the Dice metric:




  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Dice
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            2
            ⁢
            
              
              
                A
                ⋂
                B
              
              
            
          
          
            
              
              A
              
            
            +
            
              
              B
              
            
          
        
        ×
        θ
      
    
  
  ;




and

d) calculating the similarity of the A and the B by the Containment metric:




  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Containment
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
            
              A
              ⋂
              B
            
            
          
          
            
            A
            
          
        
        ×
        θ
      
    
  
  ;




wherein




  
    θ
    =
    
      
        min
        ⁡
        
          (
          
            
              
              
                A
                →
              
              
            
            ,
            
              
              
                B
                →
              
              
            
          
          )
        
      
      
        max
        ⁡
        
          (
          
            
              
              
                A
                →
              
              
            
            ,
            
              
              
                B
                →
              
              
            
          
          )
        
      
    
  
  ;




finally, averaging for obtaining the similarity of the A and the B:





  
    
      
        sim
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      _
    
    =
    
      
        
          cosine
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Jaccard
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Dice
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Containment
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
      
      4
    
  
  ,




which is shortly recorded as simc(A,B).

For example, a procedure of calculating similarity between the Birthp1I(t1) of the PB1 and the Birthp2I(t′2) of the PB2 comprises steps of: firstly calculating the cosine distance thereof:




  
    
      cosine
      ⁡
      
        (
        
          
            
              Birth
              
                P
                1
              
              I
            
            ⁡
            
              (
              
                2
                ,
                
                  t
                  1
                
              
              )
            
          
          ,
          
            
              Birth
              
                P
                2
              
              I
            
            ⁡
            
              (
              
                2
                ,
                
                  t
                  2
                  ′
                
              
              )
            
          
        
        )
      
    
    =
    
      
        
          1
          
            
              4
            
            ×
            1
          
        
        ·
        θ
      
      =
      
        
          
            1
            
              
                4
              
              ×
              1
            
          
          ·
          
            1
            4
          
        
        =
        
          1
          8
        
      
    
  
  ,




then calculating the similarity by the Jaccard, the Dice and the Containment metrics, wherein results are respectively 1⁄8, 1/10 and 1/16; averaging the four value as a final similarity of the two thread slice birthmark that: simc(Birthp1I(2,t1),Birthp2I(2,t′2))=(1⁄8+1⁄8+ 1/10+ 1/16)÷4=0.103; repeating the above steps for calculating similarities between the two threads of the PB1 and the two threads of the PB2, so as to obtain a similarity matrix of the PB1 and PB2:





  
    SimMatrix
    ⁡
    
      (
      
        
          PB
          1
        
        ,
        
          PB
          2
        
      
      )
    
  
  =
  
    
      [
      
        
          
            1
          
          
            0.103
          
        
        
          
            0.103
          
          
            1
          
        
      
      ]
    
    .
  




S502: generating the max similarity matching scheme MaxMatch(PB1,PB2) of the PB1 and the PB2 based on the weighted bilateral diagram matching algorithm.
The step S502 specifically comprises steps of: based on SimMatrix(A,B), using the weighted bilateral diagram matching algorithm for calculating the max similarity matching scheme of all the thread slice birthmarks of the PB1 and the PB2, recording as MaxMatch(PB1,PB2), wherein MaxMatch(PB1,PB2)={(u1,v1), (u2,v2), . . . , (u1,v1)}, l=min(m,n), uiεkeyset(PB1), viεkeyset(PB2), ui≠uj if i≠j, vi≠vj if i≠j, and




  
    ∑
    i
    l
  
  ⁢
  
    
  
  ⁢
  
    
      sim
      c
    
    ⁡
    
      (
      
        
          u
          i
        
        ,
        
          v
          j
        
      
      )
    
  




has a maximum value among all possible matching schemes.

There are two matching schemes for the above example: Match1(PB1,PB2)={(t1,t′1),(t2,t′2)} and Match2(PB1,PB2)={(t1,t′2),(t2,t′1)}. However, according to calculation, a value of the Match1 is higher than a value of the Match2. Therefore, the Match1 is used as the max similarity matching scheme for the PB1 and the PB2.
S503: calculating the birthmark similarity of the PB1 and the PB2 specifically comprises steps of: based on the max similarity matching scheme of the PB1 and the PB2, calculating




  
    
      Sim
      ⁡
      
        (
        
          
            PB
            1
          
          ,
          
            PB
            2
          
        
        )
      
    
    =
    
      
        
          ∑
          
            
              (
              
                
                  t
                  i
                
                ,
                
                  t
                  j
                  ′
                
              
              )
            
            ∈
            
              MaxMatch
              ⁡
              
                (
                
                  
                    PB
                    1
                  
                  ,
                  
                    PB
                    2
                  
                
                )
              
            
          
        
        ⁢
        
          
            
              sim
              
                c
                ⁢
                
                  
                
              
            
            ⁡
            
              (
              
                
                  t
                  i
                
                ,
                
                  t
                  j
                  ′
                
              
              )
            
          
          ×
          
            (
            
              
                count
                ⁡
                
                  (
                  
                    t
                    i
                  
                  )
                
              
              +
              
                count
                ⁡
                
                  (
                  
                    t
                    j
                    ′
                  
                  )
                
              
            
            )
          
        
      
      
        
          
            ∑
            
              i
              =
              1
            
            m
          
          ⁢
          
            count
            ⁡
            
              (
              
                t
                i
              
              )
            
          
        
        +
        
          
            ∑
            
              j
              =
              1
            
            n
          
          ⁢
          
            count
            ⁡
            
              (
              
                t
                j
                ′
              
              )
            
          
        
      
    
  
  ,




wherein count(ti)=|keySet(Birth(ti))|, and count(t′j)=|keySet(Birth(t′j))|.

According to the above formula, Sim(PB1,PB2)=1.
S106: the birthmarks generated under different inputting may be different, thus several inputting are provided and a series of similarity values (S1,S2, . . . , Sn) are corresponding calculated; an average value of the scores are computed as the final similarity of the programs for reducing effect of random factors; and determines whether the program is plagiarized or not according to the adjustable threshold ε (0.2-0.3) and outputting a detection result.
The step 106 specifically comprises steps of: providing a series of imputing I1,I2, . . . , In for a program PA and a program PB (wherein imputing for the two programs are the same), correspondingly generating a series of software birthmarks PBA1,PBA2, . . . , PBAn and PBB1,PBB2, . . . , PBBn, getting




  
    
      sim
      ⁡
      
        (
        
          
            P
            A
          
          ,
          
            P
            B
          
        
        )
      
    
    =
    
      
        
          ∑
          
            i
            =
            1
          
          n
        
        ⁢
        
          sim
          ⁡
          
            (
            
              
                PB
                Ai
              
              ,
              
                PB
                Bi
              
            
            )
          
        
      
      n
    
  
  ;




then plagiarism is determined according to the similarity of the two programs and the adjustable threshold ε, specifically:





  
    sim
    ⁢
    
      (
      
        
          P
          A
        
        ,
        
          P
          B
        
      
      )
    
  
  =
  
    {
    
      
        
          
            
              ≥
              
                1
                -
                ɛ
              
            
          
          
            
              
                plagiarism
                ⁢
                
                  
                
                ⁢
                exists
                ⁢
                
                  
                
                ⁢
                between
                ⁢
                
                  
                
                ⁢
                
                  P
                  A
                
              
              ,
              
                P
                B
              
            
          
        
        
          
            
              
                ≤
                
                  ɛ
                  ⁢
                  
                    
                  
                  ⁢
                  
                    P
                    A
                  
                
              
              ,
              
                P
                B
              
            
          
          
            
              are
              ⁢
              
                
              
              ⁢
              individual
            
          
        
        
          
            Otherwise
          
          
            
              no
              ⁢
              
                
              
              ⁢
              conclusion
            
          
        
      
      .

## Claims

1. A method for plagiarism detection of multithreaded program based on a thread slice birthmark, comprising steps of:
1) monitoring target programs during executing based on a dynamic instrumentation technology, real-time identifying system calls of the target programs, and recording related information comprising thread IDs, calling addresses, system call numbers, function names, parameters, and return values; then pre-treating the information, and removing invalid system call for obtaining a valid system call sequence Trace;
2) slicing the valid system call sequence Trace based on the thread IDs, for generating a series of thread slices Slice identified by the thread IDs;
3) based on the thread slices and through extracting a fixed sub-sequence of the thread slices and counting an occurrence number thereof, respectively generating dynamic thread slice birthmarks Birth of all the thread slices of a first target program P1 and a second target program P2, wherein the first target program is an original program of a program owner, and the second program is a suspicious program which is considered as a plagiarized program;
4) respectively generating corresponding software birthmarks PB1 and PB2 of the P1 and the P2 based on all the thread slices thereof;
5) matching based on a max bilateral diagram for calculating a max similarity between the software birthmarks PB1 and PB2; firstly calculating similarities between each thread slice birthmark of the software birthmark PB1 and each thread slice birthmark of the software birthmark PB2; secondly generating a max similarity matching scheme MaxMatch(PB1,PB2) of the PB1 and the PB2 based on a weighted bilateral diagram matching algorithm; finally calculating a birthmark similarity Sim(PB1,PB2) of the PB1 and the PB2 based on the max similarity matching scheme; and
6) determining plagiarism according to a birthmark similarity average value after several inputting as well as a given threshold.

2. The method, as recited in claim 1, wherein in the step 1), dynamic system call identification rules are: if a name of a currently executing function is matched with a system call name in a system call list of an operation system, then identify the executing function as the system call; in the step 1), a monitoring method comprises steps of: applying the dynamic instrumentation technology to the target binary programs, implanting corresponding analyzing codes before and after the execution of the functions of the target programs, for monitoring the target programs during executing; in the step 1), a system call sequence generating method comprises steps of: capturing every function to be executed through function-level monitoring during executing, and analyzing a type thereof, matching the system call list of the operation system for determining whether the function is one of the system calls; meanwhile, with the thread ID where system call is localized, recording each thread ID where executed system call is localized; capturing the related information comprising the parameters and the return values; then according to an analysis result, recording the system call and adding the system call into a dynamic system call sequence; wherein a recording format of each system call is: thread ID # calling address # system call number # function name # parameter # return value.

3. The method, as recited in claim 1, wherein in the step 1), the recorded system call sequence is pre-treated, and the invalid system calls are removed for obtaining the valid system call sequence, wherein the format of each system call event in the system call sequence is analyzed, and a return value thereof is judged; if the return value is −1, which illustrates the system call fails, then the system call is deleted;
defining Trace(p,I)=e1, e2, . . . , en, be a valid system call sequence extracted during a runtime of a program p with inputting I and processed with pre-treating, wherein ei comprises the system call number and the thread ID of the system call.

4. The method, as recited in claim 1, wherein in the step 2), a method for generating the thread slices comprises steps of: based on the valid system call sequence extracted, stripping the thread ID of every system call in the valid system call sequence, as well as the system call number thereof; dividing into the thread slices according to thread ID identification;
defining Slice(p,I,t)={ej|ej εTrace(p,I) and getThreadID(ej)=t}, jε{1, 2, . . . , n}, 1≦t≦m,tεN; wherein Slice(p,I,t) refers to the thread slice corresponding to the thread t, m refers to there are m threads during execution.

5. The method, as recited in claim 1, wherein in the step 3), a method for generating the thread slice birthmarks comprises steps of: applying a k-gram algorithm to the thread slice t(p,I,m), for obtaining a set of k-length sub-sequences Set(p,I,t,k)={gj|gj=(ej, ej, . . . , ej+k−1)}, wherein jε{1, 2, . . . , n−k+1}; then summing a frequency of each unique k-gram, for finally generating a collection of key value pairs; defining BirthpI(k,t) as a dynamic system call thread slice birthmark of the program p under the inputting I and the thread ID identification t, shortly recording as Birth(t), which is represented as BirthpI(k,t)={g′j,freq(g′j)|g′jεSet(p,I,t,k) and ∀j1≠j2,g′j1≠g′j2}, wherein freq(g′j) refers to an occurrence number of g′j in the collection Set(p,I,t,k),k=4 or 5.

6. The method, as recited in claim 1, wherein in the step 4), a method for generating the software birthmarks comprises steps of: defining SB={BirthpI(k,t)|1≦t≦m,tεN}, which refers to a collection of all the thread slice birthmarks of the program, then establishing a SS conversion for converting the SB to the software birthmark PB, wherein SS: SB→PB represents treating each two-tuple consisted of a thread identifier and the corresponding thread birthmark identified by the thread identifier as each element comprising the software birthmark, and obtaining PB={(t,BirthpI (k,t))|sbεSB}.

7. The method, as recited in claim 1, wherein in the step 5), a method for calculating the similarities of the thread slices comprises steps of: defining two thread slice birthmarks as A={k1,v1, k2,v2, . . . , kn,vn} and B={k′1,v′1, k′2,v′2, . . . , k′m,v′m }, firstly calculating the similarities by cosine distance, Jaccard, Dice and Containment metrics, wherein:
a) calculating the similarity of the A and the B by the cosine distance:





  
    
      sim
      ⁡
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        cosine
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
              A
              →
            
            ·
            
              B
              →
            
          
          
            
              
              
                A
                →
              
              
            
            ⁢
            
              
              
                B
                →
              
              
            
          
        
        ×
        θ
      
    
  
  ;



b) calculating the similarity of the A and the B by the Jaccard metric:





  
    
      sim
      ⁢
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Jaccard
        ⁢
        
          
        
        ⁢
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
            
              A
              ⋂
              B
            
            
          
          
            
            
              A
              ⋃
              B
            
            
          
        
        ×
        θ
      
    
  
  ;



c) calculating the similarity of the A and the B by the Dice metric:





  
    
      sim
      ⁢
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Dice
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            2
            ⁢
            
              
              
                A
                ⋂
                B
              
              
            
          
          
            
              
              A
              
            
            +
            
              
              B
              
            
          
        
        ×
        θ
      
    
  
  ;



 and
d) calculating the similarity of the A and the B by the Containment metric:





  
    
      sim
      ⁢
      
        (
        
          A
          ,
          B
        
        )
      
    
    =
    
      
        Containment
        ⁢
        
          
        
        ⁢
        
          (
          
            A
            ,
            B
          
          )
        
      
      =
      
        
          
            
            
              A
              ⋂
              B
            
            
          
          
            
            A
            
          
        
        ×
        θ
      
    
  
  ;



wherein





  
    θ
    =
    
      
        min
        ⁡
        
          (
          
            
              
              
                A
                →
              
              
            
            ,
            
              
              
                B
                →
              
              
            
          
          )
        
      
      
        max
        ⁡
        
          (
          
            
              
              
                A
                →
              
              
            
            ,
            
              
              
                B
                →
              
              
            
          
          )
        
      
    
  
  ;



 finally, averaging for obtaining the similarity of the A and the B:





  
    
      
        sim
        ⁡
        
          (
          
            A
            ,
            B
          
          )
        
      
      _
    
    =
    
      
        
          cosine
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Jaccard
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Dice
          ⁡
          
            (
            
              A
              ,
              B
            
            )
          
        
        +
        
          Containment
          ⁢
          
            
          
          ⁢
          
            (
            
              A
              ,
              B
            
            )
          
        
      
      4
    
  
  ,



 which is shortly recorded as simc(A,B).

8. The method, as recited in claim 7, wherein in the step 5), calculating the similarities between each thread slice birthmark of the PB1 and each thread slice birthmark of the PB2 specifically comprises steps of: defining the software birthmarks PB1={(t1,Birth(t1)),(t2,Birth(t2)), . . . , (tm,Birth(tm))}, and defining the software birthmarks PB2={(t′1,Birth(t′1)), (t′2,Birth(t′2)), . . . , (t′n,Birth(t′n))}; calculating the similarities between m thread slice birthmarks of the PB1 and n thread slice birthmark of the PB2, for generating a m*n similarity matrix SimMatrix(PB1,PB2), wherein SimMatrix(PB1,PB2)[i][j]=simc(Birth(ti),Birth(t′j)); wherein in the step 5), generating the max similarity matching scheme MaxMatch(PB1,PB2) of the PB1 and the PB2 based on the weighted bilateral diagram matching algorithm specifically comprises steps of: based on SimMatrix(A,B), using the weighted bilateral diagram matching algorithm for calculating the max similarity matching scheme of all the thread slice birthmarks of the PB1 and the PB2, recording as MaxMatch(PB1,PB2), wherein MaxMatch(PB1,PB2)={(u1,v1),(u2,v2), . . . , (u1,v1)}, l=min(m,n), uiεkeyset(PB1), viεkeyset(PB2), ui≠uj if i≠j, vi≠vj if i≠j, and




  
    ∑
    i
    l
  
  ⁢
  
    
      sim
      c
    
    ⁡
    
      (
      
        
          u
          i
        
        ,
        
          v
          j
        
      
      )
    
  




has a maximum value among all possible matching schemes; wherein in the step 5), calculating the birthmark similarity of the PB1 and the PB2 specifically comprises steps of: based on the max similarity matching scheme of the PB1 and the PB2, calculating




  
    
      Sim
      ⁡
      
        (
        
          
            PB
            1
          
          ,
          
            PB
            2
          
        
        )
      
    
    =
    
      
        
          ∑
          
            
              (
              
                
                  t
                  i
                
                ,
                
                  t
                  j
                  ′
                
              
              )
            
            ∈
            
              MaxMatch
              ⁡
              
                (
                
                  
                    PB
                    1
                  
                  ,
                  
                    PB
                    2
                  
                
                )
              
            
          
        
        ⁢
        
          
            
              sim
              
                c
                ⁢
                
                  
                
              
            
            ⁡
            
              (
              
                
                  t
                  i
                
                ,
                
                  t
                  j
                  ′
                
              
              )
            
          
          ×
          
            (
            
              
                count
                ⁡
                
                  (
                  
                    t
                    i
                  
                  )
                
              
              +
              
                count
                ⁡
                
                  (
                  
                    t
                    j
                    ′
                  
                  )
                
              
            
            )
          
        
      
      
        
          
            ∑
            
              i
              =
              1
            
            m
          
          ⁢
          
            count
            ⁡
            
              (
              
                t
                i
              
              )
            
          
        
        +
        
          
            ∑
            
              j
              =
              1
            
            n
          
          ⁢
          
            count
            ⁡
            
              (
              
                t
                j
                ′
              
              )
            
          
        
      
    
  
  ,




wherein count(ti)=keySet(Birth(ti)), and count(t′j)=|keySet(Birth(t′j))|.

9. The method, as recited in claim 1, wherein in the step 6), a plagiarism determination module uses the birthmark similarities between the first program and the second program after several inputting, as inputting for calculating an average similarity value as the similarity of the programs, and determines whether the program is plagiarized or not according to the given threshold ε and outputting a detection result.

10. The method, as recited in claim 9, wherein in the step 6), a range of the given threshold ε is 0.2-0.3;




  
    wherein
    ⁢
    
      
    
    ⁢
    sim
    ⁢
    
      (
      
        
          P
          A
        
        ,
        
          P
          B
        
      
      )
    
  
  =
  
    {
    
      
        
          
            
              ≥
              
                1
                -
                ɛ
              
            
          
          
            
              
                plagiarism
                ⁢
                
                  
                
                ⁢
                exists
                ⁢
                
                  
                
                ⁢
                between
                ⁢
                
                  
                
                ⁢
                
                  P
                  A
                
              
              ,
              
                P
                B
              
            
          
        
        
          
            
              
                ≤
                
                  ɛ
                  ⁢
                  
                    
                  
                  ⁢
                  
                    P
                    A
                  
                
              
              ,
              
                P
                B
              
            
          
          
            
              are
              ⁢
              
                
              
              ⁢
              individual
            
          
        
        
          
            Otherwise
          
          
            
              no
              ⁢
              
                
              
              ⁢
              conclusion
            
          
        
      
      ;
    
  



wherein the sim(PA,PB) is an average value of the birthmark similarity between the first program and the second program.