C/C++代码求告知如何c 修改密码代码

关于如何将C++程序转换为C程序的探讨
> 关于如何将C++程序转换为C程序的探讨
关于如何将C++程序转换为C程序的探讨
编辑:1027
  [摘要]C++是在C的基础上演变而来的,在我们的实际应用中用C++编的源程序就一定比用C编的源程序可行吗?不尽然,因为C++解释器比C语言解释器占用的存储空间要大。在嵌入式系统中为了节省有限的存储空间,降低成本,将用C++语言写的源程序转换成C语言源程序是很有必要的。
  [关键词]C++ 程序 C程序 转换探讨
  一、C++与C程序概述
  C++是在C的基础上演变而来的,C++与C区别最大的就是C++中的类的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。方法有两种:第一种是将C++中的面向对象特征去掉,先全部理解源代码的逻辑,然后改写;第二种是在C中保留面向对象的部分特征,用结构体实现类的功能。第一种方法,对于类的数目很少的情况还可以,如果类的数目比较多,全部理解源代码,然后重写就很耗时间,而且很容易出错,更甚者,如果遇到大的项目想全部理解源代码几乎是不可能的。这个时候就需要采用第二种方法了,你可以一个类一个类的改没有什么太高的难度,如果没有笔误的话,几乎不会出错,而且根本不需要理解程序逻辑,也许改完后你对程序所要实现的功能还一无所知。这倒不是说一无所知对大家有好处,只是说这种方法的与程序逻辑本身的无关性。所以,在此用第二种方法对C++的一些特性,以及如何在C里实现或者替代,作一些初步的探讨。
  二、C++程序到C程序的转换
  为了便于下面的讨论先做几点说明:
  1.函数Ixx为类xx的构造函数的实现。
  2.原类的成员函数改为前缀为 结构体名+&_&的函数。
  3.函数指针U为原类的析构函数的声明;
  4.U+结构体名称 为原类的析构函数的实现;
  5.Fun_+结构体名 为对该结构体成员函数指针进行指向。
  以后遇到上述情况将不再说明。
  (一)类的成员函数和数据成员
  由于struct没有对成员的访问权限进行控制,必须加入额外的机制进行访问控制,这样一来就使得程序复杂化了,所以只能放弃访问权限的控制。
  1.对于类的数据成员可以直接转为C中结构体的数据成员。
  2.函数则需转化为对应的函数指针,因为struct里不允许出现函数的声明和定义。而函数前如果有virture,inline等修饰符也要去掉,如函数void funca(int a);改为void (*funca)(struct B *p,int a);大家可以看到函数指针的原型里加了一个指针struct B的指针,这是因为要在函数内部对类的成员进行操作,要靠该指针指定结构体的成员。在类的成员函数里,实际上在参数列里也隐含有一个指向自身的this指针。
  3.对于静态成员则要定义成全局变量或全局函数,因为结构体中不能有静态成员。
  (二)类的构造函数
  类在实例化的时候会调用类的缺省构造函数,在struct里,要定义一个同名函数指针指向一个具有构造函数功能的初始化函数,与构造函数不同的是,要在初始化函数里加入进行函数指针初始化的语句。使用的时候在创建结构体变量的时候要用malloc而不是new,并且这个时候要手工调用初始化函数。
  (三)类的析构函数
  类的析构函数所作的工作是释放所占的资源。
  在C中,无论是哪个struct都用函数指针U替代析构函数。之所以所有的struct都用指针U是基于如下情况:
  如果将子类指针赋给基类指针,基类指针在释放的时候不必考虑调用哪个函数名的析构函数,只需调用成员函数U即可。成员函数U需要像一般成员函数一样在fun_类名()函数中指定。?
  类的析构函数是由系统调用的,在C中则要显式调用。至于何时调用,要准确判断。
  (四)类的拷贝构造函数
  类的拷贝构造函数主要用途是加快以下情况下类的构建速度:
  1.作为参数传给函数。(additem(Itema))
  2.作为函数返回值。
  3.实例化类时作参数。
  这三种情况下都是由系统直接调用类的拷贝构造函数而不是构造函数。
  注意:C=D;不会调用拷贝构造函数,这种情况下使用的是重载&=&运算符的方法。(详见运算符重载);
  由于C中定义struct变量的时候,使用的全部是指针,不会用到拷贝构造函数,所以暂不考虑。对于原来函数参数或者返回值需要类变量的,要全部转化为类指针的方式。实例化类时作参数的情况,可以通过另外定义一个带参数的构造函数来解决。
  (五)类的内联函数和虚函数
  内联函数和虚函数的修饰符inline 、virture 要全部去掉。内联函数体则要去掉,将内联函数在外面定义成一个函数。如:
  class B
  virture void funb();
  inline int add()const
  {return a+b;};
  private:
  改为:
  typedef classB B;
  struct classB
  void (*funb)(struct classB *p);
  int (*add)(struct classB *p);
  void classB_funb(B *p)
  int classB_add(B *p)
  return p-&a+p-&b;
  void fun_classB(B *p)
  p-&funb=classB_
  p-&add= classB_
  (六)重载
  类中重载有函数重载和运算符重载两种:
  1.函数的重载
  函数重载满足的条件是:函数名相同,参数个数或者参数类型不同。这样在调用的时候,会根据你输入的参数不同,调用不同的函数。在C中只好分别起不同的名字,没有别的解决办法。
