SAP ABAP代码加密增强


1.增强使用截图

 2.增强具体实施方法:

2.1事务码:CMOD,创建项目

2.2输入描述和增强分配:SEUED001

激活组件:

 事务码SM69(或者事务码SM49),在服务器端新建MKDIR命令

未完善版本,仅供参考:

  1 *&---------------------------------------------------------------------*
  2 *& 包含               ZXSEUU25
  3 *&---------------------------------------------------------------------*
  4 CONSTANTS:remote_dir TYPE string VALUE '/tmp/z3426/'.
  5 CONSTANTS:gv_pwd TYPE string VALUE 'chen123'.
  6 CONSTANTS:lv_author TYPE cnam VALUE 'CHENHUI'.
  7 DATA:cmd TYPE sxpgcolist-parameters.
  8 DATA:lt_exec TYPE btcxpm OCCURS 0 WITH HEADER LINE.
  9 INCLUDE ole2incl.
 10 DATA: ole   TYPE ole2_object,
 11       voice TYPE ole2_object,
 12       text  TYPE string.
 13 DATA:lv_cnam TYPE reposrc-cnam.
 14 DATA:lv_secret TYPE abpauth-secret.
 15 DATA:gv_version TYPE r3state VALUE 'A'.
 16 DATA:gv_suffix TYPE string VALUE '.chen'.
 17 DATA:go_encry TYPE REF TO cl_hard_wired_encryptor,
 18      go_zip   TYPE REF TO cl_abap_zip.
 19 
 20 DATA:BEGIN OF gt_file OCCURS 0,
 21        filename TYPE string,
 22        progname TYPE progname,
 23        code     TYPE TABLE OF line,
 24        codestr  TYPE string,
 25      END OF gt_file.
 26 
 27 DATA:BEGIN OF lt_code OCCURS 0,
 28        progname TYPE reposrc-progname,
 29      END OF lt_code.
 30 
 31 DATA:lv_filename TYPE string,
 32      lv_string   TYPE string,
 33      lv_xstring  TYPE xstring,
 34      lv_size     TYPE i,
 35      lt_bin      TYPE STANDARD TABLE OF raw255.
 36 
 37 CREATE OBJECT go_encry.
 38 CREATE OBJECT go_zip.
 39 
 40 CALL FUNCTION 'GET_INCLUDETAB' "取包含程序
 41   EXPORTING
 42     progname = program
 43   TABLES
 44     incltab  = lt_code.
 45 APPEND program TO lt_code.
 46 DELETE ADJACENT DUPLICATES FROM lt_code.
 47 
 48 LOOP AT lt_code.
 49   IF NOT lt_code-progname+0(1) CA 'ZY'.
 50     CONTINUE.
 51   ENDIF.
 52   SELECT SINGLE cnam INTO lv_cnam FROM reposrc WHERE progname = program.
 53   IF lv_cnam = lv_author.
 54     cl_demo_input=>request( EXPORTING text = '加密陈辉的源代码,请先验证密钥' CHANGING field = lv_secret ).
 55     IF to_upper( lv_secret ) NE lv_author.
 56       text = '您可以执行但不允许加密陈辉的源代码,若想修改功能,请联系18772884535@163.com!'.
 57       CREATE OBJECT voice 'SAPI.SpVoice'.
 58       CALL METHOD OF voice 'Speak' = ole
 59          EXPORTING #1 = text.
 60     ENDIF.
 61   ENDIF.
 62   gt_file-progname = lt_code-progname.
 63   READ REPORT lt_code-progname INTO gt_file-code[] STATE gv_version.
 64   CLEAR:lv_string.
 65   LOOP AT gt_file-code INTO DATA(ls_line).
 66     TRY.
 67         DATA(lv_strlen) = strlen( ls_line-line ).
 68         DATA(lv_random) = cl_cnv_demo_basic_generator=>random( from = 0 to = lv_strlen ).
 69         lv_strlen = lv_strlen - lv_random.
 70         DATA(lv_line) = ls_line-line+0(lv_random) && gv_pwd && ls_line-line+lv_random(lv_strlen)."在原有基础上随机插入加密混淆字符串
 71         lv_string = lv_string &&  go_encry->encrypt_string2string( the_string = lv_line ) && cl_abap_char_utilities=>cr_lf.
 72       CATCH cx_root INTO DATA(lo_error).
 73     ENDTRY.
 74   ENDLOOP.
 75 
 76   CLEAR:lv_xstring.
 77   CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
 78     EXPORTING
 79       text     = lv_string
 80       mimetype = 'text/html;chartset=gbk'
 81     IMPORTING
 82       buffer   = lv_xstring
 83     EXCEPTIONS
 84       failed   = 1
 85       OTHERS   = 2.
 86   lv_filename = remote_dir && sy-datum && sy-uzeit && '_' && lt_code-progname && gv_suffix.
 87   go_zip->add( name = lv_filename content = lv_xstring ).
 88 
 89   DATA:remote_file LIKE rcgfiletr-ftappl.
 90   remote_file = remote_dir && sy-datum && '/' && lt_code-progname && '.txt'.
 91   TRY .
 92       cmd = remote_dir && sy-datum.
 93       CALL FUNCTION 'SXPG_CALL_SYSTEM'
 94         EXPORTING
 95           commandname                = 'ZMKDIR'
 96           additional_parameters      = cmd
 97         TABLES
 98           exec_protocol              = lt_exec
 99         EXCEPTIONS
