Detailed Description
Exemplary embodiments of the present invention will be described in more detail below with reference to the accompanying drawings. While exemplary embodiments of the present invention are shown in the drawings, it should be understood that the present invention may be embodied in various forms and should not be limited to the embodiments set forth herein.
Before the description of the android system injection detection method in the embodiment of the invention is carried out, related nouns are explained:
Xposed A dynamic hijacking project aiming at an Android platform developed by rovo89 is a framework service capable of influencing program operation under the condition of not modifying APK. Xposed controls Zygote the process by the substitution/system/bin/app_process program, so that the app_process loads the jar packet xposedbridge.
App_process, an important compiled executable file in the target android system. The execution file is responsible for starting the Android core process Zygote and the system_server during the boot process. The app_process may also be used to run executable java programs.
ELF Executable and Linkable Format, executable connectible format, is part of the Unix/Linux system ABI (Application Binary Interface) specification. Executable binary files, object code files, shared library files, and core dump files under Unix/Linux all belong to ELF files. From the assembler and linker perspective, an ELF file is a collection of series of sections described by Section Header Table (Section header table). The first few tens of segments of the ELF file are ELF HEADER, the ELF file header.
ELF File header ELF HEADER, ELF the first tens of segments of the file. Basic information such as an architecture and an operating system corresponding to the ELF file is recorded, wherein the basic information comprises Section Header Table positions in the file, contained Section table sizes, numbers and the like.
Section is a component unit of the content of the object code file, the information in Section is used for the link to relocate the code, and the Section in the object code is organized into each Section (segment) of the executable file by the link. In the ELF file, one section necessarily has one section header describing it, but one section header does not necessarily have a corresponding section in the file, because some sections do not occupy a file word segment.
Section Header Table A fragment header table, which describes the information of each fragment, such as the fragment name of each fragment, the fragment length, the offset in the file, the read-write permissions, and other attributes of the fragment. The structure of the fragment header table is an array with the elf32_ Shdr structure (fragment descriptor) as an element.
String Section, in the ELF file, a number of strings, such as symbols of function names and global variable names defined and referenced in the program, and information related to the symbols, are used. The character string type is stored in the form of fragments in the ELF file, and the common fragment names are ". Strtab" or ". Shstrtab". The two String tables are a String Table (String Table) and a fragment Table String Table (HEADER STRING Table), respectively, the String Table stores common strings, and the fragment Table String Table is used for storing strings used in the fragment Table, such as fragment names.
Native layer, local service layer, which is mainly used to realize some local services and store some link libraries. The Native layer is characterized in that the Native layer is realized through C and C++ languages, and the code running efficiency, the code reversing and the debugging difficulty are higher than those of the java layer. Native can communicate with the Java layer through Jni mechanisms.
JNI (Java NATIVE INTERFACE) provides the Java with the ability to invoke C and c++ code. The JAVA can realize cross-platform and interact with dynamic libraries of other languages (such as C, C ++) at the same time, thereby giving the opportunity of other languages to play an advantage.
Fig. 1 shows a flowchart of an android system injection detection method according to an embodiment of the present invention, where the method is executed by a computer processing device. The computer processing device may include a cell phone, a notebook computer, and the like. As shown in fig. 1, the method comprises the steps of:
And 101, after the application is started, acquiring a binary file corresponding to a system starting process of the application in the target android system.
In one embodiment of the invention, the application refers to an application program in the target android system, and the system starting process refers to an app_process process, namely Zygote process, in the android system.
Binary files refer to files in the ELF format in the target android system.
The Zygote process is a core process of creating a new process by the Android system, is responsible for starting a Dalvik virtual machine, loading some necessary system resources and system classes, starting a system_server process, and then entering a waiting process for processing an app application request.
In still another embodiment of the present invention, in order to improve the system security of the target android system, after detecting that the application is started, step 101 and subsequent steps may be performed, the detection of injection may be completed in time, and a corresponding system protection operation may be performed according to the injection detection result.
And 102, analyzing the binary file to obtain at least one target segment, wherein the type of the target segment is a character string type.
The ELF file includes a plurality of optional fragments, namely, the fragments in the ELF file, and in one embodiment of the present invention, the character string type refers to a fragment type (fragment type) of STRTAB or a fragment name of strtab.
In one embodiment of the present invention, the injection process of Xposed framework refers to fig. 2, the Zygote process before injection is shown in fig. 2 (a), the Zygote process after injection is shown in fig. 2 (b), and the normal starting process of the non-injected android system generally includes starting the linux system, starting the Init process, starting Zygote process with service/system/bin/app_process, wherein starting Zygote process generally includes starting the virtual machine, configuring java environment, loading default jar file package, and finally calling java main (zygoteinfi ()) function to complete the starting of Zygote process.
After the android system is Xposed injected, after the linux system is started, the Init process is started, the starting process of the Zygote process is changed into that the injected Zygote process is started by the service/system/bin/app_process, wherein in the injected Zygote process, in addition to the normal starting process, the Xposed related jar packet such as xposedbridge, jar and the like is added to the CLASSPATH file path, and finally the java main (xposedbridge, main ()) bridging main function is called, so that the injected Zygote process is started.
The process of calling the java main (xposedbridge. Main ()) function comprises Zygote process initialization, loading a hook module of Xposed, calling a Orign source function and calling a zygoteInit. Main () (origin main) function, so that the injection of Xposed to Zygote processes is completed.
That is, xposed if a hook is needed, it is injected into the android system, which first needs to replace the keystone process app_process of the target android system. Since the app_process ' after the replacement is not the same as the app_process that the android originally has, if the app_process that the android originally has in the target android system is replaced with the app_process ', the injection trace of Xposed is left on the app_process ' in the underlying Linux system of the target android system, i.e. on the binary layer.
Wherein Xposed the injection trace includes that Xposed related function string identification exists in the ELF file, so that whether injection exists can be determined by reading the ELF file to find whether Xposed related function string identification exists.
In addition, considering that in the ELF file, the data of the character string type is stored in the character string type, and the search of Xposed related function character string identifiers in other types of fragments is meaningless, in order to improve the injection detection efficiency, the section of the character string type can be determined from the binary file as the target fragment.
Considering that the related method of injection detection in the prior art is realized based on the java layer of the android system, the safety of the data of the java layer is not high, the data is easy to reverse and debug, the accuracy of injection detection is affected, and Xposed has no hook capability on the api interface of the bottom layer of the system temporarily, so in still another embodiment of the invention, the method is realized based on the native layer of the target android system. The code corresponding to the detection process in the steps 102-103 is put in the native layer in the target android system, an interface of a detection function of the linux system is called for detection, and after detection is completed, a detection result is directly obtained from the native layer through the jni interface to the java layer, so that the safety and accuracy of injection detection are improved.
In yet another embodiment of the present invention, step 102 further includes at least:
And 1021, reading file header information included in the binary file.
File header information is ELF HEADER information of the ELF file. In one embodiment of the invention, the readelf-h instruction may be used to determine ELF HEADER information to read the binary file.
Step 1022, determining fragment header table information according to the file header information.
In one embodiment of the present invention, the segment header message is located according to the offset position of the section header described in ELF HEADER information.
Step 1023, determining the target fragment from the plurality of optional fragments according to the fragment header table information.
And determining the fragment type information of each optional fragment in the ELF file according to the fragment header table information, screening according to the fragment type information, and determining the optional fragment with the type belonging to the character string type as the target fragment.
In yet another embodiment of the present invention, step 1023 further comprises:
And 231, determining the segment head offset positions corresponding to the optional segments according to the segment head table information.
The segment header offset position is used to determine a starting position of a segment header of each segment, thereby locating a segment header corresponding to each segment.
And 232, respectively determining segment header information corresponding to each optional segment according to the segment header offset positions.
And 233, determining the fragment type of each optional fragment according to the fragment header information.
In one embodiment of the present invention, the fragment type is determined by reading the field value under the sh_type field in the fragment header information of each optional fragment.
In still another embodiment of the present invention, the segment type may also be determined by reading the segment names in the segment header information of each optional segment, and querying the preset name table by the segment names. When the fragment name includes strtab, the fragment type is the string type.
And 234, determining the optional fragment with the fragment type being the character string type as the target fragment.
In still another embodiment of the present invention, when no string type segment is detected in the ELF file, a prompt message such as "current detection occurs abnormality, please detect whether the system is normally loaded" may be returned.
And step 103, inquiring whether the at least one target segment comprises a preset characteristic character string, and determining whether the application is injected into a system modification framework according to an inquiry result so as to determine whether the application is safe.
In one embodiment of the invention, the feature string is used to characterize Xposed related functions, i.e., function related strings that only exist in the system where Xposed is present, which may be function identification, function description strings, etc. Whereas, since the function-related string is typically stored in the target segment according to its data type, in one embodiment of the present invention, step 103 further includes:
Step 1031, matching the characteristic character strings in the target segments, and determining the successful times of matching.
When the characteristic character string exists in the target segment, the target segment is determined to be successfully matched.
In still another embodiment of the present invention, the target segment stores function description strings corresponding to a plurality of selectable functions, where the selectable functions are functions included in the target android system, and step 1031 further includes:
And 311, respectively matching the characteristic character strings with the function description character strings.
In order to improve the accuracy of injection detection, the feature strings are respectively matched with all the target fragments until the traversal of all the target fragments is completed.
It should be noted that, in still another embodiment of the present invention, in order to increase the speed of injection detection, a method of traversing all the target segments may not be adopted, that is, if there is one match, it is determined that there is injection.
In yet another embodiment of the present invention, the feature string comprises Xposed feature function strings. Injection detection for android systems may also include:
and 312, matching the Xposed characteristic function character strings with the function description character strings respectively.
Step 313, when the function string is matched, determining the injection detection result as that the injection is detected.
In yet another embodiment of the present invention, step 311 further comprises:
and 3111, determining a segment to be matched from the target segment according to a first file pointer when the number of successful matching times is smaller than the total number of segment heads, wherein the first file pointer is used for storing a segment head offset position corresponding to the target segment currently queried.
In one embodiment of the present invention, when the number of successful matches is less than the total number of segment headers, then the matching of the next unmatched target segment is continued by the movement of the first file pointer.
And 3112, matching the characteristic character string with the function description character string in the fragment to be matched.
In one embodiment of the invention, when the feature string is included in the segment to be matched, then the two are considered to be matched.
Step 3113, after matching is completed, updating the first file pointer according to a second file pointer and segment header offset positions corresponding to all the target segments, where the second file pointer is used to store segment header offset positions corresponding to the target segments of the history query.
In one embodiment of the present invention, the updating of the first file pointer may be that the segment header offset positions corresponding to the unmatched target segments are determined according to the segment header offset positions corresponding to all target segments of the second file pointer, and the first file pointer is optionally determined from the unmatched segment header offset positions or according to the progressive order of the offset positions.
In still another embodiment of the present invention, the reading and the matching of the feature strings may be sequentially performed on each target segment according to the segment header offset position order of each target segment.
Step 314, adding one to the number of successful matches each time one of the function description strings is matched.
Step 1032, determining the total number of segment headers according to the file header information.
In one embodiment of the invention, the number of Section headers from ELF HEADER is taken as the total number of segment headers.
And 1033, comparing the successful times of the matching with the total number of the segment heads.
And 1034, determining the injection detection result as injection detection when the matching success times are larger than the total number of the segment heads.
In still another embodiment of the present invention, as shown in fig. 3, the injection detection method from step 101 to step 103 may be further packaged into a detection entry function of a native layer, where a flag value is set in the native layer, where the flag value is used to store a detection result, and the detection entry function may be called by a java layer of the target android system through a jni interface, and when called, the flag value is directly returned to the java layer, so that specific code logic of injection detection is hidden in the native layer with higher security, thereby improving efficiency and security of injection detection.
According to the android system injection detection method, after an application is started, binary files corresponding to a system starting process of the application in a target android system are obtained, the binary files are analyzed, at least one segment with the character string type in the binary files is read out to serve as a target segment, then inquiry is conducted in the target segment according to a preset characteristic character string, and an injection detection result of the target android system is determined according to an inquiry result.
Therefore, in the scheme of detecting whether the current java environment is loaded with the related class library Xposed through the detection function, the accuracy and the safety of injection detection caused by the Xposed frame hook of the detection function are lower, and the accuracy and the safety of injection detection of the android system can be improved by detecting injection marks on the level of binary files which are not easy to modify and forge.
Fig. 4 shows a schematic structural diagram of an android system injection detection device according to an embodiment of the present invention. As shown in fig. 4, the apparatus 200 includes an acquisition module 201, a parsing module 202, and a determining module 203.
The acquiring module 201 is configured to acquire, after an application is started, a binary file corresponding to a system starting process of the application in a target android system;
the analysis module 202 is configured to analyze the binary file to obtain at least one target segment, where the type of the target segment is a character string type;
The determining module 203 is configured to query whether the at least one target segment includes a preset feature string, determine whether the application is injected into a system modification framework according to a query result, and determine whether the application is safe.
In an alternative way, the binary file includes a plurality of optional fragments, and the parsing module 202 is further configured to:
Reading file header information included in the binary file;
Determining fragment header table information according to the file header information;
And determining the target fragment from the plurality of optional fragments according to the fragment header table information.
In an alternative way, the parsing module 202 is further configured to:
Determining the segment head offset positions corresponding to the optional segments according to the segment head table information;
Respectively determining segment header information corresponding to each optional segment according to the segment header offset position;
determining the fragment type of each optional fragment according to the fragment header information;
And determining the optional fragment with the fragment type being a character string type as the target fragment.
In an alternative way, the determining module 203 is further configured to:
Matching the characteristic character strings in the target fragments, and determining the successful times of matching;
determining the total number of segment heads according to the file head information;
comparing the successful times of the matching with the total number of the segment heads;
and when the number of successful matching times is larger than the total number of the segment heads, determining the injection detection result as that the injection is detected.
In an optional manner, the target segment stores function description strings corresponding to a plurality of optional functions, where the optional functions are functions included in the target android system, and the determining module 203 is further configured to:
Respectively matching the characteristic character strings with the function description character strings;
the number of successful matches is incremented by one each time one of the function description strings is matched.
In an alternative way, the determining module 203 is further configured to:
When the successful times of matching is smaller than the total number of segment heads, determining a segment to be matched from the target segment according to a first file pointer, wherein the first file pointer is used for storing the segment head offset position corresponding to the target segment which is currently queried;
matching the characteristic character string with the function description character string in the fragment to be matched;
And after the matching is completed, updating the first file pointer according to a second file pointer and the fragment head offset positions corresponding to all the target fragments, wherein the second file pointer is used for storing the fragment head offset positions corresponding to the target fragments of the historical query.
In an alternative way, the feature string comprises Xposed feature function strings, and the determining module 203 is further configured to:
matching the Xposed feature function strings with the function description strings respectively;
and when the function character string is matched, determining the injection detection result as that the injection is detected.
According to the android system injection detection device, after an application is started, binary files corresponding to a system starting process of the application in a target android system are obtained, the binary files are analyzed, at least one segment with the character string type in the binary files is read out to serve as a target segment, then inquiry is conducted in the target segment according to a preset characteristic character string, and an injection detection result of the target android system is determined according to an inquiry result.
Therefore, in the scheme of detecting whether the current java environment is loaded with the related class library Xposed through the detection function, the accuracy and the safety of injection detection caused by the Xposed frame hook of the detection function are lower, and the android system injection detection device provided by the embodiment of the invention can improve the accuracy and the safety of injection detection of the android system by detecting injection marks on the level of binary files which are difficult to modify and forge.
Fig. 5 shows a schematic structural diagram of an android system injection detection device according to an embodiment of the present invention, and the specific embodiment of the present invention does not limit the specific implementation of the android system injection detection device.
As shown in FIG. 5, the android injection detection device may include a processor 302, a communication interface (Communications Interface) 304, a memory 306, and a communication bus 308.
Wherein the processor 302, the communication interface 304, and the memory 306 communicate with each other via a communication bus 308. A communication interface 304 for communicating with network elements of other devices, such as clients or other servers. The processor 302 is configured to execute the program 310, and may specifically perform the relevant steps in the foregoing embodiments of the method for detecting injection into an android system.
In particular, program 310 may include program code comprising computer-executable instructions.
The processor 302 may be a central processing unit CPU, or an Application-specific integrated Circuit ASIC (Application SPECIFIC INTEGRATED Circuit), or one or more integrated circuits configured to implement embodiments of the present invention. The one or more processors included in the android system injection detection device may be the same type of processor, such as one or more CPUs, or may be different types of processors, such as one or more CPUs and one or more ASICs.
Memory 306 for storing programs 310. Memory 306 may comprise high-speed RAM memory or may also include non-volatile memory (non-volatile memory), such as at least one disk memory.
Program 310 may be specifically invoked by processor 302 to cause the android injection detection device to:
after an application is started, acquiring a binary file corresponding to a system starting process of the application in a target android system;
Analyzing the binary file to obtain at least one target fragment, wherein the type of the target fragment is a character string type;
inquiring whether the at least one target segment comprises a preset characteristic character string, and determining whether the application is injected into a system modification framework according to an inquiry result so as to determine whether the application is safe.
In an alternative manner, the binary file includes a plurality of optional fragments, and the program 310 is invoked by the processor 302 to cause the android injection detection device to:
Reading file header information included in the binary file;
Determining fragment header table information according to the file header information;
And determining the target fragment from the plurality of optional fragments according to the fragment header table information.
In an alternative manner, the program 310 is invoked by the processor 302 to cause the android injection detection device to:
Determining the segment head offset positions corresponding to the optional segments according to the segment head table information;
Respectively determining segment header information corresponding to each optional segment according to the segment header offset position;
determining the fragment type of each optional fragment according to the fragment header information;
And determining the optional fragment with the fragment type being a character string type as the target fragment.
In an alternative manner, the program 310 is invoked by the processor 302 to cause the android injection detection device to:
Matching the characteristic character strings in the target fragments, and determining the successful times of matching;
determining the total number of segment heads according to the file head information;
comparing the successful times of the matching with the total number of the segment heads;
and when the number of successful matching times is larger than the total number of the segment heads, determining the injection detection result as that the injection is detected.
In an alternative manner, the target segment stores function description strings corresponding to a plurality of alternative functions, wherein the alternative functions are functions included in the target android system, and the program 310 is called by the processor 302 to cause the android system injection detection device to perform the following operations:
Respectively matching the characteristic character strings with the function description character strings;
the number of successful matches is incremented by one each time one of the function description strings is matched.
In an alternative manner, the program 310 is invoked by the processor 302 to cause the android injection detection device to:
When the successful times of matching is smaller than the total number of segment heads, determining a segment to be matched from the target segment according to a first file pointer, wherein the first file pointer is used for storing the segment head offset position corresponding to the target segment which is currently queried;
matching the characteristic character string with the function description character string in the fragment to be matched;
And after the matching is completed, updating the first file pointer according to a second file pointer and the fragment head offset positions corresponding to all the target fragments, wherein the second file pointer is used for storing the fragment head offset positions corresponding to the target fragments of the historical query.
In an alternative, the feature string comprises Xposed feature function strings, and the program 310 is invoked by the processor 302 to cause the android injection detection device to:
matching the Xposed feature function strings with the function description strings respectively;
and when the function character string is matched, determining the injection detection result as that the injection is detected.
The android system injection detection equipment acquires a binary file corresponding to a system starting process of an application in a target android system after the application is started, analyzes the binary file, reads out at least one segment with a character string type in the binary file as a target segment, inquires in the target segment according to a preset characteristic character string, and determines an injection detection result of the target android system according to an inquiry result.
Therefore, in the scheme of detecting whether the current java environment is loaded with the related class library Xposed through the detection function, the accuracy and the safety of injection detection caused by the Xposed frame hook of the detection function are lower, and the android system injection detection device provided by the embodiment of the invention can improve the accuracy and the safety of injection detection of the android system by detecting injection marks on the level of binary files which are difficult to modify and forge.
The embodiment of the invention provides a computer readable storage medium, wherein the storage medium stores at least one executable instruction, and when the executable instruction runs on android system injection detection equipment, the android system injection detection equipment executes the android system injection detection method in any method embodiment.
The executable instructions may be specifically configured to cause the android injection detection device to:
after an application is started, acquiring a binary file corresponding to a system starting process of the application in a target android system;
Analyzing the binary file to obtain at least one target fragment, wherein the type of the target fragment is a character string type;
inquiring whether the at least one target segment comprises a preset characteristic character string, and determining whether the application is injected into a system modification framework according to an inquiry result so as to determine whether the application is safe.
In an alternative way, the binary file comprises a plurality of optional fragments, and the executable instructions enable the android injection detection device to perform the following operations:
Reading file header information included in the binary file;
Determining fragment header table information according to the file header information;
And determining the target fragment from the plurality of optional fragments according to the fragment header table information.
In an optional manner, determining a segment header offset position corresponding to each optional segment according to the segment header table information;
Respectively determining segment header information corresponding to each optional segment according to the segment header offset position;
determining the fragment type of each optional fragment according to the fragment header information;
And determining the optional fragment with the fragment type being a character string type as the target fragment.
In an alternative manner, the executable instructions cause the android system injection detection device to:
Matching the characteristic character strings in the target fragments, and determining the successful times of matching;
determining the total number of segment heads according to the file head information;
comparing the successful times of the matching with the total number of the segment heads;
and when the number of successful matching times is larger than the total number of the segment heads, determining the injection detection result as that the injection is detected.
In an optional manner, function description character strings corresponding to a plurality of optional functions are stored in the target fragment, wherein the optional functions are functions included in the target android system, and the executable instructions enable the android system injection detection device to execute the following operations:
Respectively matching the characteristic character strings with the function description character strings;
the number of successful matches is incremented by one each time one of the function description strings is matched.
In an alternative manner, the executable instructions cause the android system injection detection device to:
When the successful times of matching is smaller than the total number of segment heads, determining a segment to be matched from the target segment according to a first file pointer, wherein the first file pointer is used for storing the segment head offset position corresponding to the target segment which is currently queried;
matching the characteristic character string with the function description character string in the fragment to be matched;
And after the matching is completed, updating the first file pointer according to a second file pointer and the fragment head offset positions corresponding to all the target fragments, wherein the second file pointer is used for storing the fragment head offset positions corresponding to the target fragments of the historical query.
In an alternative way, the characteristic character string comprises Xposed characteristic function character strings, and the executable instructions enable the android injection detection device to execute the following operations:
matching the Xposed feature function strings with the function description strings respectively;
and when the function character string is matched, determining the injection detection result as that the injection is detected.
The computer readable storage medium of the embodiment of the invention obtains a binary file corresponding to a system starting process of an application in a target android system after the application is started, analyzes the binary file, reads out at least one segment with a character string type in the binary file as a target segment, inquires in the target segment according to a preset characteristic character string, and determines an injection detection result of the target android system according to an inquiry result.
Therefore, in the scheme of detecting whether the current java environment is loaded with the Xposed related class library through the detection function, the accuracy and the safety of injection detection caused by the Xposed frame hook of the detection function are lower, and the accuracy and the safety of injection detection of the android system can be improved by detecting injection traces on the level of binary files which are not easy to modify and forge through the computer readable storage medium in the embodiment of the invention.
The embodiment of the invention provides an android system injection detection device which is used for executing the android system injection detection method.
The embodiment of the invention provides a computer program which can be called by a processor to enable android system injection detection equipment to execute the android system injection detection method in any method embodiment.
An embodiment of the present invention provides a computer program product, where the computer program product includes a computer program stored on a computer readable storage medium, where the computer program includes program instructions, when the program instructions are executed on a computer, cause the computer to execute the android system injection detection method in any of the above method embodiments.
The algorithms or displays presented herein are not inherently related to any particular computer, virtual system, or other apparatus. Various general-purpose systems may also be used with the teachings herein. The required structure for a construction of such a system is apparent from the description above. In addition, embodiments of the present invention are not directed to any particular programming language. It will be appreciated that the teachings of the present invention described herein may be implemented in a variety of programming languages, and the above description of specific languages is provided for disclosure of enablement and best mode of the present invention.
In the description provided herein, numerous specific details are set forth. However, it is understood that embodiments of the invention may be practiced without these specific details. In some instances, well-known methods, structures and techniques have not been shown in detail in order not to obscure an understanding of this description.
Similarly, it should be appreciated that in the above description of exemplary embodiments of the invention, various features of the embodiments of the invention are sometimes grouped together in a single embodiment, figure, or description thereof for the purpose of streamlining the disclosure and aiding in the understanding of one or more of the various inventive aspects. This method of disclosure, however, is not to be interpreted as reflecting an intention that the claimed invention requires more features than are expressly recited in each claim.
Those skilled in the art will appreciate that the modules in the apparatus of the embodiments may be adaptively changed and disposed in one or more apparatuses different from the embodiments. The modules or units or components of the embodiments may be combined into one module or unit or component, and they may be divided into a plurality of sub-modules or sub-units or sub-components. Any combination of all features disclosed in this specification (including any accompanying claims, abstract and drawings), and all of the processes or units of any method or apparatus so disclosed, may be used in combination, except insofar as at least some of such features and/or processes or units are mutually exclusive. Each feature disclosed in this specification (including any accompanying claims, abstract and drawings), may be replaced by alternative features serving the same, equivalent or similar purpose, unless expressly stated otherwise.
It should be noted that the above-mentioned embodiments illustrate rather than limit the invention, and that those skilled in the art will be able to design alternative embodiments without departing from the scope of the appended claims. In the claims, any reference signs placed between parentheses shall not be construed as limiting the claim. The word "comprising" does not exclude the presence of elements or steps not listed in a claim. The word "a" or "an" preceding an element does not exclude the presence of a plurality of such elements. The invention may be implemented by means of hardware comprising several distinct elements, and by means of a suitably programmed computer. In the unit claims enumerating several means, several of these means may be embodied by one and the same item of hardware. The use of the words first, second, third, etc. do not denote any order. These words may be interpreted as names. The steps in the above embodiments should not be construed as limiting the order of execution unless specifically stated.