- *"~. ENDIF|ENDLOOP|ENDWHILE|ENDFORM|ENDCASE|EXIT|ENDAT|CONTINUE|
- *|___________________________________________________________________________| NO TOCAR
- *
- REPORT zbadcoder LINE-SIZE 255.
- *
- * ### ADVERTENCIA ### No existe (AUN) el ZBADDeCoder.
- *
- * Elimina comentarios de los programas
- * Pone basura al final de cada línea
- * Susituye variables y nombres de procedimientos por otras aleatorias
- * Permite mejorar el código para que BadCoder trabaje bien
- *
- *
- CONSTANTS: dicc(42) VALUE '1QAZ2W~SX3ED~C4RFV5~TGB6YHN~7UJM8IK~9OL0P_',
- diccnum(10) value '0987654321',
- payload(50) value '| BadCoder v0.2 | was here, enjoy the code',
- void value 0,
- theone value 1.
- type-POOLs: ABAP.
- PARAMETERS: p_src(40) DEFAULT 'ZNADAR',
- p_trash AS CHECKBOX DEFAULT abap_true,
- p_test AS CHECKBOX DEFAULT abap_true.
- DATA: t_src TYPE STANDARD TABLE OF string,
- c_src TYPE string,
- c_header type string,
- t_compo LIKE scompo OCCURS void WITH HEADER LINE,
- t_cross_ref LIKE cross OCCURS void WITH HEADER LINE,
- t_inc LIKE d010inc OCCURS void WITH HEADER LINE,
- l_point(theone),
- l_comillas(theone),
- l_tilde(theone),
- l_asterisco(theone).
- data: l_result type REPL_RESULT,
- l_match type match_result_tab,
- c_match type MATCH_RESULT.
- DEFINE random_text.
- clear: sy-curow, sy-lisel.
- while sy-curow < &1. "<-- Aquí va la longitud máxima
- call function 'CACS_RANDOM_I4'
- exporting
- rnd_min = 0
- rnd_max = 41
- importing
- rnd_value = sy-pagno.
- if &3 = abap_false and dicc+sy-pagno(theone) = l_tilde.
- continue.
- endif.
- concatenate sy-lisel dicc+sy-pagno(theone) into sy-lisel.
- condense sy-lisel no-gaps.
- if sy-curow = void.
- if sy-lisel+void(theone) co diccnum. "<-- Evitamos que comience por numérico
- shift sy-lisel left.
- continue.
- endif.
- endif.
- add 1 to sy-curow.
- endwhile.
- &2 = sy-lisel. "<-- Exportamos la salida.
- translate &2 using '~ '.
- END-OF-DEFINITION.
- END-OF-SELECTION.
- PERFORM load_program.
- PERFORM work_vars_forms.
- perform work_macros.
- PERFORM llena_basura.
- PERFORM save_badcoder.
- FORM save_badcoder.
- IF p_test IS INITIAL.
- INSERT REPORT p_src FROM t_src.
- ENDIF.
- LOOP AT t_src INTO c_src.
- WRITE: / c_src.
- ENDLOOP.
- ENDFORM. "save_badcoder
- FORM load_program.
- READ REPORT sy-repid INTO t_src.
- read table t_src into c_header INDEX theone.
- l_asterisco = c_header+void(theone).
- l_comillas = c_header+theone(theone).
- l_tilde = c_header+2(theone).
- l_point = c_header+3(theone).
- READ REPORT p_src INTO t_src.
- CALL FUNCTION 'RS_PROGRAM_INDEX'
- EXPORTING
- pg_name = p_src
- TABLES
- compo = t_compo
- cross_ref = t_cross_ref
- inc = t_inc
- EXCEPTIONS
- syntax_error = 1
- OTHERS = 2.
- ENDFORM. "load_program
- FORM work_macros.
- ENDFORM.
- FORM work_vars_forms.
- c_src = c_header.
- shift c_src LEFT by 20 PLACES.
- sy-pagno = void.
- while not c_src is INITIAL.
- if c_src+sy-pagno(theone) = payload+void(theone).
- t_compo-type = l_tilde.
- t_compo-name = c_src+void(sy-pagno).
- append t_compo.
- add theone to sy-pagno.
- shift c_src LEFT by sy-pagno PLACES.
- clear sy-pagno.
- CONTINUE.
- endif.
- add theone to sy-pagno.
- ENDWHILE.
- *--[ Nos cargamos las funciones
- sy-lisel = 'call( )+function( )+''([0-9_A-Z]+)'''.
- find ALL OCCURRENCES OF REGEX sy-lisel
- in table t_src
- RESULTS l_match
- ignoring case.
- loop at l_match into c_match.
- read table t_src into c_src index c_match-line.
- c_src = c_src+c_match-offset(c_match-length).
- condense c_src no-GAPS.
- shift c_src left by 13 PLACES.
- sy-pagno = strlen( c_src ) - 1.
- c_src = c_src+0(sy-pagno).
- t_compo-type = '#'.
- t_compo-name = c_src.
- append t_compo.
- endloop.
- LOOP AT t_compo.
- IF t_compo-incl NE p_src OR t_compo-type NA 'DUKE~#'.
- DELETE t_compo.
- ELSE.
- CLEAR: t_compo-incl, t_compo-class, t_compo-exposure, t_compo-interface.
- t_compo-class = sy-listi = STRLEN( t_compo-name ).
- random_text sy-listi t_compo-incl ' '.
- MODIFY t_compo.
- ENDIF.
- ENDLOOP.
- SORT t_compo BY class DESCENDING. "<- Tenemos las variables protegidas
- LOOP AT t_compo.
- CONCATENATE '\b(' t_compo-name ')\b' INTO sy-lisel.
- CONDENSE sy-lisel NO-GAPS.
- clear l_result.
- if t_compo-type ca '#'.
- CONCATENATE '(''' t_compo-name ''')' INTO sy-lisel.
- CONDENSE sy-lisel NO-GAPS.
- endif.
- REPLACE ALL OCCURRENCES OF REGEX sy-lisel
- IN TABLE t_src WITH t_compo-incl
- IGNORING CASE
- RESULTS l_result.
- if ( t_compo-type ca '#' and l_result-line >= theone ) or
- ( t_compo-type ca 'E~' and l_result-line >= theone ).
- sy-lisel = '(report|program)'.
- find FIRST OCCURRENCE OF REGEX sy-lisel
- in TABLE t_src
- IGNORING CASE
- RESULTS c_match.
- add theone to c_match-line.
- case t_compo-type.
- *--[ Transformamos literales en constantes
- when '#'. CONCATENATE 'CONSTANTS~' t_compo-incl '~type~c~length~' t_compo-class '~value~''' t_compo-name '''' l_point into c_src.
- condense c_src NO-GAPS.
- translate c_src USING '~ '.
- *--[ Transformamos sentencias únicas en macros
- when 'E' or '~'.
- CONCATENATE 'DEFINE' t_compo-INCL l_point t_compo-name l_point 'END-OF-DEFINITION' l_point into c_src SEPARATED BY abap_false.
- endcase.
- insert c_src into t_src INDEX c_match-line.
- endif.
- ENDLOOP.
- PERFORM cmp_sintaxis.
- ENDFORM. "work_vars_forms
- FORM cmp_sintaxis.
- DATA: miword TYPE string,
- linea_error LIKE sy-pagno.
- SYNTAX-CHECK FOR t_src MESSAGE c_src LINE linea_error WORD miword PROGRAM p_src.
- IF sy-subrc >= theone.
- *--[ Hemos fracasado, hay que recargar el programa
- WRITE: / '[Error]', linea_error, c_src, miword.
- PERFORM load_program.
- ENDIF.
- ENDFORM. "cmp_sintaxis
- FORM llena_basura.
- DATA: basura TYPE string,
- con_punto(theone).
- CLEAR con_punto.
- DATA: caracterc TYPE c,
- patron_millas(3).
- caracterc = l_comillas.
- CONCATENATE l_asterisco caracterc l_asterisco INTO patron_millas.
- LOOP AT t_src INTO c_src.
- *++[ Quitamos espacios iniciales
- SHIFT c_src LEFT DELETING LEADING abap_false.
- *++[ Quitamos comentarios.
- IF c_src IS INITIAL.
- DELETE t_src INDEX sy-tabix.
- CONTINUE.
- ENDIF.
- IF c_src+void(theone) = l_asterisco.
- DELETE t_src INDEX sy-tabix.
- CONTINUE.
- ENDIF.
- *++[ Eliminamos comentarios de las comillas que puedan existir
- IF c_src CP patron_millas.
- SEARCH c_src FOR caracterc.
- IF sy-subrc < theone.
- c_src = c_src+void(sy-fdpos).
- ENDIF.
- ENDIF.
- *++[ Comprimimos la línea
- CONDENSE c_src.
- IF con_punto = abap_true.
- CONCATENATE l_point c_src INTO c_src SEPARATED BY abap_false.
- CLEAR con_punto.
- ENDIF.
- sy-listi = STRLEN( c_src ).
- IF sy-listi > 2.
- sy-listi = sy-listi - theone.
- IF c_src+sy-listi(theone) = l_point.
- c_src = c_src+void(sy-listi).
- con_punto = abap_true.
- ENDIF.
- ENDIF.
- *++[ Generamos Ruido
- if p_trash = abap_true.
- sy-listi = 120 - STRLEN( c_src ).
- random_text sy-listi basura abap_true.
- CONCATENATE c_src caracterc basura INTO c_src.
- endif.
- MODIFY t_src FROM c_src.
- AT LAST.
- CONCATENATE l_point abap_false caracterc payload INTO c_src.
- APPEND c_src TO t_src.
- EXIT.
- ENDAT.
- ENDLOOP.
- PERFORM cmp_sintaxis.
- ENDFORM. "llena_basura
Última modificación de la página el 04 November 2015 a las 15h04
Powered by
PmWiki