网络检索有文章提及使用下面这个小工具更改PCCA (PHYSICAL CONFIGURATION COMMUNICATION AREA)中的PCCACPID,可以绕过CPUID检查:
* TO USE THIS PGM, FIRST, CODE A PROC IN SYS1.PROCLIB SPG00090
* SPG00090
* //CHGCPUID PROC SPG00090
* // EXEC PGM=CPUID,PARM='NNNNTTTT' SPG00090
* SPG00090
* THE PARM IS UUP TO EIGHT DIGITS AS FOLLOWS; SPG00090
* SPG00090
* NNNN = LAST FOUR CHARACTERS OF THE DESIRED CPUID SPG00090
* TTTT = CPU TYPE E.G. 9672 (OPTIONAL) SPG00090
* SPG00090
* SPG00090
* NEXT, ASSEMBLE AND LINK INTO AN AUTHORIZED, LINKLISTED LIB SPG00090
* WHICH WILL ALWAYS BE ON TEST SYSTEM (SUCH AS SYS1.CMDLIB) SPG00090
* SPG00090
* IN SYS1.PARMLIB MEMBER(IEACMD00) AFTER S LLA STMT SPG00090
* CODE START CHGCPUID,SUB=MSTR SPG00090
*
* FROM A SYSTEM CONSOLE, AFTER CHGCPUID ENDS, ISSUE COMMAND
* D M=CPU AND NOTE THAT ALL CPUIDS SHOW 9672 AS MODEL
*
*********************************************************************** SPG01350
* SPG01360
CPUID CSECT 0 SPG01370
CPUID AMODE 31 SPG01370
CPUID RMODE 24 SPG01370
PGMIN EQUATES=YES,USING=(R13) STANDARD HOUSEKEEPING
GETAUTH TYPE=GET ENSURE WE ARE AUTHORISED
GOSUB PARMPROC TEST PARM VALUE
LTR R15,R15 WAS PARM VALID?
BNZ ERROR NO, GIVE UP
MODESET KEY=ZERO * KEY ZERO SPG03340
L R3,16 * ADDRESS CVT
USING CVT,R3
L R2,CVTPCCAT * --> PCCA VECTOR TABLE (CVT+2FC)
USING PCCAVT,R2
LA R6,PCCAT00P * --> PCCA FOR CPU 0
DROP R2
LA R7,16 * LOOP CTR ( MAX OF 16 CPUS)
L R1,PARMADDR REFRESH PARM ADDRESS
L R2,PARMLGTH GET PARM LENGTH 00071400
BCTR R2,0 DECREMENT FOR EXECUTE 00071700
SPACE 1 00070800
LOOP DS 0H
ICM R3,15,0(R6) * --> PCCA
BNZ TESTIT * THERE IS ONE
BUMP DS 0H
LA R6,4(R6) * TO NEXT PCCA ADDRESS
BCT R7,LOOP * LOOP TILL DONE
B FINISHED * THEN QUIT
*
TESTIT DS 0H
USING PCCA,R3
CLC PCCAPCCA,=CL4'PCCA' * MAKE SURE IT IS PCCA
BNE ERROR * PROBLEM SOMEWHERE???
* MVC PCCACPID+8(4),=C'9672' * NEW MODEL NO.
* MVC PCCACPID+4(8),=C'70249021' * NEW CPUID
LA R4,PCCACPID+4 POINT PAST CP & LPAR NO.
EX R2,PARMMOVE COPY PARM TO CPUID
B BUMP * LOOP TILL DONE
DROP R3
*
FINISHED DS 0H
WTO 'CPU IDS HAVE BEEN CHANGED '
B EXIT
*
ERROR DS 0H
WTO 'ERROR IN PGM CPUID'
*
EXIT DS 0H
MODESET KEY=NZERO USER STATUS SPG03380
PGMOUT , RETURN TO CALLER
EJECT , 00070100
******************************************************************* 00070200
* PROCESS PARM FIELD IF SUPPLIED * 00070300
******************************************************************* 00070700
SPACE 1 00070800
PARMPROC DS 0H PROCESS PARM FIELD 00070900
SUBIN SAVE=(R4) SUBROUTINE ENTRY 00071000
SR R15,R15 ASSUME PARM IS GOOD
L R1,0(R1) LOAD ADDRESS OF PARM INTO R1 00071100
ST R1,PARMADDR STORE ADDRESS OF PARM INFO'S 00071200
LH R2,0(R1) GET ADDRESS OF PARM INFO'S 00071300
ST R2,PARMLGTH SAVE PARM LENGTH 00071400
LTR R2,R2 TEST FOR A PARM 00071500
BZ PARMBAD NONE, ERROR 00071600
C R2,=A(8) TEST MAXIMUM LENGTH
BH PARMBAD TOO LONG, ERROR
BCTR R2,0 DECREMENT FOR EXECUTE 00071700
SPACE 1 00071900
PARMLOOP DS 0H TEST PARM VALUES 00072000
EX R2,PARMCLC TEST FOR NUMERIC 00072100
BH PARMDONE OK, USE IT 00072400
* B PARMBAD NO, BAD VALUE 00072200
SPACE 1 00072900
PARMBAD DS 0H PARM FIELD INVALID 00073000
LA R15,8 REMEMBER WE FAILED
PARMDONE DS 0H PARM FIELD PROCESSED 00073000
SUBOUT RESTORE=(R4) RETURN TO CALLER 00073100
TITLE 'DATA AREAS' 00070100
PARMCLC CLC 2(*-*,R1),=CL8'00000000' TEST FOR NUMERIC *EXECUTED* 00073300
PARMMOVE MVC 0(*-*,R4),2(R1) MOVE PARM TO PCCACPID *EXECUTED* 00073300
SPACE 1 00073400
PARMADDR DC A(0) ADDRESS OF PARM FIELD 00073500
PARMLGTH DC A(0) LENGTH OF PARM FIELD 00073600
LTORG ,
* SPG07150
CVT LIST=NO,DSECT=YES
IHAPCCAT DSECT=YES
IHAPCCA DSECT=YES
END