信捷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
本站仅提供信息发布平台,文章仅代表作者个人观点。