*"~. 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