6 de julio de 2010

La protección KNOW HOW de Step7

Es habitual en los proyectos de Step7 que ciertos bloques de programa estén protegidos, sobre todo si usamos bloques de bibliotecas de Siemens. Por ejemplo, los bloques que entrega Siemens para manejar una CP340 están protegidos:


Si intentamos abrirlos nos saldrá el mensaje:


Estos bloques tienen activada la protección KNOW HOW y tan solo nos permite ver la interfaz del bloque (parámetros IN, OUT e IN/OUT) y su comentario general. Sin embargo, el código del bloque, las variables estáticas y temporales, y los comentarios de los segmentos son inaccesibles.

Nosotros también podemos proteger nuestros bloques de programa. En la página web de Siemens está explicado, el procedimiento es sencillo y voy a poner un ejemplo.

Partamos de un proyecto donde está el FC o FB que deseamos proteger, en mi caso el FB50.


Hacemos doble clic sobre él y se abrirá el editor. Vamos al menú Archivo y pulsamos sobre Generar fuente.


Ahora deberemos especificar un nombre para nuestro nuevo fichero fuente, en mi caso lo he llamado FB50_Protect.


Seleccionamos el bloque de función que queremos proteger y aceptamos.



Como el bloque lo tenemos abierto con el editor nos advierte que la fuente se generará con el bloque guardado en el proyecto.


Y ya tenemos nuestro fichero fuente generado.


Hacemos doble clic sobre él y aparecerá el editor con el código para generar el FB. Para activar la protección KNOW HOW tenemos que agregar debajo del título la sentencia KNOW_HOW_PROTECT.


Guardamos y cerramos el editor. Vamos a la carpeta Fuentes del administrador Simatic, pulsamos con el botón derecho sobre el fichero fuente y ordenamos compilar.


Y listo, el FB50 ya aparece en el administrador Simatic como protegido.


Como es lógico, cuando distribuyamos nuestro proyecto hay que tener la precaución de eliminar los ficheros fuente.

Para deshacer la protección debemos volver a abrir el fichero fuente, eliminar la sentencia KNOW_HOW_PROTECT, guardar y volver a compilar.

Hasta aquí lo que nos cuenta Siemens de su sistema de protección KNOW HOW, pero ya en el foro técnico de Siemens hay usuarios que apuntan que es muy fácil de burlar. No tuve que buscar mucho para encontrar en el foro de control.com este post de un tal Marco que explica como eliminarla de una manera muy sencilla. El procedimiento es el siguiente:

ADVERTENCIA: Hay que tener siempre una copia de seguridad del proyecto que pretendamos alterar.

Hay que buscar dentro del directorio del proyecto el fichero SUBBLK.DBF dentro del subdirectorio ombstx/offline/00000001.


En mis pruebas me he encontrado que a veces el directorio 00000001 no existe, y en su lugar aparecen directorios como 00000002, 00000003, 00000008 u otros, incluso varios a la vez. En cada uno de ellos aparece un fichero SUBBLK.DBF y, según mi experiencia, el fichero que debemos modificar es el que está dentro del directorio con la numeración más baja, aunque podría no ser así siempre.

Abrimos el fichero SUBBLK.DBF con un editor hexadecimal. Yo he usado Notepad++ en modo hexadecimal y presenta este aspecto:


Ahora debemos buscar una cadena de texto de siete caracteres que depende del bloque que deseemos desproteger. Si el bloque es un FC los tres primeros caracteres serán '120' y si es un FB serán '140'. A continuación los cuatro caracteres restantes serán el número de FB o FC completado con ceros, por ej. para el FB50 la cadena de caracteres será '1400050'.


A partir de la posición donde hemos encontrado nuestra cadena debemos avanzar 84 bytes, y si todo está correcto debe aparecer un 33 hexadecimal (51 decimal).


Cambiamos ese 33 por un 30 (48 en decimal) y guardamos el fichero.


Y listo, de esta forma tan sencilla hemos desprotegido el FB50 y ya podemos acceder a su código.


Debemos tener en cuenta que todos los comentarios que hubiese previamente en el bloque se perderán y accederemos al código en crudo.

