小红伞好像对Radasm编的程序很敏感,根据个人预测小红伞将持续保持对radasm编的程序的高误杀率,前提是使用radasm编的程序得包含二进制资源文件。
根据个人测试,发现当使用radasm编的程序含有二进制资源文件时,即使你的整个程序的代码只有一个ret,照样会受到小红伞的残忍杀害,原因好像是在你的文件里发现了二进制资源文件,所以小红伞认为不用怀疑你就是病毒,呵呵,但是使用VC编译器时不会出现同样的情况,在同样包含二进制资源的情况下,不会受到小红伞的杀害,这个不知道小红伞是不是针对radasm的。。。。。
那么怎么解决呢?不得不说radasm用起来很方便,难道只能编个不含资源 的文件吗?答:否也?当资源不是二进制的时候小红伞是不会杀的,但是问题又来了,我要包含的资源就是一个exe或dll文件,这个貌似无法改变啊,恩,解决的方法是把exe或dll文件中所有二进制的"'oo"换成其它的字符,那么替换完成后,整个exe或dll就好像成了一个很长的字符串,小红伞会认为这是一个字符串啊,不是二进制资源,貌似没有危险,就把你放过啦,呵呵,等你使用时候再把资源文件“解密”就可以使用了,什么是解密呢?就是再把替换成 的字符再换成“00”的,那么问题又来了,把oo替换成什么好呢?这个确实是个难点,恩,那就是你程序里面重头到尾都没有使用过的一个字节,那么问题依旧,我怎么知道那个没用过呢?,可以写个程序测试下,下面的程序用来查找没用的字符,找到后然后替换程序中的00字节:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include advapi32.inc
includelib user32.lib
includelib kernel32.lib
includelib advapi32.lib
.data
FileName db 'ress.dll',0
FileHwnd dd ?
Data db 11,10,9,8
ok db 'ok',0
hehe dd ?
g_FileHwnd dd 0
g_MapHwnd dd 0
g_Memory dd 0
SizeH dd 0
SizeL dd 0
Hwnd1 dd 0
Hwnd2 dd 0
Buffer db 100 dup(0)
Format db '找到了没有用过的字符:%x,是否替换?',0
my db 'DeleteMz.exe',0
i db 0
NoFind db '没有找到',0
FindByte db 0
ReplaceOk db '替换完毕',0
g_RessDll db 'ress.dll',0
g_ImeName db 'fime.ime',0
PathFen db '\',0
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 内存映射文件。后面分析PE文件结构。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MapImeFile proc
LOCAL ImePath[1024]:byte
invoke CreateFile,offset FileName,GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE ,NULL,\
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.if (eax!=INVALID_HANDLE_VALUE)
mov g_FileHwnd,eax
invoke CreateFileMapping,g_FileHwnd,NULL,PAGE_READWRITE,0,0,NULL
.if (eax)
mov g_MapHwnd,eax
invoke MapViewOfFile,g_MapHwnd,FILE_MAP_WRITE or FILE_MAP_READ,0,0,0
.if (eax)
mov g_Memory,eax
mov eax,1
ret
.endif
.endif
.endif
mov eax,0
ret
MapImeFile endp
FindByteZero proc
invoke GetFileSize,g_FileHwnd,offset hehe
mov SizeL,eax
.while(i<0FFh)
mov ecx,SizeL
mov edx,g_Memory
xor ebx,ebx
.while(ecx>0)
mov al,byte ptr[edx]
.if(al==i)
inc ebx
.endif
inc edx
dec ecx
.endw
.if(ebx==0)
movzx eax,i
ret
.endif
inc i
.endw
xor eax,eax
ret
FindByteZero endp
start:
invoke MapImeFile
.if(eax)
invoke FindByteZero
.if(eax)
mov FindByte,al
invoke wsprintf,offset Buffer,offset Format,eax
invoke MessageBox,0,offset Buffer,0,0
mov ecx,SizeL
mov edx,g_Memory
xor ebx,ebx
.while(ecx>0)
mov al,byte ptr[edx]
.if(al==00h)
mov al,FindByte
mov byte ptr[edx],al
.endif
inc edx
dec ecx
.endw
invoke MessageBox,0,offset ReplaceOk,0,0
.else
invoke MessageBox,0,offset NoFind,0,0
.endif
invoke UnmapViewOfFile,g_Memory
invoke CloseHandle,g_FileHwnd
invoke CloseHandle,g_MapHwnd
.endif
ret
end start
程序粗糙点,懒惰改了,恩,找这个资料的人相信会马上明白了,解密不再多说,替换完后再去当成资源文件,那么编译成功后,小红伞不再查杀。。。。呵呵,也算一个临时解决方案吧。。。。 |