- 论坛徽章:
- 0
|
测试1:
PGMA:
*Get random function
DJava_Random Pr 8F
D Extproc(*Java:
D 'java.lang.Math':
D 'random')
D Static
Ds_52S52 S 52S52
Df_8F S 8F
Din_Ptr1 S *
/Free
// call java function
f_8F = Java_random();
s_52S52 = f_8F ; //记录下s_52S52的值
in_Ptr1 = %Addr(s_52S52) ; // Debug程序至此时,记录下in_Ptr1的地址值例如:C33E1565CB002703
Dsply s_52S52 ;
*Inlr = *On ;
Return ;
/End-Free
PGMB:
*
DDs_Ds Ds
Dc_A30 30A
Ds_30S0 30S 0 OverLay(c_A30)
DDs_Ds_1 Ds
Dc_A52_1 52A Inz
Ds_52S52_1 52S52 OverLay(c_A52_1)
Dc_A52_3 S 52A Based(in_Ptr3)
Dc_str S 1A Inz
Dc_Flag S 1A
Dc_Par1 S 30A
Din_Ptr1 S * Inz(*Null)
Din_ptr2 S * Inz(*Null)
Din_ptr3 S * Inz(*Null)
C *Entry PList
C Parm c_Flag
C Parm c_Par1
/Free
// Get pgm Addr
in_Ptr1 = %Addr(c_Str) ; // 第一次CALL PGMB,记录下in_Ptr1的地址值例如:C33E1565CB064148
If c_Flag = '' ; //第一次调用仅获取地址,不执行其他逻辑
*Inlr =*On ;
Retrurn ;
EndIf ;
in_Ptr2 = in_Ptr1 ; // Backup
c_A30 = c_Par1 ;
If c_Flag = '1' ; //正负转换
s_30S0 = 0-s_30S0 ;
EndIf ;
// Move Pointer
in_Ptr3 = in_Ptr2 - s_S30S0 ;
// Dsply c_A52_3
// Get PgmA Value
c_A52_1 = %Str(in_Ptr3:52) ; // 第二次CALL PGMB时 ,s_52S52_1的值为PGMA.s_52S52
Dsply s_52S52_1 ;
*Inlr =*On ;
Retrurn ;
/End-Free
测试步骤:
1)Debug PGMA ,记录下PGMA的in_Ptr1的地址。
2)Call PGMB ('' '000000000000000000000000000000‘)Debug PGMB,记录下PGMB的in_Ptr1的地址。
3)计算PGMB的in_Ptr1的地址与PGMA的in_Ptr1的地址的差值,比如例子中为61A45(399941)=C33E1565CB064148-C33E1565CB002703
4)重新CALL PGMB ('0' '000000000000000000000000399941‘)
结果:第二次CALL PGMB时 ,s_52S52_1的值为PGMA.s_52S52
测试2
PGM1
Dc_Str S 1A
DlyJOB 10秒
循环判断c_Str否为指定值'A'
DlyJOB 10秒
结束循环
PGM2
Din_Ptr S *
通过特殊方式设置in_Ptr指向c_Str的内存地址。
通过%Str(in_Ptr:1) = 'A'来修改内存的值
结果:即通过PGM2的的指针移动,可以执行PGM1的运行中的变量的内存区域,并修改该内存区域值,来达到修改PGM1的运行逻辑的效果。
以上测试必须在同一个Session,且PGMA与PGMB程序运行时间差不大情况下才有效果。
以上测试能证实一些东西:
1)程序运行结束后,所分配的内存并不会立即清空,只要未被重新分配使用,内存区域的值仍然存在,即可通过指针的移动获取到先前程序的运行数据。
2)程序启动时,变量对应内存区域如不通过%ALLOC或%REALLOC函数重新分分配,在短期内重复调用时,分配时是始终是同一块内存区域,即PGMA在第一调用时,变量A的内存地址是FFFF,如程序内无重新分配内存地址操作,则再程序结束后,后续短期内重复调用时,内存地址是固定的(这也就是第一个测试能做的原因之一)
3)程序内指针的移动应该是有范围限制(MSG:MCH0601),可能与激活组有关。
以上内容仅根据结果的推论,具体缘由望大神们指教。
|
|