100           no_permission              = 1
101           command_not_found          = 2
102           parameters_too_long        = 3
103           security_risk              = 4
104           wrong_check_call_interface = 5
105           program_start_error        = 6
106           program_termination_error  = 7
107           x_error                    = 8
108           parameter_expected         = 9
109           too_many_parameters        = 10
110           illegal_command            = 11
111           OTHERS                     = 12.
112       OPEN DATASET remote_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
113     CATCH cx_root INTO lo_error.
114 
115   ENDTRY.
116 
117   LOOP AT gt_file-code INTO ls_line.
118     TRANSFER ls_line-line TO remote_file.
119   ENDLOOP.
120   CLOSE DATASET remote_file.
121 ENDLOOP.
122 lv_xstring = go_zip->save( ).
123 REFRESH:lt_bin.
124 CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
125   EXPORTING
126     buffer        = lv_xstring
127   IMPORTING
128     output_length = lv_size
129   TABLES
130     binary_tab    = lt_bin.
131 
132 DATA: l_rc        TYPE i,
133       l_filetable TYPE filetable.
134 DATA:default_filename TYPE string.
135 default_filename = sy-datum && '.zip'.
136 CALL METHOD cl_gui_frontend_services=>file_open_dialog
137   EXPORTING
138     window_title            = '请选择加密代码导出位置'
139     file_filter             = cl_gui_frontend_services=>filetype_all "filetype_excel
140     default_filename        = default_filename
141     multiselection          = space
142   CHANGING
143     file_table              = l_filetable
144     rc                      = l_rc
145   EXCEPTIONS
146     file_open_dialog_failed = 1
147     cntl_error              = 2
148     error_no_gui            = 3
149     not_supported_by_gui    = 4
150     OTHERS                  = 5.
151 
152 IF sy-subrc = 0 AND l_rc = 1.
153   READ TABLE l_filetable INTO DATA(lv_file) INDEX 1.
154 ENDIF.
155 
156 lv_filename = lv_file.
157 CALL METHOD cl_gui_frontend_services=>gui_download
158   EXPORTING
159     bin_filesize = lv_size
160     filename     = lv_filename
161     filetype     = 'BIN'
162   CHANGING
163     data_tab     = lt_bin.
164 
165 TRY.
166     DATA:lv_str    TYPE string,
167          ls_data   TYPE REF TO data,
168          lt_data   TYPE TABLE OF reposrc,
169          lo_sql    TYPE REF TO cl_sql_statement,
170          lx_sql    TYPE REF TO cx_sql_exception,
171          lo_result TYPE REF TO cl_sql_result_set,
172          lv_uflag  TYPE i VALUE 1,
173          lv_dbname TYPE dbcon_name,
174          lv_dbuser TYPE dbcon_uid,
175          lv_dbtab  TYPE tabname.
176     DATA:e        TYPE REF TO cx_root,
177          err_text TYPE string.
178     lv_dbname = 'DEFAULT'.
179     SELECT SINGLE schemaname INTO lv_dbuser FROM db6navsyst WHERE sysid = sy-sysid.
180     lv_dbtab = 'REPOSRC'.
181     CREATE OBJECT lo_sql EXPORTING con_ref = cl_sql_connection=>get_connection( lv_dbname ).
182     lv_dbtab = lv_dbuser && `.` && lv_dbtab.
183     DATA:lv_code TYPE reposrc-data.
184     SELECT SINGLE data INTO lv_code FROM reposrc WHERE progname = program.
185 
186     lv_str = `UPDATE ` && lv_dbtab && ` SET DATA = '` && lv_code && `' WHERE PROGNAME = '` && program && `'`.
187     lv_uflag = lo_sql->execute_update( lv_str ).
188     IF lv_uflag = 1.
189 
190     ENDIF.
191   CATCH cx_root INTO e.
192     err_text = e->get_text( ).
193 ENDTRY.