ES2340086T3 - Ofuscacion de los rastros de ejecucion de un codigo de programa de ordenador. - Google Patents

Ofuscacion de los rastros de ejecucion de un codigo de programa de ordenador. Download PDF

Info

Publication number
ES2340086T3
ES2340086T3 ES07388048T ES07388048T ES2340086T3 ES 2340086 T3 ES2340086 T3 ES 2340086T3 ES 07388048 T ES07388048 T ES 07388048T ES 07388048 T ES07388048 T ES 07388048T ES 2340086 T3 ES2340086 T3 ES 2340086T3
Authority
ES
Spain
Prior art keywords
execution
code
program
program code
representation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
ES07388048T
Other languages
English (en)
Inventor
Johan Eker
Carl Von Platen
Bjorn Johansson
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Telefonaktiebolaget LM Ericsson AB
Original Assignee
Telefonaktiebolaget LM Ericsson AB
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Telefonaktiebolaget LM Ericsson AB filed Critical Telefonaktiebolaget LM Ericsson AB
Application granted granted Critical
Publication of ES2340086T3 publication Critical patent/ES2340086T3/es
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/16Program or content traceability, e.g. by watermarking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/70Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
    • G06F21/71Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information
    • G06F21/75Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information by inhibiting the analysis of circuitry or operation
    • G06F21/755Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information by inhibiting the analysis of circuitry or operation with measures against power attack
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/21Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/2145Inheriting rights or properties, e.g., propagation of permissions or restrictions within a hierarchy

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Mathematical Physics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)
  • Storage Device Security (AREA)

Abstract

Un método implementado por ordenador de generación de código de programa de ordenador protegido contra la manipulación, el método que comprende: - obtener una representación (101) de un código de programa de ordenador, el código de programa de ordenador que se adapta para hacer que un sistema de procesamiento de datos realice una pluralidad de tareas de cálculo en un primer orden de ejecución, cada tarea de cálculo que se representa en la representación del código de programa de ordenador por al menos una sentencia de programa; - obtener (103) una pluralidad de órdenes de ejecución alternativos de las tareas de cálculo; - generar (105) una representación ejecutable del código de programa adaptado a hacer que un sistema de procesamiento de datos seleccione un orden de ejecución aleatorizado a partir de la pluralidad de órdenes de ejecución alternativos y ejecutar las tareas de cálculo en el orden de ejecución aleatorizado seleccionado caracterizado por generar una representación ejecutable del código de programa además comprende incluir las instrucciones ejecutables por ordenador (310) en la representación ejecutable del código de programa adaptado a hacer que un sistema de procesamiento de datos realice las siguientes tareas, cuando la imagen del código de programa se ejecuta por el sistema de procesamiento de datos: a) realizar una inicial de las tareas de cálculo; b) seleccionar una tarea de cálculo consecutiva a partir de un conjunto de sucesoras alternativas de la tarea de cálculo realizada en base a una representación de un conjunto de restricciones de precedencia impuestas en el orden de ejecución de las tareas de cálculo; c) realizar la tarea de cálculo seleccionada; d) repetir los pasos b) y c) hasta que han sido realizadas todas las tareas de cálculo.

Description

