邪恶八进制信息安全团队技术讨论组's Archiver

pt007 2007-8-13 18:35

[原创]3389登录日志清除软件

软件作者:pt007[at]vip.sina.com版权所有,转载请注明版权
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
[code]/*3389登录日志清除软件*/
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void Usage(char *progname);
void OpenKey(char *key);
void DelKey(char *key,char *value);
void QueryKey(char *key,char *value);
void ValidateArgs(int argc, char **argv);
int j=1;

int main(int argc, char** argv)
{
  
  //解析命令行输入:
  ValidateArgs(argc, argv);

   return 0;
}

//输出帮助的典型方法:
void Usage (char *progname)
{
  fprintf(stdout,"===============================================================================\n"
    "\t名称:3389登录日志清除软件\n"
    "\t作者:MSN:pt007@vip.sina.com\n"
    "\tQQ号:7491805\n"
    "\t声明:本软件由pt007原创,转载请注明出处,谢谢!\n"
    "\t举例: clear3389 -h\n"
    "\t   \"clear3389 -h\" //帮助信息\n"
    "\t   \"clear3389 -a\" //显示本机3389所有登录记录\n"
    "\t   \"clear3389 -d MRU9\" //删除指定的3389登录记录\n"
    "===============================================================================\n");
  exit(0);
}