NOTA: En una ocasión, a pesar de haber realizado la operación correctamente, el bloque me seguía figurando como protegido. Para solucionarlo, en el proyecto original, hice una reorganización (SIMATIC Manager -> Archivo -> Reorganizar) y volví a repetir el proceso, y esta vez sí funcionó. Quizá sea buena idea reorganizar previamente los proyectos.


Visto que el procedimiento de desprotección es tan sencillo he hecho una pequeña aplicación en Visual Basic para automatizar el proceso, si alguien está interesado en ella que me escriba un correo y se la mando.



ACTUALIZACIÓN:  Puedes descargar la aplicación aquí, la contraseña es "notasdeautomatizacion".

En conclusión, la protección KNOW HOW, como concepto, me parece buena idea, pero está muy mal implementada: la forma de saltársela es absurdamente sencilla. Podemos proteger nuestros programas pero debemos saber que si hay alguien interesado en fisgonear en nuestro código no le va a costar mucho conseguirlo.

17 comentarios:

  1. Interesante... siempre me preguntan por qué no protejo mi código.

    Mis respuestas suelen ser:
    -Porque es bastante farragoso y difícil de entender, no merece la pena.
    - Y similares.

    Ahora ya tengo otra más (porque no sirve para casi nada, je je je).

    Gracias por el interesante artículo.

    ResponderEliminar
  2. La protección de lectura de la CPU creo que aún no ha sido burlada. ¿Me equivoco?

    ResponderEliminar
    Respuestas
    1. Que yo sepa no hay ninguna manera de leer de una CPU protegida por contraseña.

      Eliminar
    2. Buen día estimado GR, muchas gracias por el programa e información.
      Una pregunta, así como 140=FB, 120=FC, conoces cual sería el serial para los casos DB y/o SFC?.
      Gracias de antemano.

      Eliminar
    3. para las Db son 100 y SFC son de sistema creo q no deveriamos tocarlas

      Eliminar
  3. no sabes como desproteger un programa de simotion

    ResponderEliminar
  4. Una vez más gracias, muy bien explicado, voy a intentar desproteger las FC58 y 59 para intentar enviar y recibir datos entre dos cpu300 a través de profibús, por cierto no tendrás una entrada para ayudarme en esto.
    Gran Blog

    ResponderEliminar
  5. Corrijo lo antes dicho necesito desproteger un bloque SFC 58 y 59 no se si podré, ni siquiera se si es el metodo correcto de enviar datos

    ResponderEliminar
  6. AL INTENTAR EXTRAER EL PROGRAMA ME DICE QUE ESTA DAÑADO

    ResponderEliminar
  7. Para S5 tendrás alguna recomendación??

    ResponderEliminar
  8. Buenas noches tendras algun manual del programa que creaste en Visual Basic, trato de desbloquear un SUBBLK.DBF con el programa pero me marca que no existe el directorio 'ombstx'

    ResponderEliminar
    Respuestas
    1. Una cosa mas cual es la diferencia entre SUBBLK.DBF y SUBBLK.DBT?

      Eliminar
  9. No habría una manera también sencilla como esta pero que no tenga que emplear tanto tiempo? Gracias.

    ResponderEliminar
  10. Buenas tardes GR!
    Muy interesante... Me ha venido muy bien y he podido desproteger un OB "80xxxxx" y tengo un problema al intentar desbloquear un DB "100xxx"!! Se aplica el mismo procedimiento.....
    Si lo hago, da un error de desbordamiento de memoria...
    Sabrías decirnos, como sería?
    Saludos...

    ResponderEliminar
  11. Buenas tardes, GR, ¿Aún tienes por ahí el programa que hiciste con Visual Basic? Quisiera hacer una prueba con un proyecto hecho con Step 7 que recientemente me han pasado. Gracias

    ResponderEliminar
  12. Hola tienes por ahi el program para desproteger los FB..podrias volver a subirlo, gracias

    ResponderEliminar
  13. Buen día alguien sabe cómo quitar las contraseñas de los FB y fc???

    ResponderEliminar

Por favor, no pidas copias de programas comerciales, licencias o números de serie.