Ofuscación de los rastros de ejecución de un código de programa de ordenador.
Campo técnico
La invención se refiere a la protección contra la manipulación del código de un programa de ordenador, en particular ofuscando el rastro de ejecución de un código de programa de ordenador.
Antecedentes
La manipulación de programas informáticos es un ataque que tiene el propósito de alterar la forma en que funciona una parte del programa informático de tal manera que conlleva beneficios ilegítimos al atacante. Los objetivos de la manipulación podrían ser eludir/desactivar la protección de copia o los mecanismos de seguridad, para extraer material secreto o protegido por derechos de autor, o introducir código maligno tal como virus de ordenador.
En muchas situaciones, los beneficios ilegítimos pueden implicar desventajas financieras sustanciales para los productores de programas informáticos. Consecuentemente, se puede esperar tanto de los atacantes como de los vendedores de programas informáticos que hagan esfuerzos para romper y mejorar respectivamente los mecanismos de protección contra la manipulación de los programas informáticos. En el contexto de los teléfonos móviles, la protección del bloqueo SIM y otros componentes sensibles del soporte lógico, por ejemplo la Gestión Digital de Derechos (DRM), son de particular interés. Adicionalmente, la protección contra la manipulación de otras entidades de soporte lógico y/o para otros propósitos y/o en conexión con otros usos también puede ser beneficiosa.
Para modificar un componente del programa informático, un atacante típicamente tiene que adquirir al menos un conocimiento parcial de cómo funciona el componente del programa informático. La manipulación de los programas informáticos de esta manera se puede retardar si no prevenir haciendo más difícil la ingeniería inversa. Las transformaciones, que hacen más complicados de analizar los programas informáticos son útiles para este fin; a tales transformaciones se refieren generalmente como la ofuscación.
Las técnicas para el soporte lógico de ingeniería inversa se pueden dividir a groso modo en dos grupos de técnicas: Análisis de código estático (o "fuera de línea") y análisis de código dinámico (o "en vivo"). Cuando se realiza análisis dinámico, se observa cómo se ejecuta el programa informático. En contraste, el análisis estático se limita normalmente a un examen/análisis de alguna representación del código de programa, sin ejecutarlo normalmente. Una técnica empleada en análisis dinámico es la comparación de los rastros de ejecución.
Un rastro de ejecución de un programa típicamente incluye una secuencia de direcciones de memoria desde la cual se leen las instrucciones ejecutables durante la ejecución de un programa. Los rastros de ejecución de esta manera se pueden recoger ejecutando el programa, por ejemplo, usando un soporte de componentes físicos específicos (denominados almacenadores de rastro) o mediante una grabación de las direcciones basada en soporte lógico. Usando un rastro de ejecución y el código ejecutable del programa, se puede recrear de esta manera la secuencia real de las instrucciones.
Proporcionando dos conjuntos de estímulos y comparando las diferencias en los rastros de ejecución resultantes, un atacante puede obtener conocimiento del componente del soporte lógico. En particular, la comparación de los rastros de ejecución puede identificar los puntos de decisión críticos del programa. En el contexto del bloqueo SIM y las soluciones DRM de los dispositivos móviles, las pruebas para firmas correctas o sumas de comprobación son ejemplos de puntos de decisión críticos. Por ejemplo, un atacante puede comparar los rastros de ejecución del programa informático ejecutado por dos dispositivos móviles distintos, por ejemplo un dispositivo bloqueado de operador y un dispositivo que no está bloqueado por el operador, a fin de obtener información sobre qué partes del programa son relevantes para la funcionalidad de bloqueo SIM.
Los intentos previos de hacer ingeniería inversa por medio del más difícil análisis dinámico incluyen intentos de limitar las oportunidades de un atacante para observar como se está ejecutando el programa. No obstante, tales contra medidas generalmente han sido específicas a una plataforma particular y/o una herramienta de ingeniería inversa específica, tal como un programa de depuración específico.
Un ejemplo de tales contra medidas incluye el cifrado del el código ejecutable y el uso de componentes físicos específicos que combinan el descifrado y la ejecución del código. Incluso aunque las técnicas de descifrado basadas en componentes físicos implementados adecuadamente pueden ofrecer buena protección, esta protección se logra al precio de componentes físicos específicos adicionales.
Otro planteamiento, conocido como técnicas anti depuración, tiene el propósito de complicar el proceso de observar la ejecución del programa en un programa de depuración particular. En algunas plataformas, el código de ejecución puede consultar los sistemas operativos para un posible programa de depuración que se añade al proceso y por ejemplo terminar si este es el caso. Otra opción es interferir con las técnicas usadas por el programa de depuración, por ejemplo saboteando con el establecimiento de puntos de ruptura. No obstante, las técnicas anti depuración son específicas a un programa de depuración específico y no proporcionan una técnica de protección contra la manipulación de propósito general. Adicionalmente, los simuladores de conjunto de instrucciones y los programas de depuración soportados en componentes físicos se usan normalmente cuando se depuran sistemas integrados, reduciendo de esta manera la utilidad práctica de las técnicas anti depuración. Adicionalmente, los rastros de ejecución se pueden recoger aún usando almacenadores de rastros que se implementan por completo en los componentes físicos.
La ofuscación es una técnica usada para complicar el código. La ofuscación hace más difícil de comprender el código cuando se descompila, pero típicamente no tiene efecto en la funcionalidad del código. La ofuscación de programas se puede usar para proteger los programas haciéndolo más difíciles de hacer ingeniería inversa.
Talleres 2005. LNCS 3823, páginas 916-925, 2005, propone un esquema de tal ofuscación. No obstante, este método se informó que es vulnerable al análisis dinámico.
La WO 01/69355 expone un método para integrar una marca de agua en un programa informático insertando rutinas adicionales en el programa a lo largo de un número de flujos de control adicionales establecidos aleatoriamente.
La patente US 6.668.325 y el artículo "Marca de agua, Inviolabilidad, y Ofuscación - Herramientas para la protección de los Programas Informáticos" por Christian S. Collberg y Clark Thomborson, Transacciones del IEEE en ingeniería de Programas Informáticos, 28:6 (Junio de 2002), describe una pluralidad de transformaciones de ofuscación. En tal transformación se introduce sentencias si redundantes. La condición de la sentencia si se denomina predicado opaco el cual tiene alguna propiedad que se conoce cuando el programa se encubre pero es difícil identificar por medio del análisis estático del código. Los predicados opacos que siempre evalúan por ejemplo VERDADERO se pueden usar en tal sentencia si. Consecuentemente, en el tiempo de ofuscación se conoce que solamente se ejecutará una de las ramas de la sentencia sí. De esta manera, durante la ofuscación el código que va a ser ejecutado se puede insertar en esa rama, mientras que la otra rama que nunca se ejecuta puede incluir algún código "ficticio" arbitrario. El documento de la técnica previa anterior además describe el uso de predicados opacos cuyo resultado puede ser tanto VERDADERO como FALSO para la selección de uno de dos casos alternativos de una tarea de cálculo dada. No obstante, incluso aunque esta técnica hace más difícil el análisis estático del código, no aumenta de manera eficiente la dificultad de un análisis dinámico que intenta identificar los puntos de decisión críticos.
Por consiguiente, se mantiene un problema general para proporcionar métodos eficientes de código de programa de ofuscación a fin de hacer más difícil obtener información útil a partir de un análisis del rastro de ejecución del programa, por ejemplo para identificar los puntos de decisión interesantes y/u otros puntos críticos.
\vskip1.000000\baselineskip
Compendio
El anterior y otros problemas se resuelven por un método implementado por ordenador de generación de código de programa de ordenador protegido contra la manipulación, como se define en la reivindicación 1. El método comprende:
-
obtener una representación de un código de programa de ordenador, el código de programa de ordenador que se adapta a hacer que un sistema de procesamiento de datos realice una pluralidad de tareas de cálculo en un primer orden de ejecución, cada tarea de cálculo que se representa en la representación del código de programa de ordenador por al menos una sentencia de programa;
-
obtener una pluralidad de órdenes de ejecución alternativas de las tareas de cálculo;
-
generar una representación ejecutable del código de programa adaptada a hacer que un sistema de procesamiento de datos seleccione un orden de ejecución aleatorizado de la pluralidad de ordenes de ejecución alternativas y ejecutar las tareas de cálculo en el orden de ejecución aleatorizado seleccionada.
Las realizaciones del método descrito aquí dentro proporcionan una transformación del código de programa, por ejemplo el código fuente, de un componente de soporte lógico dentro de un código modificado que provoca, cuando el código se ejecuta, un rastro de ejecución encubierta de manera efectiva. Consecuentemente, la información útil es difícil si no imposible de obtener cuando se ejecuta el código con distintas entradas, evitando por ello a los puntos de decisión críticos de ser fácilmente detectables como diferencias en los rastros de ejecución cuando se ejecuta el programa informático usando distintas entradas.
Por consiguiente, las realizaciones del método descrito aquí dentro transforman la representación de la entrada de un componente de soporte lógico de tal manera que se incrementa el esfuerzo requerido para comparar los rastros de ejecución. Las diferencias relevantes se ocultan en un gran volumen de diferencias aparentemente aleatorias. Por lo tanto, la fase inicial de un ataque de manipulación que implica la comparación de los rastros de ejecución con el propósito de obtener el conocimiento de un componente de soporte lógico se hace considerablemente más difícil. De esta manera el método descrito aquí dentro proporciona una protección eficiente del código de programa contra un ataque basado en análisis dinámico.
La representación del código de programa puede incluir cualquier representación de entrada adecuada en la que se puedan identificar las distintas tareas de cálculo. Típicamente, la representación del código de programa incluye una representación de las tareas de cálculo que pueden servir como una entrada a una o más herramientas de interpretación de código o generación de código, tal como un compilador, un enlazador, un intérprete, y/o similares. Por consiguiente, la representación del código de programa se puede ejecutar directamente por un sistema de procesamiento de datos, por ejemplo por medio de un intérprete de código, o se puede trasladar dentro de una forma ejecutable, por ejemplo por medio de un compilador y/o enlazador. Ejemplos de las representaciones de entrada adecuadas incluyen el código fuente de un lenguaje de programación adecuado, el código objeto, y/o similares.
La transformación de acuerdo con el método descrito aquí dentro se puede ver como un encubrimiento del orden de ejecución temporal de las tareas de cálculo más que un reordenamiento espacial de las construcciones del código fuente usado por las técnicas de ofuscación de la técnica previa. Consecuentemente, las realizaciones del método descrito aquí dentro proporcionan un orden de ejecución temporal variable de la misma (o al menos sustancialmente el mismo, dado que la semilla aleatoria puede variar de una instalación a otra) imagen de código para varias o incluso todas las instalaciones.
El término "sentencia de programa" como se usa aquí dentro trata de incluir una unidad de estructuración de un lenguaje de programación, en particular una unidad mínima de tal estructuración. Ejemplos de tipos de sentencias de programa incluyen definiciones, declaraciones, asignaciones, sentencias condicionales, bucles y llamadas de procedimiento/función. Una sentencia de programa condicional general hace que el programa ejecute selectivamente una de un conjunto de ramas de programa alternativas. Cada rama puede incluir una o más sentencias de programa. Ejemplos de sentencias de programa condicionales incluyen sentencias si, sentencias de caso o similares.
Se apreciará que el primer orden de ejecución en que se ejecutan las tareas de cálculo puede depender de la representación de entrada y/o de uno o más pasos de procesamiento durante la generación de las instrucciones de código de programa ejecutable, por ejemplo en el paso de compilación. Por ejemplo, la representación de la entrada puede incluir una secuencia de sentencias de programa, y esta secuencia puede determinar un orden de ejecución secuencial. El primer orden de ejecución puede depender también de las entradas de programa recibidas durante la ejecución del programa y/o del resultado de otras tareas, por ejemplo en situaciones de sentencias de programa condicionales. El orden de ejecución puede ser un orden secuencial de las tareas de cálculo. Por otra parte, en algunas realizaciones, algunas tareas de cálculo se pueden ejecutar concurrentemente o incluso sincronizar entre ellas, por ejemplo como dos o más hilos de una ejecución de programa de multihilo. Se apreciará que el orden de ejecución de al menos alguna de las tareas de cálculo se puede cambiar sin cambiar el comportamiento global del programa. No obstante, también se apreciará que el orden relativo de algunas tareas no se puede intercambiar sin cambiar el comportamiento del programa.
El término "tarea de cálculo" como se usa aquí dentro intenta incluir una colección de pasos de cálculo representables por una o más instrucciones ejecutables por ordenador. Conjuntamente, las tareas de cálculo de un componente de soporte lógico constituyen todas las operaciones/cálculos realizados por el componente de soporte lógico. Para los propósitos de la presente descripción, cada tarea de cálculo se puede detallar, por ejemplo una única sentencia de programa de un lenguaje de código fuente, o groso modo, por ejemplo una función/procedimiento/subrutina que comprende varias sentencias, o incluso varias funciones/procedimientos/subrutinas.
Obtener la pluralidad de órdenes de ejecución alternativas puede incluir procesar una representación de entrada del código de programa por una herramienta de análisis de programa a fin de identificar una pluralidad de tareas de cálculo y sus interdependencias mutuas. Por ejemplo, este proceso se puede realizar mediante una herramienta de análisis de programa automatizada o se puede realizar al menos en parte en base a la entrada de usuario. Se apreciará que hay lenguajes fuente, por ejemplo lenguajes funcionales y lenguajes de flujo de datos, que son particularmente adecuados para una identificación automatizada o semiautomatizada de las tareas de cálculo y órdenes de ejecución alternativas, dado que las oportunidades para reordenar son particularmente fáciles de identificar. En algunas realizaciones, la herramienta de análisis puede proporcionar una interfaz adecuada que permita a un usuario identificar las tareas de cálculo y órdenes de ejecución alternativas posibles. Se apreciará que el conjunto de órdenes de ejecución alternativas puede incluir el primer orden de ejecución.
En algunas realizaciones, cada una de las órdenes de ejecución alternativas se adaptan para hacer que el sistema de procesamiento de datos produzca la misma salida de programa que el primer orden de ejecución, cuando dicho código de programa se ejecuta por dicho sistema de procesamiento de datos. Por consiguiente, la transformación del código de programa es de conservación semántica, es decir no tiene influencia en la salida del programa creada por el programa de ordenador. Las sentencias de programa que no deberían verse afectadas directa o indirectamente por una transformación de conservación semántica también se denominan proporcionar los efectos críticos de un programa. Todas las sentencias de programa que interactúan con un entorno de programa se pueden considerar como que contribuyen a la salida del programa.
El término "salida de programa" como se usa aquí dentro intenta incluir cualquier comportamiento observable durante la ejecución del programa, por ejemplo cualquier comportamiento de programa que es especificable por el lenguaje de programación usado y que es observable/perceptible por un usuario, por otro programa de ordenador, por otro dispositivo, o similar. Ejemplos de salida de programa incluyen la salida de valores numéricos, salida de texto, salida binaria, señales de salida, visuales, por ejemplo salida de gráficos, salida audible, etc. que puede ser puestos a la salida a través de un dispositivo de salida adecuado tal como una pantalla de ordenador, impresora, medio de almacenamiento, interfaz de comunicaciones, etc., a través de una interfaz de datos, o similar.
Consecuentemente, se proporciona un método eficiente que asegura que el código de ofuscación tiene el mismo efecto/produce la misma salida de programa que el código de entrada.
En una realización, el método comprende:
-
recibir una representación de entrada indicativa de una pluralidad de sentencias de programa en un orden secuencial predeterminado;
-
agrupar las sentencias de programa para obtener la pluralidad de tareas de cálculo
-
identificar la pluralidad de órdenes de ejecución alternativas.
Las órdenes de ejecución alternativas se pueden representar por cualquier estructura de datos adecuada para representar una relación de dependencia que especifica las restricciones en el orden de ejecución que se requieren para garantizar la equivalencia semántica. Las relaciones de dependencia se pueden determinar por cualquier método adecuado para el análisis de dependencia.
Las restricciones en el orden de ejecución se pueden representar eficientemente por una estructura de datos indicativa de un grafo de precedencia que comprende nodos indicativos de las tareas de cálculo y los bordes indicativos de un orden de precedencia de las tareas de cálculo. El grafo de precedencia puede ser un grafo dirigido, por ejemplo un grafo acíclico dirigido. Por consiguiente, el grafo de precedencia es una representación eficiente de las restricciones de precedencia bajo las que se pueden seleccionar los órdenes de ejecución válidos.
La generación de una representación ejecutable del código de programa además comprende incluir instrucciones ejecutables por ordenador en la representación ejecutable del código de programa adaptado para hacer que un sistema de procesamiento de datos realice las siguientes tareas, cuando el código de programa se ejecuta por el sistema de procesamiento de datos:
a)
realizar una inicial de las tareas de cálculo;
b)
seleccionar una tarea de cálculo consecutiva a partir de un conjunto de sucesoras alternativas de la tarea de cálculo realizada en un grafo de precedencia indicativo de un conjunto de restricciones de precedencia impuestas en el orden de ejecución de las tareas de cálculo;
c)
realizar la tarea de cálculo seleccionada;
d)
repetir los pasos b) y c) hasta que han sido realizadas todas las tareas de cálculo.
En algunas realizaciones, la generación de una representación ejecutable del código de programa además comprende incluir instrucciones ejecutables por ordenador en la representación ejecutable del código de programa adaptada para hacer que un sistema de procesamiento de datos mantenga un estado de ejecución, el estado de ejecución que se define por al menos una del subconjunto de tareas de cálculo que permanecen para ser ejecutadas y el subconjunto de tareas de cálculo que permanecen para ser ejecutadas y cuyas predecesoras en el grafo de precedencia han sido todas ejecutadas. Por consiguiente, se proporciona un mecanismo eficiente para el código de programa para hacer que el siste-
ma de procesamiento de datos ejecute las tareas en un orden aleatorizado bajo las restricciones de precedencia dadas.
El orden de ejecución aleatorizado se puede determinar a partir de una secuencia aleatoria de elementos de datos. La secuencia aleatorizada de los elementos de datos se puede determinar por medio de un generador de números pseudo aleatorios, es decir un algoritmo que usa aritmética para generar una secuencia de números que aproxima las propiedades de los números aleatorios, conocidos como tales en la técnica, o por cualquier otro mecanismo adecuado conocido en la técnica para generar una secuencia de elementos de datos que aparece aleatoria a un observador.
Por ejemplo, cuando la secuencia aleatoria de elementos de datos se determina por medio de una función para la generación de una secuencia aleatorizada de elementos de datos tales como un generador de números pseudo-aleatorios, el estado de ejecución puede incluir además un elemento de datos semilla para inicializar dicha función para la generación de la secuencia de elementos de datos aleatorizada.
Alternativamente, el orden aleatorizado se puede generar por un generador de números aleatorios de componentes físicos, es decir un dispositivo, aparato, o circuito para la generación de números aleatorios a partir de un proceso físico adecuado, por ejemplo en base a un mecanismo microscópico adecuado tal como el ruido térmico, el efecto fotoeléctrico u otro fenómeno cuántico.
En algunas realizaciones, el método comprende la inserción de instrucciones ejecutables dentro de cada una de las tareas de cálculo para la realización del paso de seleccionar la tarea de cálculo consecutiva. Consecuentemente, integrando la lógica de control que ordena las tareas de cálculo y actualiza el estado del programa dentro de tareas individuales, esta funcionalidad es distribuida en vez de proporcionada como una función centralizada, haciéndola por ello más difícil para un adversario para hacer ingeniería inversa de la parte del código de programa que es responsable de seleccionar el orden de ejecución y para invocar las tareas en el orden seleccionado.
Por ejemplo, cada tarea se puede implementar como una función/procedimiento/subrutina u otra unidad estructural adecuada de un lenguaje de programación, donde cada función/procedimiento/subrutina selecciona e invoca una función/procedimiento/subrutina sucesora bajo las restricciones de precedencia dadas. En realizaciones alternativas, el método incluye insertar al menos una función/procedimiento/subrutina separada u otra entidad estructural de un lenguaje de programación dentro del código de programa adaptado para realizar la ordenación de las tareas de cálculo cuando el código de programa se ejecuta por un sistema de procesamiento de datos. Por consiguiente, en tales realizaciones alternativas, la ordenación de las tareas se realiza por una función separada que es auxiliar a las tareas normales del componente de soporte lógico.
En algunas realizaciones, el método además comprende la generación de las instrucciones ejecutables de múltiples casos de la tarea de cálculo; y la selección de la tarea de cálculo incluye seleccionar uno de múltiples casos de las tareas de cálculo. En este sentido, no solo la tarea de ejecución, sino también las direcciones desde las que se ejecuta el código varían entre las ejecuciones del componente de soporte lógico, complicando de esta manera además una comparación de los rastros de ejecución. El método además puede comprender la realización de una o más transformaciones de ofuscamiento en al menos uno de los múltiples casos. Consecuentemente, se logra diversidad adicional aplicando distintas transformaciones de conservación semánticas a varios casos. Como resultado, no solamente varían las direcciones, sino también las instrucciones traídas de estas direcciones, que complican además la comparación de los rastros de ejecución.
En algunas realizaciones, cada ejecución de un componente dado de soporte lógico instalado puede provocar un rastro de ejecución, que es - al menos con una alta probabilidad - única, por ejemplo ejecutando las tareas de cálculo en secuencias aleatorizadas respectivas iniciadas por distintos elementos de datos semilla o generados por un generador de números aleatorios de componentes físicos.
En realizaciones alternativas, la generación de una representación ejecutable del código de programa comprende la generación de una representación ejecutable del código de programa que incluye el código de programa para hacer que un sistema de procesamiento de datos seleccione el mismo orden de ejecución aleatorizado de la pluralidad de órdenes de ejecución alternativos durante cada ejecución de la representación ejecutable generada del código de programa. Por consiguiente, el rastro de ejecución de cada instalación de un componente de soporte lógico se puede hacer que sea la misma para cada ejecución del componente de soporte lógico pero varíe de instalación a instalación. En particular, el rastro de ejecución se puede hacer que sea única para una instalación particular o grupo de instalaciones.
Por ejemplo, el método puede comprender la generación de representaciones ejecutables respectivas del código de programa para distintas instalaciones del código de programa, cada representación ejecutable del código de programa que incluye un elemento de datos semilla respectivo indicativo de la instalación correspondiente. En particular si el número de órdenes de ejecución posibles es relativamente limitado, la generación de un rastro fija que es única para cada instalación del componente de soporte lógico tiene la ventaja de que previene un análisis de la naturaleza de las variaciones ejecutando la misma instalación un gran número de veces.
En su lugar, se requeriría un número de instalaciones mayor y, de esta manera, un esfuerzo considerablemente más grande para un análisis.
El término instalación de un componente de soporte lógico como es usado aquí dentro se refiere a una copia individual de la representación ejecutable del programa informático que está instalada o al menos es instalable en un sistema de procesamiento de datos, por ejemplo en la forma de uno o más archivos ejecutables, un paquete de instalación, o similar. Por ejemplo, una instalación se puede realizar como un medio de lectura por ordenador tal como un CD ROM que tiene almacenada inmediatamente después una copia del componente de soporte lógico, o un fichero descargable almacenado en un ordenador servidor.
En algunas realizaciones, el método comprende la generación de una pluralidad de representaciones ejecutables del código de programa, cada una que incluye el código de programa para hacer que un sistema de procesamiento de datos seleccione un orden de ejecución aleatorizado distinto. Por consiguiente, cada componente de soporte lógico se puede generar a fin de tener un único rastro de ejecución. En este caso, la ejecución repetida de la misma instalación provoca rastros de ejecución idénticas, que difieren del rastro de cualquier otra instalación. Específicamente, se apreciará que esto se puede utilizar para hacer los rastros de ejecución de un teléfono móvil bloqueado por el operador y uno desbloqueado distintas, mientras que las ejecuciones repetidas de las dos instalaciones no proporcionan conocimiento adicional de la naturaleza de las variaciones en los rastros de ejecución.
Cabe señalar que las características de los métodos descritos anteriormente y a continuación se pueden implementar en soporte lógico y llevarse a cabo en un dispositivo de procesamiento de datos u otros medios de procesamiento causados por la ejecución de los medios del código de programa tales como instrucciones ejecutables por ordenador. De aquí en adelante, el término medios de procesamiento comprende cualquier circuito y/o dispositivo adecuadamente adaptado para realizar las funciones anteriores. En particular, el término anterior comprende microprocesadores programables de propósito general o especial, Procesadores Digitales de Señal (DSP), Circuitos Integrados de Aplicaciones Específicas (ASIC), Matrices de Lógica Programable (PLA), Matrices de Puertas Programables en Campo (FPGA), circuitos electrónicos de propósito especial, etc., o una combinación de los
mismos.
Por ejemplo, los medios de código de programa se pueden cargar en una memoria, tal como: una RAM (Memoria de Acceso Aleatorio), desde un medio de almacenamiento o desde otro ordenador a través de una red de ordenadores. Alternativamente, las características descritas se pueden implementar mediante circuitería cableada físicamente en lugar de soporte lógico o en combinación con soporte lógico.
La presente invención se refiere a distintos aspectos que incluyen el método descrito anteriormente y a continuación, los dispositivos correspondientes, y los programas de ordenador, cada uno produciendo uno o más beneficios y ventajas descritas en conexión con el método antes mencionado, y cada uno que tiene una o más realizaciones que corresponden a las realizaciones descritas en conexión con el método antes mencionado.
En particular, de acuerdo con un aspecto, un sistema de procesamiento de datos se configura adecuadamente para realizar los pasos del método descrito anteriormente y a continuación.
De acuerdo con otro aspecto, un producto de programa de ordenador comprende instrucciones ejecutables por ordenador adaptadas a hacer que, cuando se ejecutan en un sistema de procesamiento de datos, el sistema de procesamiento de datos realice el método descrito anteriormente y a continuación. En algunas realizaciones, el producto de programa de ordenador se realiza como un medio de lectura por ordenador que tiene almacenadas inmediatamente después las instrucciones ejecutables por ordenador. Por ejemplo, el medio de lectura por ordenador puede ser un disco compacto (CD), un disco óptico, un disquete, un medio de almacenamiento magnético, una memoria extraíble, o similar, que ha almacenado inmediatamente después las instrucciones ejecutables por ordenador. Por ejemplo, el medio de lectura por ordenador puede haber almacenado inmediatamente después una aplicación de soporte lógico para proteger contra la manipulación el código de programa. En otras realizaciones, el producto de programa de ordenador se realiza como una señal de datos, por ejemplo una señal portadora modulada adecuadamente. Por ejemplo, las instrucciones ejecutables por ordenador se pueden proporcionar para descargar desde un ordenador servidor a través de una red de ordenadores.
En algunas realizaciones, el producto de programa de ordenador se puede implementar como un transformador de código fuente a código fuente, es decir un programa de ordenador que recibe uno o más módulos de código fuente de entrada y genera uno o más módulos de código fuente de salida que se pueden compilar por un compilador convencional. En algunas realizaciones, el producto de programa informático se puede integrar en un compilador, es decir se puede integrar como un compilador de soporte lógico que comprende la funcionalidad adaptada para hacer que el sistema de procesamiento de datos realice el método descrito anteriormente y a continuación como uno de una pluralidad de aprobaciones realizadas por el compilador. Por consiguiente, se proporciona una herramienta de soporte lógico integrada para protección contra la manipulación y compilación. Adicionalmente, dado que las realizaciones de la protección contra la manipulación descritas aquí dentro implican algunas de las mismas técnicas de análisis de código fuente para analizar el código fuente como el uso de compiladores convencionales, la funcionalidad de soporte lógico correspondiente puede ser reutilizada, proporcionando por ello una implementación de soporte lógico eficiente.
Para el propósito de la presente descripción, los términos dispositivo/medios de almacenamiento y medio de lectura por ordenador están tratando de comprender cualquier circuito, dispositivo o medio de almacenamiento adecuado, por ejemplo una memoria de solo lectura (ROM), una memoria de acceso aleatorio (RAM), una memoria flash, una Memoria de Solo Lectura Programable y Borrable (EPROM), memoria volátil o no volátil, un dispositivo de almacenamiento óptico, un dispositivo de almacenamiento magnético, un disquete, un CD, un disco duro, o similar.
Breve descripción de los dibujos
El anterior y otros aspectos serán evidentes y aclaratorios de las realizaciones descritas a continuación con referencia a los dibujos en que:
La Fig. 1 muestra un diagrama de bloques esquemático de un proceso para la protección contra la manipulación del código de programa.
La Fig. 2 ilustra esquemáticamente un ejemplo de un grafo de precedencia.
La Fig. 3 ilustra esquemáticamente un ejemplo de una transformación del código fuente que provoca un código fuente transformado que incluye una selección de tarea central y función de despacho.
La Fig. 4 ilustra esquemáticamente un ejemplo de una transformación del código fuente que provoca un código fuente transformado que incluye una selección de tarea distribuida y funcionalidad de despacho.
La Fig. 5 ilustra esquemáticamente otro ejemplo de una transformación del código fuente que provoca el código fuente transformado incluyendo múltiples casos de tareas de cálculo.
La Fig. 6 muestra un diagrama de bloques esquemático de un sistema para la protección contra la manipulación del código de programa.
Descripción detallada
La Fig. 1 muestra un diagrama de bloques esquemático de un proceso para la protección contra la manipulación del código de programa.
El proceso recibe un código fuente 101. El código fuente 101 está típicamente en la forma en que ha sido escrito un programa de ordenador por un programador, típicamente en un lenguaje de programación formal tal como C, C++, Java, o similar. El código fuente se puede compilar automáticamente por un compilador dentro del código objeto o ejecutar por un intérprete. El código fuente 101 se puede representar como uno o más documentos de texto o como cualquier otra representación digital adecuada. Incluso aunque el código fuente escrito en cualquier lenguaje de programación adecuado se puede usar como una entrada, se apreciará que algunos lenguajes de código fuente son particularmente adecuados para identificar las oportunidades para el reordenamiento, por ejemplo los lenguajes funcionales y los lenguajes de datos de flujo.
Los lenguajes funcionales generalmente siguen un paradigma de programación que trata el cálculo como la evaluación de las funciones matemáticas y evita los datos mutables y de estado. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativo que enfatiza los cambios en el estado. Ejemplos de lenguajes funcionales incluyen APL, Erlang, Haskell, Lisp, ML, y Scheme.
Los lenguajes de flujo de datos son lenguajes de programación que implementan la arquitectura y los principios de flujo de datos, y modelan un programa, conceptualmente si no físicamente, como un grafo dirigido del flujo de datos entre operaciones. Los lenguajes de flujo de datos comparten algunas características de los lenguajes funcionales y generalmente se desarrollaron para llevar algunos conceptos funcionales a un lenguaje más adecuado para el procesamiento numérico. En los lenguajes de flujo de datos, las operaciones típicamente se consideran como "cajas negras" con entradas y salidas, todas ellas definidas siempre de manera explícita. Ejemplos de lenguajes de flujo de datos incluyen Lustre, Ptolemy/CAL, LabView y Simulink.
Alternativamente, el proceso de protección contra la manipulación puede recibir un tipo distinto de representación de entrada en la que se pueden identificar las tareas de cálculo y sus interdependencias, por ejemplo el código objeto.
El código fuente 101 se alimenta dentro de un módulo de análisis de código 103. El módulo de análisis de código analiza el código fuente e identifica un conjunto de tareas de cálculo y sus interdependencias mutuas, en particular las restricciones de precedencia impuestas en el orden de ejecución de las tareas de cálculo. El módulo de análisis de código 103 representa las restricciones de precedencia como un grafo de precedencia, un ejemplo del cual se muestra en la fig. 2
La Fig. 2 ilustra un ejemplo de un grafo de precedencia. Un grafo de precedencia incluye nodos que representan las tareas de cálculo respectivas y las líneas que representan las restricciones de precedencia entre las tareas. En el ejemplo de la fig. 2, el grafo de precedencia generalmente designado como 200 es un grafo acíclico dirigido que incluye nodos etiquetados A hasta F, cada nodo que representa una tarea de cálculo correspondiente. Se apreciará que un grafo de precedencia puede incluir cualquier número de nodos correspondiente al número de tareas de cálculo identificadas en un componente de soporte lógico dado. Los nodos A-F se conectan por líneas unidireccionales 201, donde cada línea conecta dos nodos e identifica una restricción de precedencia entre dichos dos nodos, es decir que una de las tareas de cálculo tiene que ser ejecutada antes de que pueda ser ejecutada la otra tarea de cálculo. Cada línea se dirige de esta manera desde un nodo predecesor a un nodo sucesor válido. Por ejemplo, en el ejemplo mostrado en la fig. 2, la ejecución de la tarea E requiere que las tareas predecesoras B y D ya hayan sido ejecutadas. Por consiguiente, las siguientes órdenes de ejecución de las tareas A-F son ejemplos de rastros de ejecución que cumplen las restricciones de precedencia impuestas por el grafo de precedencia 200:
Rastro de Ejecución #1:
A, B, C, D, E, F
\vskip1.000000\baselineskip
Rastro de Ejecución #2:
A, D, B, E, C, F
\vskip1.000000\baselineskip
Rastro de Ejecución #3:
A, D, F, B, E, C
\vskip1.000000\baselineskip
Por ejemplo, el módulo de análisis de código 103 puede proporcionar una interfaz de usuario que permite a un usuario identificar las tareas de cálculo y sus ordenaciones válidas. Alternativamente o adicionalmente (por ejemplo en base a las tareas definidas por el usuario como un punto de partida), el módulo de análisis de código 103 puede identificar automáticamente o al menos semiautomáticamente la ordenación válida de las tareas (es decir el grafo de precedencia) por ejemplo generando una división inicial dentro de las tareas y generando un grafo de precedencia correspondiente, y opcionalmente proporcionando una interfaz de usuario que permite a un usuario modificar la selección de tareas de cálculo y/o las ordenaciones válidas.
El módulo de análisis de código 103 puede usar cualquier técnica adecuada para analizar un código fuente conocido en la técnica, por ejemplo un subconjunto de las técnicas usadas por los compiladores convencionales cuando analizan el código fuente para identificar los componentes estructurales del lenguaje de programación correspondiente, tales como funciones, condiciones, bucles, etc. El módulo de análisis de código puede procesar el código de entrada completo o solo un subconjunto del mismo.
En particular, el módulo de análisis de código 103 puede emplear cualquier técnica adecuada para el análisis dependiente conocido en la técnica de análisis de programa y que provoca un grafo de precedencia u otra representación adecuada de las relaciones de dependencia identificadas que especifican las restricciones en el orden de ejecución que se puede requerir para garantizar la equivalencia semántica. Ejemplos de tales técnicas se describen por ejemplo en "Optimización de Compiladores para Arquitecturas de Módems: Un Planteamiento basado en Dependencia" por Ken Kennedy y Randy Allen, (2001), Morgan Kaufmann.
En general, el análisis de dependencia produce restricciones del orden de ejecución entre las sentencias y/o las instrucciones. Por ejemplo, una sentencia S2 se puede decir que dependa de una sentencia S1 si S1 se debe ejecutar antes de S2.
\vskip1.000000\baselineskip
La carencia de estado en lenguajes funcionales facilita significativamente el análisis de dependencia. En un programa funcional puro, no hay efectos laterales, es decir las funciones dependen solamente de sus argumentos. Por ejemplo, asumiendo que A hasta F son funciones puras, el programa siguiente provoca el grafo de precedencia mostrado en la fig. 2:
a = A(x)
b = B(a)
c = C(b)
d = D(a)
e = E(b,d)
f = F(d)
\vskip1.000000\baselineskip
Como se mencionó anteriormente, el análisis de dependencia se puede realizar en más o menos tareas detalladas. Algunos de estos métodos se pueden realizar totalmente automatizados, mientras que otros pueden requerir algún grado de entrada del usuario.
Por ejemplo, para lenguajes imperativos, tales como C, C++ y Java, hay varios métodos bien conocidos de análisis de dependencia y grafos de precedencia de detalle, por ejemplo para usar en conexión con la programación de instrucciones, y la vectorización o paralelización de bucles.
Ejemplos adicionales de técnicas de análisis de dependencia incluyen técnicas para analizar los efectos laterales de las funciones. La identificación de funciones libres de efectos laterales ("puras") se puede considerar como un caso especial de este tipo de análisis.
El módulo de análisis de código 103 envía información 104 sobre las tareas de cálculo identificadas (por ejemplo en forma de punteros a sus ubicaciones respectivas en el código) y el grafo de precedencia generado 200 a un módulo de transformación de código 105.
El módulo de transformación 105 transforma el código de entrada a fin de producir el código fuente transformado 109. En particular, el módulo de transformación 105 inserta el código de programa dentro del código fuente que implementa el proceso de selección e invocación de las tareas de cálculo bajo las restricciones de precedencia definidas por el grafo de precedencia 200. El módulo de transformación además puede modificar el código fuente correspondiente a las tareas respectivas, por ejemplo insertando el código para volver a una selección de tarea separada y función de despacho o insertando el código para seleccionar e invocar una tarea sucesora. Adicionalmente, el módulo de transformación puede trasladar el código correspondiente a las tareas de cálculo respectivas dentro de entidades estructurales predeterminadas del lenguaje de programación correspondiente. Por ejemplo, el módulo de traslación puede generar una función/procedimiento/subrutina respectiva para cada una de las tareas de cálculo.
El código fuente transformado 109 además se puede procesar posteriormente, por ejemplo compilado, enlazado, comprimido, codificado, y/o similar.
El código para la ordenación de las tareas se puede insertar como una función/procedimiento/subrutina de despacho y selección separada, que es auxiliar a las tareas reales del componente de soporte lógico, como se ilustra en la fig. 3.
La Fig. 3 muestra un ejemplo de un módulo de código fuente de entrada 101, un módulo de código fuente correspondiente 104 en el que una pluralidad de tareas de cálculo, etiquetadas T1, T2,..., TN se han identificado por ejemplo mediante el módulo de análisis de código 103, y un módulo de código fuente transformado 109, por ejemplo como el generado por el módulo de transformación 105. El módulo de código fuente de entrada incluye el código fuente 301 adaptado para hacer que un sistema de procesamiento de datos realice una pluralidad de tareas de cálculo. El módulo de código fuente transformado incluye las tareas de cálculo transformadas T1', T2',..., TN', y una función de despacho y selección 310.
La función de despacho y selección insertada 310 puede simplemente ordenar las tareas de cálculo seleccionándolas una a una, mientras se adhiere a las restricciones precedentes definidas por el grafo de precedencia. Por ejemplo, el grafo de precedencia se puede representar por una estructura de datos inicializados adecuada o las restricciones se pueden codificar directamente en la función insertada 310. Las tareas de cálculo transformadas se modifican de tal manera que tras la finalización del programa devuelven el control del programa a la función de despacho y selección 310.
La función de despacho y selección 310 puede mantener un estado del programa ejecutado para mantener el rastro de precedencia mientras se seleccionan las tareas. En una realización, la función de despacho y selección usa una función, \kappa, para seleccionar la "siguiente" tarea t, dando un estado específico de la ejecución del programa. Adicionalmente, la función de despacho y selección usa una función, \delta_{t}, para actualizar el estado después de seleccionar la tarea t. Si s_{0} indica el estado inicial y N indica el número total de tareas, las tareas se pueden ordenar como se ilustra por el pseudo código siguiente que ilustra un ejemplo de una función de despacho y selección:
1
Por consiguiente, inicialmente, la variable de estado actual s se inicializa al estado de programa inicial S_{0}. Posteriormente, se ejecuta un bucle N veces, donde en cada iteración la siguiente tarea se selecciona ejecutando la función \kappa(s). Entonces la tarea seleccionada se ejecuta, y el estado de programa se actualiza ejecutando la función \delta_{t}.
Se apreciará que el conjunto de estados de ejecución y las funciones \kappa y \delta_{t} se pueden definir en una variedad de formas. En una realización, su definición se deriva de un planteamiento estándar para la clasificación topológica (ver por ejemplo Niklaus Wirth, "Algoritmos + Estructuras de Datos = Programas", páginas 182-189, Prentice-Hall, Englewood Cliffs, Nueva Jersey, 1975) modificado adecuadamente a fin de proporcionar una selección aleatorizada de las tareas. Para este fin es útil señalar que todos los órdenes de ejecución válidos corresponden a un ordenamiento topológico de un grafo de precedencia correspondiente.
En una realización, el estado de ejecución se representa por la n-upla (T, Z, r), donde T indica el conjunto de tareas (es decir nodos en el grafo de precedencia) que se mantienen para ser ordenadas, Z indica el conjunto de tareas restantes sin predecesores dejados para ordenar, y r indica una semilla (pseudo) aleatoria. Z es de esta manera el subconjunto de T que contiene las tareas candidatas para la ejecución en el siguiente paso del proceso iterativo. La función \kappa selecciona uno de las candidatas en Z que usan la semilla (pseudo) aleatoria, r. La función \delta_{t} actualiza el estado, por ejemplo de la siguiente manera:
\delta_{t} (T, Z, r) = (T', Z', r')
donde
T' = T\{t},
Z' = (Z\{t}) \cup |u| u\insucc(t), p\notinT' for all p\inpred(u)}
r' = pring(r).
La tarea se quita del conjunto de tareas T que provoca el conjunto actualizado, T', de tareas que permanecen para ser programadas. La tarea t también se quita del conjunto Z de candidatas para la ejecución en el siguiente paso del algoritmo, provocando el conjunto actualizado Z'. Añadido al conjunto de candidatas están las sucesoras u de t en el grafo de precedencia, todas de cuyos predecesoras p ya han sido ejecutadas, es decir no se incluyen en T'. La semilla (pseudo) aleatoria, r, se actualiza por una función prng que implementa un algoritmo adecuado para la generación de un número pseudo aleatorio, por ejemplo el método congruencial lineal (ver por ejemplo D. E, Knuth. La Técnica de Programar Ordenadores, Volumen 2: Algoritmos Seminuméricos, Tercera Edición. Addison-Wesley, 1997, ISBN 0-201-89684-2, Sección 3.2.1: El Método Congruencial Lineal, páginas.10-26,) el algoritmo Mersenne Twister (Makoto Matsumoto y Takuji Nishimura: "Mersenne Twister un generador de números pseudo aleatorios uniforme dimensionalmente equidistribuido 623", Modelo de Trans. ACM. Simul. Comput., vol. 8, nº 1, 1998, páginas 3-30, ACM Press, Nueva York, NY, USA) o cualquier otro método adecuado. Alternativamente, se pueden usar componentes físicos de generación de números aleatorios o cualquier otra forma adecuada de generar una secuencia (pseudo) aleatoria de números de otros elementos de datos.
Además cabe señalar que en la realización anterior se mantienen ambos subconjuntos T y Z, proporcionando de esta manera una implementación eficiente. Se apreciará, no obstante, que en una realización alternativa solamente se mantiene uno de los subconjuntos, dado que T se puede derivar de Z y viceversa. Adicionalmente, se apreciará que se pueden usar otras representaciones, por ejemplo, el conjunto de tareas que se han ejecutado y su subconjunto de tareas sin sucesoras en el conjunto de tareas ejecutadas.
En lugar de realizar la invocación y selección de tareas por medio de una función separada como se describe anteriormente, cada tarea puede calcular su propia sucesora, como se ilustra en la fig. 4.
La Fig. 4 muestra un ejemplo de un módulo de código fuente de entrada 101, un módulo de código fuente correspondiente 104 en el que una pluralidad de tareas de cálculo, etiquetadas T1, T2,..., TN se han identificado, por ejemplo por el módulo de análisis de código 103, y un módulo de código fuente transformado 109, por ejemplo como el generado por el módulo de transformación 105. El módulo de código fuente transformado incluye las tareas de cálculo transformadas T1', T2',..., TN', cada una de las cuales incluye una o más sentencias de programa adicionales 410-1, 410-2,... 410-N para seleccionar e invocar una tarea sucesora. El módulo de código fuente transformado además puede incluir una rutina de inicialización 411 para inicializar el estado del programa, por ejemplo incluyendo la secuencia aleatoria, y para invocar una inicial de las tareas de cálculo transformadas.
Por ejemplo, tal ordenación de las tareas distribuidas se puede lograr integrando la evaluación de las funciones \kappa y \delta_{t} dentro del código fuente de cada tarea que usa un transformador fuente a fuente, por ejemplo el módulo de transformación de código 105. La primera tarea a ejecutar se selecciona en la función de inicialización 411 aplicando \kappa al estado inicial, es decir:
t_{1} = \kappa (S_{0})
ejecuta la tarea t_{1} y proporciona el estado s_{0} como un parámetro.
El módulo de transformación transforma el código fuente correspondiente a cada tarea tal que la tarea toma el estado actual s como un parámetro de entrada, actualiza el estado s usando \delta_{t} y selecciona la siguiente tarea t a ejecutar usando la función \kappa. El código fuente de cada tarea se complementa de esta manera por el código fuente 410-1,..., 410-N para realizar los siguientes pasos después de realizar los cálculos normales de la tarea:
s' = \delta_{t}(s)
t' = \kappa(s')
ejecuta la tarea t' y proporciona el estado s' como un parámetro.
Cabe señalar que la actualización del estado de programa, por ejemplo la evaluación de \delta_{t} en el ejemplo anterior, se puede especializar en el contexto de una tarea particular t, es decir las distintas funciones \delta_{t} se pueden insertar dentro de tareas distintas. En particular, las sucesoras de una tarea dada y las predecesoras de esas sucesoras son conocidas por el módulo de transformación dando un grafo de precedencia específico. Consecuentemente, el módulo de transformación puede generar funciones especializadas \delta_{t} (s). El suministro de funciones especializadas \delta_{t} con respecto a la tarea t permite una distribución de la representación del grafo de precedencia.
Como se describirá ahora con referencia a la fig. 5, el módulo de transformación 105 o el módulo de análisis de código 103 puede duplicar además el código fuente de una o más tareas. En este sentido, el proceso puede generar múltiples casos de la misma tarea.
La Fig. 5 ilustra esquemáticamente otro ejemplo de una transformación de código fuente que provoca el código fuente transformado que incluye múltiples casos de tareas de cálculo. En particular la fig. 5 muestra un ejemplo de un módulo de código fuente de entrada 101, un módulo de código fuente correspondiente 104 en el que se han identificado una pluralidad de tareas de cálculo, etiquetadas T1, T2,..., TN por ejemplo por el módulo de análisis de código 103, y un módulo de código fuente transformado 109, por ejemplo como se genera por el módulo el módulo de transformación 105. El módulo de código fuente transformado es similar al módulo de código fuente transformado de la fig. 4, e incluye las tareas de cálculo transformadas, cada una de las cuales incluye sentencias de programa adicionales para seleccionar e invocar una tarea sucesora. El módulo de código fuente transformado incluye además una rutina de inicialización 411 para inicializar el estado de programa, por ejemplo incluyendo la secuencia aleatoria, y para invocar una inicial de las tareas de cálculo transformadas. En el ejemplo de la fig. 5, el módulo de transformación 105 genera dos casos de cada tarea de cálculo identificada, tal que cada uno de los casos generados a partir de una tarea realiza la misma tarea de cálculo que la tarea de la que se genera. En particular, el módulo de transformación 105 genera los casos T1 a y T1 b a partir de la tarea T1, los casos T2a y T2b a partir de la tarea T2, y los casos TNa y TNb a partir de la tarea TN. Incluso aunque el ejemplo de la fig. 5 muestre dos casos para cada tarea de cálculo, se apreciará que el módulo de transformación puede generar un número distinto de casos, por ejemplo tres, cuatro, o incluso más casos. Se apreciará que el módulo de transformación puede generar distintos números de casos para tareas de cálculo distintas y/o generar múltiples casos solamente para un subconjunto de tareas de cálculo.
El módulo de transformación puede generar múltiples casos simplemente duplicando el código fuente de la tarea de cálculo original. Adicionalmente la diversidad se puede logar cuando el módulo de transformación aplica distintas transformaciones de conservación semánticas a uno o más casos de una tarea dada. Como resultado, no varían solamente las direcciones, sino también las instrucciones traídas desde estas direcciones. Ejemplos adecuados de las transformaciones de conservación semánticas que se pueden usar en este contexto se exponen por ejemplo en "Principios, Técnicas y Herramientas de los Compiladores" por Alfred V. Aho, Ravi Sethi y Jeffrey D. Ullman, Adison-Wesley, Reading, USA, 1986, o en "Marcado de agua, Inviolabilidad y Ofuscación-Herramientas para la Protección de Programas Informáticos" por Christian S. Collberg y Clark Thomborson, Transacciones del IEEE en Ingeniería de Soporte Lógico, 28:6 (Junio 2002).
El módulo de transformación puede representar además cada uno de los casos duplicados generados como nodos respectivos en el grafo de precedencia para obtener un grafo de precedencia modificado. El código insertado para la selección de tareas selecciona de esta manera un caso de cada tarea (pseudo) aleatoriamente en una ejecución particular del componente de soporte lógico. En este sentido, no solamente el orden de ejecución, sino también las direcciones de memoria desde las que se ejecuta el código varían entre las ejecuciones del componente de soporte lógico. En el ejemplo, los casos generados de las tareas de cálculo se generan a fin de incluir una o más sentencias de programa adicionales respectivas 510-1 a, 510-1 b, 510-2a, 510-2b,..., 510-Na, 510-Nb para seleccionar o invocar una tarea sucesora seleccionada de acuerdo con el grafo de precedencia modificado.
Se apreciará que la generación de múltiples casos de tareas de cálculo se puede implementar también en una realización con una función de despacho y selección de la tarea central.
Por consiguiente, en lo anterior, se han descrito las distintas realizaciones de un proceso para generar el código de programa transformado que provocan una ejecución de las tareas de cálculo en un orden aleatorizado, por ejemplo como se define por una secuencia de números (pseudo) aleatoria u otros elementos de datos. Como se mencionó anteriormente, la secuencia pseudo aleatoria se puede generar igual o distinta para instalaciones distintas del componente del soporte lógico.
Típicamente, un generador de número pseudo aleatorio se inicializa con un estado inicial - también denominado una semilla - como entrada. De esta manera, cuando se genera una secuencia pseudo aleatoria por un generador de números pseudo aleatorios (PRNG), las distintas secuencias de números pseudo aleatorios se pueden generar inicializando el PRNG con una semilla distinta en instalaciones distintas del programa informático. Por ejemplo, la semilla se puede derivar de un número serie u otro identificador que únicamente identifique una instalación. Alternativamente, la semilla del PRNG se puede seleccionar indicativa de un grupo predeterminado de instalaciones, por ejemplo instalaciones proporcionadas a un cliente dado, distintas versiones de lenguaje de un componente de soporte lógico, o similares.
Por consiguiente, el estado inicial so puede incluir de esta manera una semilla pseudo aleatoria, que es única para una instalación particular del componente de soporte lógico, pero que no varía entre las distintas ejecuciones de la misma instalación. De esta manera, usando un generador de números pseudo aleatorios determinístico, se provoca un rastro de ejecución que es probable que sea única para la instalación en el sentido de que el rastro de ejecución no varía entre las distintas ejecuciones de la misma instalación dando los mismos estímulos incluyendo por ejemplo el tiempo en el que aparecen las entradas tales como las respuestas de red.
Alternativamente, el estado inicial se puede seleccionar a fin de que sea distinto (al menos con una alta probabilidad) de ejecución en ejecución, por ejemplo seleccionando la semilla como una función de la fecha y hora, un reloj en tiempo real, y/u otra información que varía. En algunas realizaciones, la secuencia aleatorizada se puede generar por medio de un generador de números aleatorios de componentes físicos, de manera que cada ejecución de la misma instalación es probable que provoque un rastro distinto.
Por consiguiente en una realización del proceso descrito aquí dentro, el proceso de generación del código
-
integra el código para la ordenación de las tareas de cálculo dentro de las tareas de cálculo en sí mismas, y la actualización del estado se especializa con respecto a cada tarea,
-
genera varios casos de cada uno de al menos un subconjunto de tareas y aplica distintas transformaciones de conservación semánticas a cada caso,
-
genera el código que hace que el rastro de ejecución sea fija para una instalación particular del componente de soporte lógico, pero difiere entre las distintas instalaciones.
Usar múltiples casos de código crítico, integrar las funciones de selección en las tareas originales y aplicar transformaciones de conservación semánticas a los casos provoca diversidad adicional, que complica además el análisis.
La Fig. 6 muestra un diagrama de bloques esquemático de un sistema para la protección contra la manipulación del código de programa. El sistema comprende un sistema de procesamiento de datos 600, por ejemplo un ordenador tal como un PC. El sistema de procesamiento de datos incluye una unidad de procesamiento 621, por ejemplo un microprocesador tal como una CPU de un ordenador. La unidad de procesamiento 621 se conecta a un dispositivo de almacenamiento 620, tal como un disco duro, una interfaz de tarjeta de memoria, un dispositivo de disco óptico, o similares. La unidad de procesamiento 621 se programa adecuadamente para ejecutar una herramienta de soporte lógico automatizada 622, tal como un transformador fuente a fuente. Por ejemplo, la herramienta de soporte lógico automatizada 622 se puede adaptar para hacer que la unidad de procesamiento 621 cargue la representación de entrada, por ejemplo el código fuente, del código de programa a partir del dispositivo de almacenamiento 620, y realizar los pasos del método descrito aquí dentro. La unidad de procesamiento 621 entonces puede almacenar el código fuente transformado en el dispositivo de almacenamiento 620. Alternativamente, la unidad de procesamiento puede hacer el código fuente transformado disponible a otros programas ejecutados en los sistemas de procesamiento de datos, por ejemplo un compilador, y/o poner a la salida el resultado a través de otra interfaz adecuada. En una realización alternativa, la herramienta de soporte lógico automatizada puede procesar, por ejemplo compilar, el código fuente transformado directamente.
Aunque algunas realizaciones se han descrito y mostrado en detalle, la invención no está restringida a ellas, sino que también se puede realizar de otras formas dentro del alcance de la materia objeto definida en las siguientes reivindicaciones.
El método, medios de producto, y dispositivo descrito aquí dentro se puede implementar por medio de componentes físicos que comprenden varios elementos distintos, y por medio de un microprocesador programado adecuadamente. En las reivindicaciones del dispositivo que enumeran varios medios, varios de estos medios se pueden realizar por uno y el mismo elemento de componentes físicos, por ejemplo un microprocesador programado adecuadamente, uno o más procesadores digitales de señal, o similares. El mero hecho de que ciertas medidas se mencionen en distintas reivindicaciones dependientes mutuamente o se describan en distintas reivindicaciones no indica que una combinación de estas medidas no se pueda usar para beneficiar.
Se debería enfatizar que el término "comprende/que comprende" cuando se usa en esta especificación se toma para especificar la presencia de características, números enteros, pasos o componentes indicados pero no impiden la presencia o adición de una o más de las otras características, números enteros, pasos, componentes o grupos de los mismos.

