信捷PLC的C语言函数功能块,编译时编程软件时会自动嵌入操作权限的指令,以防止用户程序越权访问某些功能。
如果不希望出现这些指令,可以用C语言的预处理机制绕过,原理很简单:
1、因编程软件检测是否存在特定签名的函数,可用条件为否的预处理指令包含所需函数;
2、因编程软件对所有特定签名的函数都进行处理,可用预处理宏替换函数名称。
如果绕过了权限机制的保护,请自行确保所写代码对系统的安全风险。
以下为示例代码:
源程序(普通写法): void T_QINC ( WORD W , BIT B ) { (*(uint64_t*)W)++; } 处理后: void T_QINC ( WORD W, BIT B ) { //以下5条汇编指令用于清除CONTROL寄存器的特权位 asm("PUSH {R0}"); asm("MRS R0,CONTROL"); asm("ORR R0,R0,#0x1"); asm("MSR CONTROL,R0"); asm("POP {R0}"); //begin user code (*(uint64_t*)W)++; //end user code //以下汇编指令用于获取特权 asm("svc 0x01"); } //--------------- 源程序(绕过特权): #if 0 void T_QINC ( WORD W, BIT B ) {} #endif #define MAIN T_QINC void MAIN ( WORD W , BIT B ) { (*(uint64_t*)W)++; } 处理后: void T_QINC ( INT16S * W , INT32U B ) { //begin user code (*(uint64_t*)W)++; //end user code }