create or replace function get_rowid wrapped 0 abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd 3 8 9200000 ----------解密方式--------
一、加密方式9200000代表的是oracle的版本,也就是9.2,但是在数据库中存储的确实是9200000的十进制形式,上篇文章中的图片已证明。
二、版本上一行的8标识的是加密的数据类型:
7-Procedure
8-Function
9-Package
b-Package Body
解密样本有限,暂时只列出这么多。
三、每个代码块都有代码长度,后面有个未知标记,应该为size of byte,推测应该是每个数据的最大字节数,比如2标识,下面的每个数据最大值都不超过2个byte。还有6个代码段,只转换了4个,每个代码段的意义将在下面说,这里说一下转换规则。仔细研究的人可能发现了,所有代码段的开头数据都是0,这就相当于编程语言中大部分数组的索引都是0一样,所以转换的时候都进行了忽略,直接跳过,从下一个索引进行转换的。
四、上文提到过代码块中冒号开头的数据,只是说了如何处理,搜索了一下,比较正式的说法是: RLE全称(run-length encoding),翻译为游程编码,又译行程长度编码,又称变动长度编码法(run coding) ,还有叫做行程长度编码压缩算法 。
结束补充内容,说一下4个转换表的大致作用。下面tab1代表第一个转换表,一共4个转换表。
tab1存储了文件的组成结构,比如B5表示global block end。
tab2存储的是tab1中数据的索引。
tab3存储的就是数据。
tab4存储的是参数,比如一个函数或者存储过程的in和out参数。
大致流程:
tab1中取出结构类型,根据tab2的索引,去tab3中取出数据。如果解析到的类型是参数,就去tab4进行查找处理。
假设tab1中10000001为aa,然后查找对应tab2的20000001的数据(tab1和tab2的长度是相等的,也是一一对应的)。比如tab2取出的数据是4,则从tab3中30000004开始取数据,根据类型取相应个数数据。tab3的长度要比tab1和tab2长很多,30000000+tab2的数据=数据起始位置。
以上就是tab1查找对应数据的过程。明白过程之后,tab2和tab3可以隐藏掉,简化过程,便于理解:
tab1----------(中间过程隐藏)--------->数据
隐藏过程后就是递归解析流程了,比如tab1中的68,代表的结构意思为declare procedure/function,它取出的数据为1 3 E 12,这些作为id再去tab1取出结构解析,
ID对应结构,id计算好为10000001,10000003,10000014,10000018,对应为
1->9A 3->55 E->11 12->17
再将结构进行解析,如此递归。
原文链接:https://www.f2er.com/oracle/209734.html