Claims (18)

1. Un método implementado por ordenador de generación de código de programa de ordenador protegido contra la manipulación, el método que comprende:
- obtener una representación (101) de un código de programa de ordenador, el código de programa de ordenador que se adapta para hacer que un sistema de procesamiento de datos realice una pluralidad de tareas de cálculo en un primer orden de ejecución, cada tarea de cálculo que se representa en la representación del código de programa de ordenador por al menos una sentencia de programa;
- obtener (103) una pluralidad de órdenes de ejecución alternativos de las tareas de cálculo;
- generar (105) una representación ejecutable del código de programa adaptado a hacer que un sistema de procesamiento de datos seleccione un orden de ejecución aleatorizado a partir de la pluralidad de órdenes de ejecución alternativos y ejecutar las tareas de cálculo en el orden de ejecución aleatorizado seleccionado
caracterizado por generar una representación ejecutable del código de programa además comprende incluir las instrucciones ejecutables por ordenador (310) en la representación ejecutable del código de programa adaptado a hacer que un sistema de procesamiento de datos realice las siguientes tareas, cuando la imagen del código de programa se ejecuta por el sistema de procesamiento de datos:
a) realizar una inicial de las tareas de cálculo;
b) seleccionar una tarea de cálculo consecutiva a partir de un conjunto de sucesoras alternativas de la tarea de cálculo realizada en base a una representación de un conjunto de restricciones de precedencia impuestas en el orden de ejecución de las tareas de cálculo;
c) realizar la tarea de cálculo seleccionada;
d) repetir los pasos b) y c) hasta que han sido realizadas todas las tareas de cálculo.
\vskip1.000000\baselineskip
2. Un método de acuerdo con la reivindicación 1, en donde cada uno de los órdenes de ejecución alternativos se adaptan para hacer que el sistema de procesamiento de datos produzca la misma salida de programa que el primer orden de ejecución, cuando dicho código de programa se ejecuta por dicho sistema de procesamiento de datos.
3. Un método de acuerdo con la reivindicación 1 o 2, que además comprende representar los órdenes de ejecución alternativos como un grafo de precedencia (200).
\vskip1.000000\baselineskip
4. Un método de acuerdo con alguna de las reivindicaciones 1 hasta 3, que comprende:
- recibir una representación de entrada indicativa de una pluralidad de sentencias de programa en un orden secuencial predeterminado;
- agrupar las sentencias de programa para obtener la pluralidad de tareas de cálculo
- identificar la pluralidad de órdenes de ejecución alternativos.
\vskip1.000000\baselineskip
5. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 4, en donde la representación de un conjunto de restricciones de precedencia incluye una representación de un grafo de precedencia (200); y en donde generar una representación ejecutable del código de programa además comprende incluir las instrucciones ejecutables por ordenador en la representación ejecutable del programa de ordenador adaptado a hacer que un sistema de procesamiento de datos mantenga un estado de ejecución, el estado de ejecución que se define por al menos una del subconjunto de tareas de cálculo que permanecen para ser ejecutadas y el subconjunto de tareas de cálculo que permanecen para ser ejecutadas y cuyas predecesoras en el grafo de precedencia han sido todas ejecutadas.
6. Un método de acuerdo con la reivindicación 5, en donde una representación del estado de ejecución incluye además un elemento datos semilla para inicializar una función para generar una secuencia aleatorizada de elementos de datos.
7. Un método de acuerdo con la reivindicación 6, que comprende generar las representaciones ejecutables respectivas del código de programa para las instalaciones distintas del código de programa, cada representación ejecutable del código de programa que incluye un elemento de datos semilla respectivo indicativo de la instalación
correspondiente.
8. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 7, que además comprende insertar las instrucciones ejecutables dentro de cada una de las tareas de cálculo para realizar el paso de seleccionar la tarea de cálculo consecutiva.
9. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 8, que además comprende generar las instrucciones ejecutables de múltiples casos de la tarea de cálculo; y en donde seleccionar la tarea de cálculo incluye seleccionar uno de los múltiples casos de las tareas de cálculo.
10. Un método de acuerdo con la reivindicación 9, que además comprende realizar una o más transformaciones de ofuscación en al menos uno de los múltiples casos.
11. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 10, en donde generar una representación ejecutable del código de programa comprende generar una representación ejecutable del código de programa que incluye el código de programa para hacer que un sistema de procesamiento de datos seleccione el mismo orden de ejecución aleatorizado a partir de la pluralidad de órdenes de ejecución alternativos durante cada ejecución de la representación ejecutable generada del código de programa.
12. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 11, que comprende generar una pluralidad de representaciones ejecutables del código de programa, cada una incluyendo el código de programa para hacer que un sistema de procesamiento de datos seleccione un orden de ejecución aleatorizado distinto.
13. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 12, en donde la representación de entrada del código de programa incluye al menos un módulo de código fuente de entrada (101).
14. Un método de acuerdo con cualquiera de las reivindicaciones 1 hasta 13, que comprende al menos un módulo de código fuente transformado (109).
15. Un sistema de procesamiento de datos configurado para realizar los pasos del método de acuerdo con cualquiera de las reivindicaciones 1 hasta 14.
16. Un producto de programa de ordenador que comprende medios de código de programa ejecutable por ordenador adaptado para hacer que un sistema de procesamiento de datos realice el método de acuerdo a cualquiera de las reivindicaciones 1 hasta 14, cuando los medios de código de programa se ejecutan por el sistema de procesamiento de datos.
17. Un producto de programa de ordenador de acuerdo con la reivindicación 16, que comprende un medio de lectura por ordenador que ha almacenado inmediatamente después los medios de código de programa.
18. Un producto de programa de ordenador de acuerdo con la reivindicación 16 o 17, en donde el producto de programa de ordenador comprende un compilador de soporte lógico que comprende la funcionalidad adaptada para hacer que el sistema de procesamiento de datos realice el método de acuerdo con cualquiera de las reivindicaciones 1 hasta 13 como uno de un número de aprobaciones de compilación realizados por el compilador de soporte lógico.
ES07388048T 2007-06-29 2007-06-29 Ofuscacion de los rastros de ejecucion de un codigo de programa de ordenador. Active ES2340086T3 (es)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
EP07388048A EP2009572B1 (en) 2007-06-29 2007-06-29 Obfuscating execution traces of computer program code