//解析命令行输入的典型方法:
void ValidateArgs(int argc, char **argv)
{   
  //打开指定的注册表键:
  char *Key="Software\\Microsoft\\Terminal Server Client\\Default";
  char buff[100]={0};
   int i,i1,length;
   if(argc<2)
   {
     Usage(argv[0]);
   }
     for(i=1;i<argc;i++)
   {
    if ((argv[i][0] == &#39;-&#39;) || (argv[i][0] == &#39;/&#39;))
    {
      switch (tolower(argv[i][1])) //转换成小写字母
      {
        case &#39;d&#39;: //删除指定的3389登录记录
          if (argc!=3)
          Usage(argv[0]);
          strcpy(buff,argv[2]);
          length = strlen(argv[2]);
          for (i1=0; i1<length; i1++)
          {
            buff[i1] = toupper(buff[i1]);
          }
          //printf("buff=%s\n",buff);
          QueryKey(Key,buff);
          exit(0);
        case &#39;h&#39;://打印帮助
          Usage(argv[0]);
          exit(0);
        case &#39;a&#39;: //显示本机3389所有登录记录
          if (argc!=2)
          Usage(argv[0]);
          OpenKey(Key);
          exit(0);
        default:
          Usage(argv[0]);
          return;
      }
    }
   
  }
   printf("继续...\n");
     return;
}

//下面是列出所有键值:
void OpenKey(char *key)
{
  HKEY hkey;//注册表键值的句柄
  DWORD dwIndex=0,Index=0,lpcbname=1000,ret=0,Type=0,namesize=1500;
  char *T_name=(char *)malloc(1000);
  unsigned char *name=(unsigned char *)malloc(1500);//保存子键名的字符数组
  int i=0;

  //下面是字符数组清0:
  //ZeroMemory(Buffer,1000);
  //ZeroMemory(T_name,1000);


  ret=RegOpenKeyEx(HKEY_CURRENT_USER, //根键名或已打开项的句柄
    key,       //传递一个参数,欲打开的注册表项
    0,        //未用,设为0即可
    KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
             //它们的组合描述了允许对这个项进行哪些操作
    &hkey);     //装载上面打开项的句柄

  //printf("ret=%x\n",ret);

  if(ret!=ERROR_SUCCESS) {
    printf("RegOpenKeyEx error! %x\n",GetLastError());
    return ;
  }

  printf("\n(%d)本机的3389登录项目为:\n",j++);
  printf("key=HKEY_CURRENT_USER\\%s\n",key);
  for(i=1;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值
  {
    ret=RegEnumValue(hkey,dwIndex,T_name,&lpcbname,
      NULL,&Type,name,&namesize);
    //dwIndex:欲获取的子项的索引。第一个子项的索引编号为零
    //T_name:用于装载指定索引处项名的一个缓冲区
    //&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。
    if(Type==REG_SZ)
    {
      printf("%d.数值名称:%s\n",i,T_name);
      printf(" 数值键值:\"%s\"\n",name);
      printf(" 数据类型:REG_SZ\n\n");
    }
    if(Type==REG_DWORD)
    {
      printf("类型为REG_DWORD!\n");
    }
    ZeroMemory(T_name,1000);
    lpcbname=1000;

    ZeroMemory(name,1500);
    namesize=1500;
  }

  RegCloseKey(hkey); //关闭注册键
  free(T_name);
  free(name);
}

//下面是查询指定的键值:
void QueryKey(char *key,char *value)
{
  HKEY hkey;//注册表键值的句柄
  DWORD dwIndex=0,Index=0,lpcbname=1000,ret=0,Type=0,namesize=1500;
  char *T_name=(char *)malloc(1000);
  unsigned char *name=(unsigned char *)malloc(1500);//保存子键名的字符数组
  int i=0,ret1=0;

  //下面是字符数组清0:
  //ZeroMemory(Buffer,1000);
  //ZeroMemory(T_name,1000);


  ret=RegOpenKeyEx(HKEY_CURRENT_USER, //根键名或已打开项的句柄
    key,       //传递一个参数,欲打开的注册表项
    0,        //未用,设为0即可
    KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
             //它们的组合描述了允许对这个项进行哪些操作
    &hkey);     //装载上面打开项的句柄

  //printf("ret=%x\n",ret);

  if(ret!=ERROR_SUCCESS) {
    printf("RegOpenKeyEx error! %x\n",GetLastError());
    return ;
  }

  printf("\n(%d)本机的3389登录项目为:\n",j++);
  printf("key=HKEY_CURRENT_USER\\%s\n",key);
  for(i=1;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值
  {
    ret=RegEnumValue(hkey,dwIndex,T_name,&lpcbname,
      NULL,&Type,name,&namesize);
    //dwIndex:欲获取的子项的索引。第一个子项的索引编号为零
    //T_name:用于装载指定索引处项名的一个缓冲区
    //&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)
   
    if(stricmp(T_name,value)==0){
    if(Type==REG_SZ)
    {
      printf("%d.数值名称:%s\n",i,T_name);
      printf(" 数值键值:\"%s\"\n",name);
      printf(" 数据类型:REG_SZ\n\n");
      ret1=1;
      DelKey(key,value);
    }
    if(Type==REG_DWORD)
    {
      printf("类型为REG_DWORD!\n");
    }
    }
    ZeroMemory(T_name,1000);
    lpcbname=1000;

    ZeroMemory(name,1500);
    namesize=1500;
  
  }
  if(!ret1)
  { printf("\n注意:数值名称%s不存在,请重新输入,注意大小写!\n",value);
  }
  RegCloseKey(hkey); //关闭注册键
  free(T_name);
  free(name);
}


//下面是删除指定的键值:
void DelKey(char *key,char *value)
{
  HKEY hkey;
  DWORD ret;
  ret=RegOpenKeyEx(HKEY_CURRENT_USER, //根键名或已打开项的句柄
    key,       //传递一个参数,欲打开的注册表项
    0,        //未用,设为0即可
    KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
             //它们的组合描述了允许对这个项进行哪些操作
    &hkey);     //装载上面打开项的句柄
  if(ret!=ERROR_SUCCESS) {
    printf("RegOpenKeyEx error! %x\n",GetLastError());
    return ;
  }
  
  
  ret=RegDeleteValue(hkey, value);
  if(ret!=ERROR_SUCCESS) {
    printf("RegDeleteValue %s error! %x\n",value,GetLastError());
    return ;
  }

  printf("RegDeleteValue %s success!\n",value);
  RegCloseKey(hkey);
  

}[/code]

chinafe 2007-8-13 18:42

呵呵 找个注册表操作的类可能会方便一谢谢PT007 分享

建议加精呵呵~~~~~~~~~~~~~~

gxm 2007-8-13 18:45

特男克斯有个类,但是我还是感觉API函数用起来代码优化的最好,呵呵!

l4bm0s 2007-8-13 19:50

//解析命令行输入的典型方法:
void ValidateArgs(int argc, char **argv)
{  
  //打开指定的注册表键:
  char *Key="Software\\Microsoft\\Terminal Server Client\\Default";
  int i;
  if(argc<2)
  {
    Usage(argv[0]);
  }
    for(i=1;i<argc;i++)
   {
    if ((argv[i][0] == &#39;-&#39;) || (argv[i][0] == &#39;/&#39;))
    {
      switch (tolower(argv[i][1])) //转换成小写字母
      {
        case &#39;d&#39;: //删除指定的3389登录记录
          if (argc!=3)
          Usage(argv[0]);
          QueryKey(Key,argv[2]);
          exit(0);
        case &#39;h&#39;://打印帮助
          Usage(argv[0]);
          exit(0);
        case &#39;a&#39;: //显示本机3389所有登录记录
          if (argc!=2)
          Usage(argv[0]);
          OpenKey(Key);
          exit(0);
        default:
          Usage(argv[0]);
          return;
      }
    }
   
  }
  printf("继续...\n");
    return;
}

这个函数完全是多余的,根本就不是什么 “解析命令行输入的典型方法”,解析命令行输入完全可以在主函数(应该是最常用的方法)里面进行,而且把函数的返回值类型都定为void也不是一个好习惯,还有一些书写错误,像printf("RegOpenKeyex error! %x\n",GetLastError());这里RegOpenKeyex就写错了,而且还打印出来,真是@#$%^&*(),这是我对代码的一些看法,没有针对楼主的意思。

pt007 2007-8-13 20:37

[quote]引用第3楼l4bm0s于2007-08-13 19:50发表的 :
//解析命令行输入的典型方法:
void ValidateArgs(int argc, char **argv)
{  
  //打开指定的注册表键:
  char *Key="Software\Microsoft\Terminal Server Client\Default";
.......[/quote]
一个大写写错了也不行啊,真是比黄世仁还狠啊,俺可是利用业余时间写的这个小程序啊,可怜俺的一个小时啊,没有功劳也有苦劳哇,要不你请我吃饭补偿一下吧,已经改过来了,HEHE

朽木 2007-8-13 21:25

[s:269] 我再去找个注册表命令行下索引键值和项的代码去,改成一个命令行下的注册表管理器

l4bm0s 2007-8-13 22:57

[quote]引用第4楼pt007于2007-08-13 20:37发表的 :

一个大写写错了也不行啊,真是比黄世仁还狠啊,俺可是利用业余时间写的这个小程序啊,可怜俺的一个小时啊,没有功劳也有苦劳哇,要不你请我吃饭补偿一下吧,已经改过来了,HEHE[/quote]


对于C语言这种对大小写敏感的语言来说,一个字母错了,代码就可能编译不了了,不过刚好你的字母错在打印字符串里面,不然就。。。[s:264]

风云逸剑 2007-8-14 20:00

clear3389 -d MRU9" //删除指定的3389登录记录
===========================================
[s:289]
删除上次的登陆日志咱用?
MRU9 这个参数咱用[s:269]

taiwansee 2007-8-14 20:43

各位大哥弄了这么辛苦,致敬了!
不过清除3389的登录记录我用一条系统自带的命令:

reg delete "hkcu\Software\Microsoft\Terminal Server Client" /f

然后删除当前帐户的 My Documents 文件夹下的 Default.rdp 文件

冇有咁白痴 2007-8-15 16:24

这个弄下来慢慢的参考先.谢谢了

yzy888 2007-8-15 17:04

--------------------Configuration: haha - Win32 Debug--------------------
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/haha.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

haha.exe - 2 error(s), 0 warning(s)


怎么我通不过啊, 哪点有错啊, 我用的是MS C++6。0

zshoucheng 2007-8-15 17:31

[quote]引用第10楼yzy888于2007-08-15 17:04发表的 :
--------------------Configuration: haha - Win32 Debug--------------------
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/haha.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
.......[/quote]

建立工程时选择工程类型为: Win32 Console Application

yzy888 2007-8-15 17:33

哎, 这下我知道错在哪了, 原来是我把NEW下的Win32 Console Application 点成了Win32 Application 正确的应该是Win32 Console Application  哎, 这下出丑了,

朽木 2007-8-15 20:22

[quote]引用第10楼yzy888于2007-08-15 17:04发表的 :
--------------------Configuration: haha - Win32 Debug--------------------
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/haha.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
.......[/quote]

新建个文件,保存为xx.c,运行后编译

zshoucheng 2007-8-15 20:44

[quote]引用第13楼朽木于2007-08-15 20:22发表的 :


新建个文件,保存为xx.c,运行后编译[/quote]


"运行后编译" ---- 估计是年度最NB的技术!

朽木 2007-8-15 21:00

[quote]引用第14楼zshoucheng于2007-08-15 20:44发表的 :



"运行后编译" ---- 估计是年度最NB的技术![/quote]


[s:269]不好意思,我就是运行后编译滴~VC++ 6.0

同时感谢你对装A大师木GG的关注~

asm 2007-8-15 21:59

[quote]引用第14楼zshoucheng于2007-08-15 20:44发表的 :



"运行后编译" ---- 估计是年度最NB的技术![/quote]

从语文角度上讲,是说得通滴,运行后编译:运行VC++,然后编译....如此简单嘛

l4bm0s 2007-8-16 00:15

[quote]引用第16楼asm于2007-08-15 21:59发表的 :


从语文角度上讲,是说得通滴,运行后编译:运行VC++,然后编译....如此简单嘛[/quote]

从语文角度上讲,运行缺了宾语,所以有bug,不过放心,这不是0Day[s:264]

朽木 2007-8-16 05:08

[s:269] LS的~怎么会有问题呢,我将CODE另存为后缀C后,以VC++6.0运行打开后,点击编译,然后切进DSP里生成EXE,一切正常也。。。我还改成了一个查看项和值的东东~

szplay777 2007-8-16 11:30

当在JJ上的登陆次数过多的时候,就会产生很多的MRU值,

貌似再加上个批量删除就更好了.[s:269]



[quote]引用第8楼taiwansee于2007-08-14 20:43发表的 :
各位大哥弄了这么辛苦,致敬了!
不过清除3389的登录记录我用一条系统自带的命令:

reg delete "hkcuSoftwareMicrosoftTerminal Server Client" /f

.......[/quote]

8楼兄弟删键值的方法也不错的.

爬墙找红杏 2007-8-25 23:21

这个应该了解下,用3389的时候要注意

独孤依人 2007-9-6 17:17

[quote]引用第8楼taiwansee于2007-08-14 20:43发表的 :
各位大哥弄了这么辛苦,致敬了!
不过清除3389的登录记录我用一条系统自带的命令:

reg delete "hkcuSoftwareMicrosoftTerminal Server Client" /f

.......[/quote]
错误: 系统找不到指定的注册表项或值。

独孤依人 2007-9-6 17:33

C:\Documents and Settings\guest1\桌面>clear3389 -a
RegOpenKeyEx error! 0

2003环境下测试如上

xiaohouzi331 2007-9-8 21:59

恩好东西,收藏了,

reg delete "hkcu\Software\Microsoft\Terminal Server Client" /f

然后删除当前帐户的 My Documents 文件夹下的 Default.rdp 文件

这个方法也很好哦~ [s:270]

页: [1]
© 1999-2008 EvilOctal Security Team