【问题标题】:Deliver to a client an encrypted c code with unencrypted h file向客户提供带有未加密 h 文件的加密 c 代码
【发布时间】:2021-09-03 07:15:50
【问题描述】:

我想知道是否可以向我们的客户提供一个加密的 c 文件和一个未加密的 h 文件,这样客户就可以随意更改 h 文件。我该怎么做?

提前致谢

艾伦·布鲁门斯坦

【问题讨论】:

  • 您是说客户端需要能够构建代码吗?否则,您只需编译到库中并提供二进制文件和标头即可。这是打包非源版本的正常方式。
  • 欢迎来到 StackOverflow!请拨打tour 并阅读“How to Ask”以了解本网站的运作方式。 -- 这似乎是一个X-Y-problem。你真正想达到什么目标?
  • 如果客户端更改.h文件,则编译的C文件将无法使用。
  • 是的,客户端应该可以更改 h 文件。但只是一些定义
  • @alanblu 如果您希望您的客户能够更改某些定义并重新编译整个程序,您可能必须对其进行混淆,或者根据定义生成每个可能的二进制文件,我不没想到还有其他办法

标签: c compilation coding-style


【解决方案1】:

你可以混淆代码:

  /* After C++ Code Obfuscating */

  #include <sys/types.h>
  #include <sys/param.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <ctype.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include "gpsd_config.h"
  #include "bsd-base64.h"
  #define Assert(Cond) if (!(Cond)) abort()
  static const char Base64[]=
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";static
  const char Pad64='=';int b64_ntop(u_char const*src,size_t srclength,char*target
  ,size_t targsize){size_t datalength=0;u_char input[3];u_char output[4];size_t i
  ;while(2<srclength){input[0]=*src++;input[1]=*src++;input[2]=*src++;srclength-=
  3;output[0]=input[0]>>2;output[1]=((input[0]&0x03)<<4)+(input[1]>>4);output[2]=
  ((input[1]&0x0f)<<2)+(input[2]>>6);output[3]=input[2]&0x3f;Assert(output[0]<64)
  ;Assert(output[1]<64);Assert(output[2]<64);Assert(output[3]<64);if(datalength+4
  >targsize)return(-1);target[datalength++]=Base64[output[0]];target[datalength++
  ]=Base64[output[1]];target[datalength++]=Base64[output[2]];target[datalength++]
  =Base64[output[3]];}if(0!=srclength){input[0]=input[1]=input[2]='\0';for(i=0;i<
  srclength;i++)input[i]=*src++;output[0]=input[0]>>2;output[1]=((input[0]&0x03)
  <<4)+(input[1]>>4);output[2]=((input[1]&0x0f)<<2)+(input[2]>>6);Assert(output[0
  ]<64);Assert(output[1]<64);Assert(output[2]<64);if(datalength+4>targsize)return
  (-1);target[datalength++]=Base64[output[0]];target[datalength++]=Base64[output[
  1]];if(srclength==1)target[datalength++]=Pad64;else target[datalength++]=Base64
  [output[2]];target[datalength++]=Pad64;}if(datalength>=targsize)return(-1);
  target[datalength]='\0';return(datalength);}int b64_pton(char const*src,u_char*
  target,size_t targsize){size_t tarindex;int state,ch;char*pos;state=0;tarindex=
  0;while((ch=*src++)!='\0'){if(isspace(ch))continue;if(ch==Pad64)break;if((pos=
  strchr(Base64,ch))==NULL)return(-1);switch(state){case 0:if(target){if(tarindex
  >=targsize)return(-1);target[tarindex]=(pos-Base64)<<2;}state=1;break;case 1:if
  (target){if(tarindex+1>=targsize)return(-1);target[tarindex]|=(pos-Base64)>>4;
  target[tarindex+1]=((pos-Base64)&0x0f)<<4;}tarindex++;state=2;break;case 2:if(
  target){if(tarindex+1>=targsize)return(-1);target[tarindex]|=(pos-Base64)>>2;
  target[tarindex+1]=((pos-Base64)&0x03)<<6;}tarindex++;state=3;break;case 3:if(
  target){if(tarindex>=targsize)return(-1);target[tarindex]|=(pos-Base64);}
  tarindex++;state=0;break;}}if(ch==Pad64){ch=*src++;switch(state){case 0:case 1:
  return(-1);case 2:for(;ch!='\0';ch=*src++)if(!isspace(ch))break;if(ch!=Pad64)
  return(-1);ch=*src++;case 3:for(;ch!='\0';ch=*src++)if(!isspace(ch))return(-1);
  if(target!=0&&target[tarindex]!=0)return(-1);}}else{if(state!=0)return(-1);}
  return(tarindex);}

或

 #include <stdio.h>
  #include <stdlib.h>
  int main(int a,char**A){FILE*B;typedef unsigned long C;C b[8];if(!(a==7&&(B=
  fopen(1[A],"rb"))))return 1;for(7[b]=0;7[b]<5;7[b]++)b[7[b]]=strtoul(A[2+7[b]],
  0,16-!7[b]*6);5[b]=3[b];while((6[b]=getc(B))!=(C)-1){if(2[b])for(7[b]=0;7[b]<4;
  7[b]++)if(((6[b]>>7[b])^(6[b]>>(7-7[b])))&1)6[b]^=(1<<7[b])^(1<<(7-7[b]));5[b]
  ^=6[b]<<(0[b]-8);for(7[b]=0;7[b]<8;7[b]++)if((5[b]>>(0[b]-1))&1)5[b]=(5[b]<<1)^
  1[b];else 5[b]<<=1;}5[b]&=((((C)1<<(0[b]-1))-1)<<1)|1;if(2[b])for(7[b]=0;7[b]<(
  0[b]>>1);7[b]++)if(((5[b]>>7[b])^(5[b]>>(0[b]-1-7[b])))&1)5[b]^=((C)1<<7[b])^((
  C)1<<(0[b]-1-7[b]));5[b]^=4[b];fclose(B);printf("%0*lX\n",(int)(0[b]+3)>>2,5[b]
  );return 0;}

但是,如果我是您的客户并且看到提供此类资源,我会开始寻找另一个承包商。

【讨论】:

  • 我可以考虑它,但我认为它对我来说真的没有用,即使我在哈哈之后仍然可以使用它。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2019-01-13
  • 2010-10-23
  • 1970-01-01
  • 2019-04-06
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多