Publications (1)

Publication Number Publication Date
ES2340086T3 true ES2340086T3 (es) 2010-05-28

Family

ID=38683575

Family Applications (1)

Application Number Title Priority Date Filing Date
ES07388048T Active ES2340086T3 (es) 2007-06-29 2007-06-29 Ofuscacion de los rastros de ejecucion de un codigo de programa de ordenador.

Country Status (7)

Country Link
US (1) US8522047B2 (es)
EP (1) EP2009572B1 (es)
CN (1) CN101689232B (es)
AT (1) ATE456837T1 (es)
DE (1) DE602007004587D1 (es)
ES (1) ES2340086T3 (es)
WO (1) WO2009003894A1 (es)

Families Citing this family (41)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8434059B2 (en) 2009-05-01 2013-04-30 Apple Inc. Systems, methods, and computer-readable media for fertilizing machine-executable code
JP5185242B2 (ja) * 2009-12-04 2013-04-17 株式会社東芝 コンパイル装置
US9134977B2 (en) * 2010-02-26 2015-09-15 Red Hat, Inc. Compiler operation for handling conditional statements
EP2402880A1 (en) * 2010-07-01 2012-01-04 Aladdin Europe GmbH Method and device for selectively protecting one of a plurality of methods of a class of an application written in an object-orientated language
CN103348319B (zh) * 2010-07-29 2017-03-01 爱迪德技术有限公司 用于有效部署整体多样化程序实例以抵抗差分攻击的***和方法
US20130014267A1 (en) * 2011-07-07 2013-01-10 Farrugia Augustin J Computer protocol generation and obfuscation
US9111072B1 (en) * 2011-08-23 2015-08-18 Tectonic Labs, LLC Anti-reverse engineering unified process
WO2013054248A1 (en) * 2011-10-12 2013-04-18 International Business Machines Corporation Generating a predictive data structure
EP2648125B1 (de) * 2012-03-05 2014-11-19 Steinberg Media Technologies GmbH Verfahren zur Autorisierung eines Programmablaufs
CN104662549B (zh) * 2012-03-30 2019-02-19 爱迪德技术有限公司 使用交叉链接来保护可访问的***
US9400639B2 (en) * 2012-06-22 2016-07-26 Microsoft Technology Licensing, Llc Generating programs using context-free compositions and probability of determined transformation rules
DE102012015899A1 (de) * 2012-08-10 2014-02-13 Giesecke & Devrient Gmbh Verfahren zum Erzeugen von ausführbarem Programmcode
DE102012015897A1 (de) * 2012-08-10 2014-02-13 Giesecke & Devrient Gmbh Verfahren zum Ausführen vom Programmcode
US9207923B2 (en) 2013-06-18 2015-12-08 International Business Machines Corporation Compiler optimization for memoization of pure function arguments
US9547758B2 (en) * 2014-05-19 2017-01-17 Nxp B.V. Program cable obfuscation based upon recently executed program code
US9454470B2 (en) 2015-02-10 2016-09-27 International Business Machines Corporation Sharing and executing sensitive logic semantics
CN106407754B (zh) * 2015-07-30 2021-06-18 中兴通讯股份有限公司 一种生成随机布局程序的方法及装置
CN106919833A (zh) * 2015-12-28 2017-07-04 上海华虹集成电路有限责任公司 安全芯片中防止功耗泄露的方法
US11002829B2 (en) * 2016-04-15 2021-05-11 Mediatek Inc. Radar interference mitigation method and apparatus
US10394554B1 (en) * 2016-09-09 2019-08-27 Stripe, Inc. Source code extraction via monitoring processing of obfuscated byte code
CN106548046B (zh) * 2016-10-25 2020-11-20 北京纬百科技有限公司 一种保护代码的装置和方法
US10261763B2 (en) 2016-12-13 2019-04-16 Palantir Technologies Inc. Extensible data transformation authoring and validation system
EP3355219A1 (en) * 2017-01-26 2018-08-01 Gemalto Sa Method to secure a software code
US9934127B1 (en) 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of key frames for replay responsiveness
US9959194B1 (en) 2017-03-08 2018-05-01 Microsoft Technology Licensing, Llc Indexing a trace by insertion of memory snapshots for replay responsiveness
US10185645B2 (en) 2017-03-08 2019-01-22 Microsoft Technology Licensing, Llc Resource lifetime analysis using a time-travel trace
US9934126B1 (en) 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of reverse lookup data structures
US9983978B1 (en) 2017-03-08 2018-05-29 Microsoft Technology Licensing, Llc Querying an indexed time-travel trace
US10282274B2 (en) 2017-06-14 2019-05-07 Microsoft Technology Licensing, Llc Presenting differences between code entity invocations
CN107506651B (zh) * 2017-07-04 2021-10-22 环玺信息科技(上海)有限公司 一种代码加密方法及***
CN107357706B (zh) * 2017-07-17 2021-01-08 深圳天珑无线科技有限公司 数据处理方法、装置及非临时性计算机可读介质
US12007908B2 (en) * 2017-12-14 2024-06-11 Arris Enterprises Llc Method and apparatus to dynamically encode data at runtime
US10481998B2 (en) * 2018-03-15 2019-11-19 Microsoft Technology Licensing, Llc Protecting sensitive information in time travel trace debugging
CN111310172B (zh) * 2018-12-12 2022-03-11 北京忆芯科技有限公司 通过反汇编验证处理器执行轨迹的方法及控制部件
EP3671497A1 (en) * 2018-12-18 2020-06-24 Koninklijke Philips N.V. Protected processing of operations
GB201821248D0 (en) 2018-12-27 2019-02-13 Palantir Technologies Inc Data pipeline management system and method
CN112711427A (zh) * 2019-10-24 2021-04-27 华为技术有限公司 一种镜像文件的获取方法以及装置
CN112860262B (zh) * 2021-02-09 2024-06-07 上海商汤智能科技有限公司 一种代码解析的方法、装置、电子设备及存储介质
WO2022199864A1 (en) * 2021-03-26 2022-09-29 Verimatrix Uk Ltd Input driven execution randomization
CN114021200B (zh) * 2022-01-07 2022-04-15 每日互动股份有限公司 一种用于pkg模糊化的数据处理***
CN115795418B (zh) * 2023-01-17 2023-04-14 泉州艾奇科技有限公司 水印嵌入方法、装置、计算机、存储介质

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1999001815A1 (en) * 1997-06-09 1999-01-14 Intertrust, Incorporated Obfuscation techniques for enhancing software security
US7430670B1 (en) * 1999-07-29 2008-09-30 Intertrust Technologies Corp. Software self-defense systems and methods
AU6750700A (en) * 1999-07-30 2001-02-19 Intertrust Technologies Corp. Methods and systems for transaction record delivery using thresholds and multi-stage protocol
US6829710B1 (en) * 2000-03-14 2004-12-07 Microsoft Corporation Technique for producing, through watermarking, highly tamper-resistant executable code and resulting “watermarked” code so formed
US7343494B2 (en) * 2001-08-01 2008-03-11 Sas Validy Method to protect software against unwanted use with a “renaming” principle
US7228426B2 (en) * 2002-04-03 2007-06-05 Microsoft Corporation Integrity ordainment and ascertainment of computer-executable instructions with consideration for execution context
US8332652B2 (en) * 2003-10-01 2012-12-11 International Business Machines Corporation Computing device that securely runs authorized software