下页更精彩:1
关于如何将C++程序转换为C程序的探讨相关推荐orbit怎么用 用C/C++实现代码的动态修改(SMC)
&&作者:星轨(oRbIt)&E_Mail&:&&&摘要:所谓SMC(Self Modifying Code)技术,就是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具(比如一些常见的反汇编工具)对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解密,从而正常运行程序和访问数据。[WWw.niubB.nET]计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。由于该技术需要直接读写对内存中的机器码,所以多采用汇编语言实现,这使得很多想在自己的程序中使用SMC技术进行软件加密的C/C++程序员望而却步。针对这种现状,本文提出了几种基于C/C++语言的机器指令定位方法,从而用C/C++语言实现了动态代码修改技术。关键词:SMC 动态代码修改 软件加密&一、什么是SMC技术&&&所谓SMC(Self Modifying Code)技术,就是一种将可执行文件中的代码或数据进行加密,防止别人使用逆向工程工具(比如一些常见的反汇编工具)对程序进行静态分析的方法,只有程序运行时才对代码和数据进行解密,从而正常运行程序和访问数据。计算机病毒通常也会采用SMC技术动态修改内存中的可执行代码来达到变形或对代码加密的目的,从而躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。现在,很多加密软件(或者称为&壳&程序)为了防止Cracker(破解者)跟踪自己的代码,也采用了动态代码修改技术对自身代码进行保护。以下的伪代码演示了一种SMC技术的典型应用:proc main:............IF .运行条件满足&CALL DecryptProc (Address of MyProc);对某个函数代码解密&........&CALL MyProc&&&&&&&&&&&&&&&&&&&&&&&&&&;调用这个函数&........&CALL EncryptProc (Address of MyProc);再对代码进行加密,防止程序被Dump......end main&&&在自己的软件中使用SMC(代码自修改)技术可以极大地提高软件的安全性,保护私有数据和关键功能代码,对防止软件破解也可以起到很好的作用。但是,SMC技术需要直接读写对内存中的机器码,需要对汇编语言和机器码有相当的了解,具体的实现一般都是采用汇编语言。由于汇编语言晦涩难懂,不容易掌握,这使得很多想在自己的程序中使用SMC技术进行软件加密的C/C++程序员望而却步。难道只能用汇编语言实现SMC技术?其实不然,从理论上讲,只要支持指针变量和内存直接访问,象C/C++这样的高级语言一样可以使用SMC技术。本文就是利用C/C++语言的一些特性,比如函数地址和变量地址直接访问等特性,实现了几种对运行中的代码和数据进行动态加密和解密的方法。首先是利用Windows可执行文件的结构特性,实现了一种对整个代码段进行动态加密解密的方法;接着又利用C/C++语言中函数名称就是函数地址的特性,实现了一种对函数整体进行加密解密的方法;最后采用在代码中插入特征代码序列,通过查找匹配特征代码序列定位代码的方式,实现了一种对任意代码片断进行解密解密的方法。下面就分别介绍这几种方法。二、对整个代码段使用SMC方式加密解密&&&在程序中使用SMC最简单的方法就是修改(或加密)整个数据段或代码段,这里首先要讲一下&段&的概念。这个&段&有两层含义,第一层含义是程序在内存中的分布,老的16位操作系统对内存使用分段映射的方式,使用不同的段分别存放代码、数据和堆栈,使用专用的基址寄存器访问这些段,于是就有了代码段、数据段和堆栈段等等区分。随着32位Windows的兴起,一种新的32位平坦(Flat)内存模式被引入Windows内存管理机制,在平坦模式下对段的区分已经没有意义了,但是段的概念依然被保留下来,这些同名的基址寄存器现在被成为&段选择器&,只是它们的作用和普通的寄存器已经没有区别了。段的另一层含义是指保存在磁盘上的Windows可执行文件中的数据结构(就是PE文件中的Section),是Windows在装载这个可执行文件时对代码和数据定位的参考。不过要真正理解段的概念,还需要了解Windows 可执行文件的结构和Windows将可执行文件加载到内存中的方式。&&&Microsoft为它的32位Windows系统设计了一种全新的可执行文件格式,被成为&Portable Executable&,也就是PE格式,PE格式的可执行文件适用于包括Windows 9X、Windows NT、Windows 2000、Windows XP以及Windows 2003在内的所有32位操作系统,估计以后的Windows新版本也将继续支持PE格式。PE文件格式将文件数据组织成一个线性的数据结构,图2-1展示了一个标准PE文件的映象结构:位于文件最开始部位的是一个MS-DOS头部和一段DOS stub代码,在PE文件中保留这一部分是为了DOS和Windows系统共存那一段时期设计的,当程序运行在DOS系统时,DOS系统按照DOS可执行文件的格式调用DOS stub代码,一个典型的DOS stub代码就是在控制台上输出一行提示:&This program cannot be run in MS-DOS mode&,当然不同的编译器产生的DOS stub代码也各不相同。曾经有一段时间很流行一种既可以在DOS系统上运行,又可以在Windows上运行的程序,其原理就是人为地替换这段DOS stub代码。紧跟在DOS stub代码之后的就是PE文件的内容了,首先是一个PE文件标志,这个标志有4个字节,也就是&PE\0\0&。这之后紧接着PE文件头(PE Header)和可选头部(Optional Header,也可以理解为这个PE文件的一些选项和参数),这两个头结构存放PE文件的很多重要信息,比如文件包含的段(Sections)数、时间戳、装入基址和程序入口点等信息。这些之后是所有的段头部,段头部之后跟随着所有的段实体。PE文件的尾部还可能包含其它一些混杂的信息,包括重分配信息、调试符号表信息、行号信息等等,这些信息并不是一个PE文件必须的部分,比如正常发布的Release版本的程序就没有调试符号表信息和行号信息,所以图2-1 表示的结构图中省略了这些信息。欢迎您转载分享:CC++的代码_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
CC++的代码
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢求高手指点,下面的c代码怎么改为c++风格的啊?求改后的答案代码!谢谢了!_百度知道求大神将这个c++的代码改写为c的,万分感谢_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:477,283贴子:
求大神将这个c++的代码改写为c的,万分感谢收藏
代码如下#include &iostream&#include &cstdlib&
//随机函数#include &ctime&//系统时间#include &pcc32.h&//彩色文本#include &mmsystem.h&#pragma comment(lib, &pcc32_vc6.lib&)#pragma comment(lib,&winmm.lib&)
bool yz(char b[9][10]); //验证子函数,验证每一行,每一列,每一个3x3宫格都是1-9.void main(){PlaySound((char*)&gangqinqu.wav&,NULL,SND_ASYNC|SND_LOOP);char a[9][10]={{&&},{&&},{&&},{&&},{&&},{&&},{&&},{&&},{&&}};int b[81],c[81],q=0,p=0;int k,x;do{setTextColor(14);cout&&&
*^0^*&&&&&欢迎进入数独游戏&&&&&*^0^*\n&;setTextColor(10);cout&&&请选择游戏的难易级别为?(3—高,2—中,1—低):&&&cin&&k;switch(k){int i,j,m,n,case 1:srand((int)time(0));for(gs=0;gs&30;gs++)//随机在已经布满的9x9宫格里,运用随机数,并且以系统时间为参数,随机产生空白字符,{
//低难度的数独,每次产生的空白字符为22个左右,
m=(int)(10*rand()/(RAND_MAX+1.0));n=(int)(10*rand()/(RAND_MAX+1.0));a[m][n]=' ';b[q]=m;//将随机产生的空白字符的坐标分别存在b,c两个数组中.c[p]=n;q++;p++;}b[30]=10,c[30]=10;do{setTextColor(15);cout&&&
9&&&setTextColor(3);cout&&&
__________________&&&cout&&&
‖----------------------------------‖&&&for(i=0;i&3;i++){setTextColor(15);cout&&&&&&(i+1)&&& &;for(j=0;j&9;j++)
//输出不同颜色的题目字符和空白字符.{if(j%3!=0){setTextColor(3);cout&&&| &;for(q=0,p=0;q&31,p&31;q++,p++)
//将随机的空白字符单独表示出来,并且以另一种颜色输出表示.{if(i==b[q]&&j==c[p]){setTextColor(14);cout&&a[i][j];}if(q==30&&p==30)//将剩下的题目字符用另一种颜色输出表示{setTextColor(12);cout&&a[i][j];}}setTextColor(3);cout&&& &;}else{setTextColor(3);cout&&&‖&;for(q=0,p=0;q&31,p&31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);cout&&a[i][j];}if(q==30&&p==30){setTextColor(12);cout&&a[i][j];}}setTextColor(3);cout&&& &;}}setTextColor(3);cout&&&‖&&&}setTextColor(3);cout&&&
‖==================================‖&&&cout&&&
‖==================================‖&&&for(i=3;i&6;i++){setTextColor(15);cout&&&&&&(i+1)&&& &;for(j=0;j&9;j++){if(j%3!=0){setTextColor(3);cout&&&| &;for(q=0,p=0;q&31,p&31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);cout&&a[i][j];}if(q==30&&p==30){setTextColor(12);cout&&a[i][j];}}setTextColor(3);cout&&& &;}else{setTextColor(3);cout&&&‖&;for(q=0,p=0;q&31,p&31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);cout&&a[i][j];}if(q==30&&p==30){setTextColor(12);cout&&a[i][j];}}setTextColor(3);cout&&& &;}}setTextColor(3);cout&&&‖&&&}setTextColor(3);cout&&&
‖==================================‖&&&cout&&&
‖==================================‖&&&for(i=6;i&9;i++){setTextColor(15);cout&&&&&&(i+1)&&& &;for(j=0;j&9;j++){if(j%3!=0){setTextColor(3);cout&&&| &;for(q=0,p=0;q&31,p&31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);cout&&a[i][j];}if(q==30&&p==30){setTextColor(12);cout&&a[i][j];}}setTextColor(3);cout&&& &;}else{setTextColor(3);cout&&&‖&;for(q=0,p=0;q&31,p&31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);cout&&a[i][j];}if(q==30&&p==30){setTextColor(12);cout&&a[i][j];}}setTextColor(3);cout&&& &;}}setTextColor(3);cout&&&‖&&&}setTextColor(3);cout&&&
‖----------------------------------‖&&&cout&&&
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄&&&//if(yz(a)==true)setTextColor(10);cout&&&请输入要输入数字的坐标,以及要填入的数字(先行后列):&&&//输入每次要输入的数字.cin&&m&&n;for(q=0,p=0;q&31,p&31;q++,p++)
//判断所输入坐标是否应填的字符,若是,则输入所要输入的数字,若不是,则报错误,并且重新输入.{if(m-1==b[q]&&n-1==c[p]){cin&&a[m-1][n-1];}
c语言,达内上市公司出品,0元试学,不就业免费重修;c语言,先就业后付款,80天从0到精通,入职名企!
if(q==30&&p==30) cout&&&输入有错,该位置为题目数字,请重新输入: \n&;}cout&&&**************************************************************************&&&}while(true);setTextColor(12);cout&&&恭喜你过关!&&&}//case 2://与case1类似。//case 3://同上。setTextColor(10);cout&&&是否希望继续游戏: 1-继续,2-退出!&&&cin&&x;}while(x==1);setTextColor(14);cout&&&
谢谢使用,欢迎下次继续参与本游戏。&&&//&&&祝您有个好心情!&&&}
求大神解救
求救,求救
好高深的玩意
把cout替换成printf就行了
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 c 修改密码代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信