W Pub: ABAP Bad Coder

  1. *"~.               ENDIF|ENDLOOP|ENDWHILE|ENDFORM|ENDCASE|EXIT|ENDAT|CONTINUE|
  2. *|___________________________________________________________________________| NO TOCAR
  3. *
  4. REPORT  zbadcoder LINE-SIZE 255.
  5. *
  6. * ### ADVERTENCIA ### No existe (AUN) el ZBADDeCoder.
  7. *
  8. * Elimina comentarios de los programas
  9. * Pone basura al final de cada línea
  10. * Susituye variables y nombres de procedimientos por otras aleatorias
  11. * Permite mejorar el código para que BadCoder trabaje bien
  12. *
  13. *
  14. CONSTANTS: dicc(42)    VALUE '1QAZ2W~SX3ED~C4RFV5~TGB6YHN~7UJM8IK~9OL0P_',
  15.            diccnum(10) value '0987654321',
  16.            payload(50) value '| BadCoder v0.2 | was here, enjoy the code',
  17.            void        value 0,
  18.            theone      value 1.
  19.  
  20. type-POOLs: ABAP.
  21.  
  22. PARAMETERS: p_src(40) DEFAULT 'ZNADAR',
  23.             p_trash AS CHECKBOX DEFAULT abap_true,
  24.             p_test AS CHECKBOX DEFAULT abap_true.
  25.  
  26. DATA: t_src TYPE STANDARD TABLE OF string,
  27.       c_src TYPE string,
  28.       c_header type string,
  29.       t_compo LIKE scompo OCCURS void WITH HEADER LINE,
  30.       t_cross_ref LIKE cross OCCURS void WITH HEADER LINE,
  31.       t_inc LIKE d010inc OCCURS void WITH HEADER LINE,
  32.       l_point(theone),
  33.       l_comillas(theone),
  34.       l_tilde(theone),
  35.       l_asterisco(theone).
  36. data: l_result type REPL_RESULT,
  37.       l_match type match_result_tab,
  38.       c_match type MATCH_RESULT.
  39.  
  40.  
  41. DEFINE random_text.
  42.   clear: sy-curow, sy-lisel.
  43.   while sy-curow < &1. "<-- Aquí va la longitud máxima
  44.     call function 'CACS_RANDOM_I4'
  45.       exporting
  46.         rnd_min   = 0
  47.         rnd_max   = 41
  48.       importing
  49.         rnd_value = sy-pagno.
  50.     if &3 = abap_false and dicc+sy-pagno(theone) = l_tilde.
  51.       continue.
  52.     endif.
  53.     concatenate sy-lisel dicc+sy-pagno(theone) into sy-lisel.
  54.     condense sy-lisel no-gaps.
  55.     if sy-curow = void.
  56.       if sy-lisel+void(theone) co diccnum. "<-- Evitamos que comience por numérico
  57.         shift sy-lisel left.
  58.         continue.
  59.       endif.
  60.     endif.
  61.     add 1 to sy-curow.
  62.   endwhile.
  63.   &2 = sy-lisel. "<-- Exportamos la salida.
  64.   translate &2 using '~ '.
  65. END-OF-DEFINITION.
  66.  
  67.  
  68. END-OF-SELECTION.
  69.  
  70.   PERFORM load_program.
  71.   PERFORM work_vars_forms.
  72.   perform work_macros.
  73.   PERFORM llena_basura.
  74.   PERFORM save_badcoder.
  75.  
  76. FORM save_badcoder.
  77.   IF p_test IS INITIAL.
  78.     INSERT REPORT p_src FROM t_src.
  79.   ENDIF.
  80.   LOOP AT t_src INTO c_src.
  81.     WRITE: / c_src.
  82.   ENDLOOP.
  83. ENDFORM.                    "save_badcoder
  84.  
  85. FORM load_program.
  86.   READ REPORT sy-repid INTO t_src.
  87.   read table t_src into c_header INDEX theone.
  88.   l_asterisco = c_header+void(theone).
  89.   l_comillas  = c_header+theone(theone).
  90.   l_tilde     = c_header+2(theone).
  91.   l_point     = c_header+3(theone).
  92.   READ REPORT p_src INTO t_src.
  93.   CALL FUNCTION 'RS_PROGRAM_INDEX'
  94.     EXPORTING
  95.       pg_name      = p_src
  96.     TABLES
  97.       compo        = t_compo
  98.       cross_ref    = t_cross_ref
  99.       inc          = t_inc
  100.     EXCEPTIONS
  101.       syntax_error = 1
  102.       OTHERS       = 2.
  103. ENDFORM.                    "load_program
  104.  
  105.  
  106. FORM work_macros.
  107. ENDFORM.
  108.  
  109. FORM work_vars_forms.
  110.  
  111.  c_src = c_header.
  112.  shift c_src LEFT by 20 PLACES.
  113.  sy-pagno = void.
  114.  
  115.  while not c_src is INITIAL.
  116.      if c_src+sy-pagno(theone) = payload+void(theone).
  117.         t_compo-type = l_tilde.
  118.         t_compo-name = c_src+void(sy-pagno).
  119.         append t_compo.
  120.         add theone to sy-pagno.
  121.         shift c_src LEFT by sy-pagno PLACES.
  122.         clear sy-pagno.
  123.         CONTINUE.
  124.      endif.
  125.      add theone to sy-pagno.
  126.  ENDWHILE.
  127.  
  128.  
  129. *--[ Nos cargamos las funciones
  130.   sy-lisel = 'call( )+function( )+''([0-9_A-Z]+)'''.
  131.   find ALL OCCURRENCES OF REGEX sy-lisel
  132.   in table t_src
  133.   RESULTS l_match
  134.   ignoring case.
  135.   loop at l_match into c_match.
  136.     read table t_src into c_src index c_match-line.
  137.     c_src = c_src+c_match-offset(c_match-length).
  138.     condense c_src no-GAPS.
  139.     shift c_src left by 13 PLACES.
  140.     sy-pagno = strlen( c_src ) - 1.
  141.     c_src = c_src+0(sy-pagno).
  142.     t_compo-type = '#'.
  143.     t_compo-name = c_src.
  144.     append t_compo.
  145.   endloop.
  146.  
  147.  
  148.   LOOP AT t_compo.
  149.     IF t_compo-incl NE p_src OR t_compo-type NA 'DUKE~#'.
  150.       DELETE t_compo.
  151.     ELSE.
  152.       CLEAR: t_compo-incl, t_compo-class, t_compo-exposure, t_compo-interface.
  153.  
  154.       t_compo-class = sy-listi = STRLEN( t_compo-name ).
  155.       random_text sy-listi t_compo-incl ' '.
  156.       MODIFY t_compo.
  157.     ENDIF.
  158.   ENDLOOP.
  159.  
  160.   SORT t_compo BY class DESCENDING. "<- Tenemos las variables protegidas
  161.  
  162.   LOOP AT t_compo.
  163.     CONCATENATE '\b(' t_compo-name ')\b' INTO sy-lisel.
  164.     CONDENSE sy-lisel NO-GAPS.
  165.     clear l_result.
  166.     if t_compo-type ca '#'.
  167.        CONCATENATE '(''' t_compo-name ''')' INTO sy-lisel.
  168.        CONDENSE sy-lisel NO-GAPS.
  169.     endif.
  170.     REPLACE ALL OCCURRENCES OF REGEX sy-lisel
  171.      IN TABLE t_src WITH t_compo-incl
  172.      IGNORING CASE
  173.      RESULTS l_result.
  174.     if ( t_compo-type ca '#' and l_result-line >= theone ) or
  175.        ( t_compo-type ca 'E~' and l_result-line >= theone ).
  176.  
  177.        sy-lisel = '(report|program)'.
  178.        find FIRST OCCURRENCE OF REGEX sy-lisel
  179.        in TABLE t_src
  180.        IGNORING CASE
  181.        RESULTS c_match.
  182.        add theone to c_match-line.
  183.        case t_compo-type.
  184. *--[ Transformamos literales en constantes
  185.          when '#'. CONCATENATE 'CONSTANTS~' t_compo-incl '~type~c~length~' t_compo-class '~value~''' t_compo-name '''' l_point into c_src.
  186.                    condense c_src NO-GAPS.
  187.                    translate c_src USING '~ '.
  188. *--[ Transformamos sentencias únicas en macros
  189.          when 'E' or '~'.
  190.                   CONCATENATE 'DEFINE' t_compo-INCL l_point t_compo-name l_point 'END-OF-DEFINITION' l_point into c_src SEPARATED BY abap_false.
  191.        endcase.
  192.        insert c_src into t_src INDEX c_match-line.
  193.     endif.
  194.   ENDLOOP.
  195.  
  196.   PERFORM cmp_sintaxis.
  197.  
  198. ENDFORM.                    "work_vars_forms
  199.  
  200.  
  201. FORM cmp_sintaxis.
  202.   DATA: miword TYPE string,
  203.         linea_error LIKE sy-pagno.
  204.   SYNTAX-CHECK FOR t_src MESSAGE c_src LINE linea_error WORD miword PROGRAM p_src.
  205.   IF sy-subrc >= theone.
  206. *--[ Hemos fracasado, hay que recargar el programa
  207.     WRITE: / '[Error]', linea_error, c_src, miword.
  208.     PERFORM load_program.
  209.   ENDIF.
  210. ENDFORM.                    "cmp_sintaxis
  211.  
  212. FORM llena_basura.
  213.   DATA: basura TYPE string,
  214.         con_punto(theone).
  215.   CLEAR con_punto.
  216.   DATA: caracterc TYPE c,
  217.         patron_millas(3).
  218.  
  219.   caracterc = l_comillas.
  220.   CONCATENATE l_asterisco caracterc l_asterisco INTO patron_millas.
  221.   LOOP AT t_src INTO c_src.
  222. *++[ Quitamos espacios iniciales
  223.     SHIFT c_src LEFT DELETING LEADING abap_false.
  224.  
  225. *++[ Quitamos comentarios.
  226.     IF c_src IS INITIAL.
  227.       DELETE t_src INDEX sy-tabix.
  228.       CONTINUE.
  229.     ENDIF.
  230.     IF c_src+void(theone) = l_asterisco.
  231.       DELETE t_src INDEX sy-tabix.
  232.       CONTINUE.
  233.     ENDIF.
  234.  
  235. *++[ Eliminamos comentarios de las comillas que puedan existir
  236.     IF c_src CP patron_millas.
  237.       SEARCH c_src FOR caracterc.
  238.       IF sy-subrc < theone.
  239.         c_src = c_src+void(sy-fdpos).
  240.       ENDIF.
  241.     ENDIF.
  242. *++[ Comprimimos la línea
  243.     CONDENSE c_src.
  244.  
  245.     IF con_punto = abap_true.
  246.       CONCATENATE l_point c_src INTO c_src SEPARATED BY abap_false.
  247.       CLEAR con_punto.
  248.     ENDIF.
  249.  
  250.     sy-listi = STRLEN( c_src ).
  251.     IF sy-listi > 2.
  252.       sy-listi = sy-listi - theone.
  253.       IF c_src+sy-listi(theone) = l_point.
  254.         c_src = c_src+void(sy-listi).
  255.         con_punto = abap_true.
  256.       ENDIF.
  257.     ENDIF.
  258.  
  259. *++[ Generamos Ruido
  260.     if p_trash = abap_true.
  261.        sy-listi = 120 - STRLEN( c_src ).
  262.        random_text sy-listi basura abap_true.
  263.        CONCATENATE c_src caracterc basura INTO c_src.
  264.     endif.
  265.     MODIFY t_src FROM c_src.
  266.     AT LAST.
  267.       CONCATENATE l_point abap_false caracterc payload INTO c_src.
  268.       APPEND c_src TO t_src.
  269.       EXIT.
  270.     ENDAT.
  271.   ENDLOOP.
  272.   PERFORM cmp_sintaxis.
  273. ENDFORM.                    "llena_basura