Also Published As

Publication number Publication date
US8522047B2 (en) 2013-08-27
EP2009572B1 (en) 2010-01-27
EP2009572A1 (en) 2008-12-31
CN101689232A (zh) 2010-03-31
US20100262839A1 (en) 2010-10-14
WO2009003894A1 (en) 2009-01-08
ATE456837T1 (de) 2010-02-15
CN101689232B (zh) 2013-05-22
DE602007004587D1 (de) 2010-03-18

Similar Documents

Publication Publication Date Title
ES2340086T3 (es) Ofuscacion de los rastros de ejecucion de un codigo de programa de ordenador.
Luo et al. Semantics-based obfuscation-resilient binary code similarity comparison with applications to software plagiarism detection
CA2673075C (en) Obfuscating computer program code
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
JP4739465B2 (ja) ソフトウェアセキュリティを増強するための混乱化技術
US8176473B2 (en) Transformations for software obfuscation and individualization
Hou et al. Three control flow obfuscation methods for Java software
Park et al. Software decoys for insider threat
Norris et al. A practical approach for model checking C/C++ 11 code
Angstadt et al. RAPID programming of pattern-recognition processors
Graf Information Flow Control with System Dependence Graphs-Improving Modularity, Scalability and Precision for Object Oriented Languages
Banescu et al. VOT4CS: A virtualization obfuscation tool for C#
Patrignani et al. Robustly safe compilation or, efficient, provably secure compilation
Zhao et al. Dexpro: A bytecode level code protection system for android applications
Gibbs et al. Weaving Aspects into C++ Applications for Validation of Temporal Invariants.
Harbulot et al. Separating concerns in scientific software using aspect-oriented programming
Kundu JShield: a java anti-reversing tool
Dalla Preda et al. Abstract similarity analysis
Langlands et al. Rust for Visual Effects
Lu Control Flow Obfuscation for FJ using Continuation Passing
Fang et al. DexPro: A Bytecode Level Code Protection System for Android Applications
Kampen Formal Automated Verification of a Work-Stealing Deque
Hossain et al. Firmware Protection
Dinu ObfuscatorDynamic-LLVM: Dynamic Symbolic Execution Attack Protections for the Masses
Udaeta Arce Implementation of a obfuscator for the Java Virtual Machine