How to Hide ABAP Code
Google今日凌晨宣布Google.cn服务退出中国大陆,想起前段时间自己的网站无缘无故访问不了,不由得心生感慨。自己的网站跟政治一点不沾边,不知咋地就访问不了,好在青爷大力帮助下,才得以重见天日。总想写点东西来纪念一下,顺便庆祝一下(看,我等小P民是多么容易满足啊),写什么好呢,内心感慨很多,但还是别写出来了,惹不起,总躲得起吧。这两天正好在研究如何Hide ABAP Code,干脆就写篇彻彻底底的技术文章出来跟大家分享吧。
很多时候,为了保护自己的ABAP程序,我们都希望它们在客户环境里不可见,也不可编辑,但是可以正常运行。这个时候我们就需要隐藏ABAP程序。目前常见的方法有两种,一种是在程序的第一行添加特殊字符,另外一种在数据库里更改程序的名字。两种方法各有优缺点,接下来我就详细介绍一下这两种方法。
方法一:在程序的第一行添加一行特殊字符*@#@@[SAP]。
网上的很多资料介绍说这种方法只能用于SAP 4.0以下的版本,但经过我的测试,目前最新版本都可以正常工作。这种方法简单,但想要Rollback回来就不那么容易。目前好像没有一种行之有效的办法,我们的做法是重新导入原始程序,覆盖改动后的。但话说回来,相对于第二种办法,用这种办法Hide Code也是最彻底的,因为客户没法用别的办法来破解。下面给一个动态Hide ABAP Code的例子。
Data: abap_temps(72) TYPE C OCCURS 0 WITH HEADER LINE.
*Iterate all the ABAP programe that need to be hiden
LOOP AT abaps.
REFRESH abap_temps.
* Read the ABAP program and save the content into the abap_temps internal table
READ REPORT abaps INTO abap_temps.
* Insert *@#@@[SAP] at the first line of abap_temps
INSERT ‘*@#@@[SAP]‘ INTO abap_temps INDEX 1.
* Save the content of abap_temps into ABAP program
INSERT REPORT abaps FROM abap_temps STATE ‘A’.
ENDLOOP.
方法二:在DD01S数据库表里更新ABAP程序的名字,比如原先的程序名字是ztest,通过EXEC命令执行SQL语句把名字改成&test,这样程序就被Hiden了。
这种方法想要Rollback就非常容易,逆向操作就行了。相比第一种方法而言,这种方法比较容易被客户破解,因为只要执行相应的SQL语句就可以搞定了。不过要注意的是,DD01S表在6.0以上的版本就没有了,所以这种方法在6.0以上的版本不适用。我们的系统没有6.0以下的版本,所以就没法测试。我从网上找了个例子,仅供大家参考。
* Check if it is already hidden
data: f5(30).
EXEC SQL.
SELECT PROG INTO :F5 FROM D010S WHERE PROG = :NEW_NAME
ENDEXEC.
if f5 is initial.
* There is no such hidden program, hide it
EXEC SQL.
UPDATE D010S SET PROG = :NEW_NAME WHERE PROG = :PROGRAM
ENDEXEC.
concatenate ‘Program’ :program ‘was hidden.’
into message separated by space.
else.
* There is already a hidden program there, unhide it
EXEC SQL.
UPDATE D010S SET PROG = :PROGRAM WHERE PROG = :NEW_NAME
ENDEXEC.