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 PDFInfo
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring 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
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/16—Program or content traceability, e.g. by watermarking
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/70—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
- G06F21/71—Protecting 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/75—Protecting 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/755—Protecting 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
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/21—Indexing 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/2145—Inheriting 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)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Technology Law (AREA)
- Multimedia (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.
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.
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
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.
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.
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.
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.
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:
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.
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.
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 (45)
| 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 |
| US8990785B2 (en) | 2010-07-29 | 2015-03-24 | Robert Durand | System and method for efficiently deploying massively diverse program instances to resist differential attacks |
| 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 |
| US9557966B2 (en) | 2011-10-12 | 2017-01-31 | 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 |
| WO2013142979A1 (en) * | 2012-03-30 | 2013-10-03 | Irdeto Canada Corporation | Securing accessible systems using dynamic data mangling |
| 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 |
| 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 |
| US9959194B1 (en) | 2017-03-08 | 2018-05-01 | Microsoft Technology Licensing, Llc | Indexing a trace by insertion of memory snapshots for replay responsiveness |
| US9934127B1 (en) | 2017-03-08 | 2018-04-03 | Microsoft Technology Licensing, Llc | Indexing a trace by insertion of key frames for replay responsiveness |
| 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 |
| CN112711427B (zh) | 2019-10-24 | 2025-03-25 | 华为技术有限公司 | 一种镜像文件的获取方法以及装置 |
| CN112860262B (zh) * | 2021-02-09 | 2024-06-07 | 上海商汤智能科技有限公司 | 一种代码解析的方法、装置、电子设备及存储介质 |
| EP4315140B1 (en) | 2021-03-26 | 2025-09-24 | Verimatrix UK Ltd | Input driven execution randomization |
| LU500189B1 (en) | 2021-05-21 | 2022-11-21 | Microsoft Technology Licensing Llc | Using entropy to prevent inclusion of payload data in code execution log data |
| CN113987983B (zh) * | 2021-11-17 | 2024-11-08 | 首都师范大学 | 一种Ptolemy同步响应模型翻译的验证方法及插件 |
| EP4195579A1 (en) * | 2021-12-07 | 2023-06-14 | Thales Dis France SAS | Asynchronous code execution for enhanced performance and security measures protecting digital security devices |
| CN114021200B (zh) * | 2022-01-07 | 2022-04-15 | 每日互动股份有限公司 | 一种用于pkg模糊化的数据处理系统 |
| CN115795418B (zh) * | 2023-01-17 | 2023-04-14 | 泉州艾奇科技有限公司 | 水印嵌入方法、装置、计算机、存储介质 |
| CN120850259A (zh) * | 2025-07-21 | 2025-10-28 | 烟台海颐软件股份有限公司 | 基于指令驱动的Java运行时业务逻辑保护方法及系统 |
Family Cites Families (7)
| 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 |
| EP1531383A3 (en) * | 1999-07-30 | 2005-07-27 | 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 |
-
2007
- 2007-06-29 AT AT07388048T patent/ATE456837T1/de not_active IP Right Cessation
- 2007-06-29 ES ES07388048T patent/ES2340086T3/es active Active
- 2007-06-29 EP EP07388048A patent/EP2009572B1/en active Active
- 2007-06-29 DE DE602007004587T patent/DE602007004587D1/de active Active
-
2008
- 2008-06-25 CN CN2008800227732A patent/CN101689232B/zh active Active
- 2008-06-25 WO PCT/EP2008/058091 patent/WO2009003894A1/en not_active Ceased
- 2008-06-25 US US12/664,893 patent/US8522047B2/en active Active
Also Published As
| Publication number | Publication date |
|---|---|
| WO2009003894A1 (en) | 2009-01-08 |
| DE602007004587D1 (de) | 2010-03-18 |
| US8522047B2 (en) | 2013-08-27 |
| US20100262839A1 (en) | 2010-10-14 |
| CN101689232A (zh) | 2010-03-31 |
| EP2009572A1 (en) | 2008-12-31 |
| ATE456837T1 (de) | 2010-02-15 |
| EP2009572B1 (en) | 2010-01-27 |
| CN101689232B (zh) | 2013-05-22 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| CN101689232B (zh) | 对计算机程序代码的执行轨迹进行模糊化 | |
| Luo et al. | Semantics-based obfuscation-resilient binary code similarity comparison with applications to software plagiarism detection | |
| CA2673075C (en) | Obfuscating computer program code | |
| Hammer et al. | Information Flow Control for Java Based on Path Conditions in Dependence Graphs. | |
| US8176473B2 (en) | Transformations for software obfuscation and individualization | |
| US7254586B2 (en) | Secure and opaque type library providing secure data protection of variables | |
| JP4739465B2 (ja) | ソフトウェアセキュリティを増強するための混乱化技術 | |
| US9128722B2 (en) | Systems, methods, and computer-readable media for fertilizing machine-executable code | |
| Spoto | The Julia static analyzer for Java | |
| Hou et al. | Three control flow obfuscation methods for Java software | |
| Angstadt et al. | RAPID programming of pattern-recognition processors | |
| Gibbs et al. | Weaving Aspects into C++ Applications for Validation of Temporal Invariants. | |
| Lu | Control Flow Obfuscation for FJ using Continuation Passing | |
| Harbulot et al. | Separating concerns in scientific software using aspect-oriented programming | |
| Mourad et al. | New aspect-oriented constructs for security hardening concerns | |
| Shyamasundar et al. | Enhancing robustness of smart contracts through declarations | |
| Dinu | ObfuscatorDynamic-LLVM: Dynamic Symbolic Execution Attack Protections for the Masses | |
| Wu et al. | Android App Repackaging Detection: A Comprehensive Survey | |
| Cabo et al. | Finding Programming Faults Even When Large Parts of the Code Have Disappeared | |
| Malka | How NixOS could have detected the XZ supply-chain attack for the benefit of all thanks to reproducible-builds | |
| Laverdière et al. | Control flow based pointcuts for security hardening concerns | |
| AlBassam | Enforcing security policies on GPU computing through the use of aspect-oriented programming techniques | |
| Zhang | Reverse and Anti-Reverse Engineering of Deep Neural Network Programs | |
| Udaeta Arce | Implementation of a obfuscator for the Java Virtual Machine | |
| Xi | Separation of concerns in concurrent programs using fine grained join points |