[原创]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] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1])) //转换成小写字母
{
case 'd': //删除指定的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 'h'://打印帮助
Usage(argv[0]);
exit(0);
case 'a': //显示本机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] 呵呵 找个注册表操作的类可能会方便一谢谢PT007 分享
建议加精呵呵~~~~~~~~~~~~~~ 特男克斯有个类,但是我还是感觉API函数用起来代码优化的最好,呵呵! //解析命令行输入的典型方法:
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] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1])) //转换成小写字母
{
case 'd': //删除指定的3389登录记录
if (argc!=3)
Usage(argv[0]);
QueryKey(Key,argv[2]);
exit(0);
case 'h'://打印帮助
Usage(argv[0]);
exit(0);
case 'a': //显示本机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就写错了,而且还打印出来,真是@#$%^&*(),这是我对代码的一些看法,没有针对楼主的意思。 [quote]引用第3楼l4bm0s于2007-08-13 19:50发表的 :
//解析命令行输入的典型方法:
void ValidateArgs(int argc, char **argv)
{
//打开指定的注册表键:
char *Key="Software\Microsoft\Terminal Server Client\Default";
.......[/quote]
一个大写写错了也不行啊,真是比黄世仁还狠啊,俺可是利用业余时间写的这个小程序啊,可怜俺的一个小时啊,没有功劳也有苦劳哇,要不你请我吃饭补偿一下吧,已经改过来了,HEHE [s:269] 我再去找个注册表命令行下索引键值和项的代码去,改成一个命令行下的注册表管理器 [quote]引用第4楼pt007于2007-08-13 20:37发表的 :
一个大写写错了也不行啊,真是比黄世仁还狠啊,俺可是利用业余时间写的这个小程序啊,可怜俺的一个小时啊,没有功劳也有苦劳哇,要不你请我吃饭补偿一下吧,已经改过来了,HEHE[/quote]
对于C语言这种对大小写敏感的语言来说,一个字母错了,代码就可能编译不了了,不过刚好你的字母错在打印字符串里面,不然就。。。[s:264] clear3389 -d MRU9" //删除指定的3389登录记录
===========================================
[s:289]
删除上次的登陆日志咱用?
MRU9 这个参数咱用[s:269] 各位大哥弄了这么辛苦,致敬了!
不过清除3389的登录记录我用一条系统自带的命令:
reg delete "hkcu\Software\Microsoft\Terminal Server Client" /f
然后删除当前帐户的 My Documents 文件夹下的 Default.rdp 文件 这个弄下来慢慢的参考先.谢谢了 --------------------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 [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 哎, 这下我知道错在哪了, 原来是我把NEW下的Win32 Console Application 点成了Win32 Application 正确的应该是Win32 Console Application 哎, 这下出丑了, [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,运行后编译 [quote]引用第13楼朽木于2007-08-15 20:22发表的 :
新建个文件,保存为xx.c,运行后编译[/quote]
"运行后编译" ---- 估计是年度最NB的技术! [quote]引用第14楼zshoucheng于2007-08-15 20:44发表的 :
"运行后编译" ---- 估计是年度最NB的技术![/quote]
[s:269]不好意思,我就是运行后编译滴~VC++ 6.0
同时感谢你对装A大师木GG的关注~ [quote]引用第14楼zshoucheng于2007-08-15 20:44发表的 :
"运行后编译" ---- 估计是年度最NB的技术![/quote]
从语文角度上讲,是说得通滴,运行后编译:运行VC++,然后编译....如此简单嘛 [quote]引用第16楼asm于2007-08-15 21:59发表的 :
从语文角度上讲,是说得通滴,运行后编译:运行VC++,然后编译....如此简单嘛[/quote]
从语文角度上讲,运行缺了宾语,所以有bug,不过放心,这不是0Day[s:264] [s:269] LS的~怎么会有问题呢,我将CODE另存为后缀C后,以VC++6.0运行打开后,点击编译,然后切进DSP里生成EXE,一切正常也。。。我还改成了一个查看项和值的东东~ 当在JJ上的登陆次数过多的时候,就会产生很多的MRU值,
貌似再加上个批量删除就更好了.[s:269]
[quote]引用第8楼taiwansee于2007-08-14 20:43发表的 :
各位大哥弄了这么辛苦,致敬了!
不过清除3389的登录记录我用一条系统自带的命令:
reg delete "hkcuSoftwareMicrosoftTerminal Server Client" /f
.......[/quote]
8楼兄弟删键值的方法也不错的. 这个应该了解下,用3389的时候要注意 [quote]引用第8楼taiwansee于2007-08-14 20:43发表的 :
各位大哥弄了这么辛苦,致敬了!
不过清除3389的登录记录我用一条系统自带的命令:
reg delete "hkcuSoftwareMicrosoftTerminal Server Client" /f
.......[/quote]
错误: 系统找不到指定的注册表项或值。 C:\Documents and Settings\guest1\桌面>clear3389 -a
RegOpenKeyEx error! 0
2003环境下测试如上 恩好东西,收藏了,
reg delete "hkcu\Software\Microsoft\Terminal Server Client" /f
然后删除当前帐户的 My Documents 文件夹下的 Default.rdp 文件
这个方法也很好哦~ [s:270]
页:
[1]