瑞星卡卡安全论坛

首页 » 技术交流区 » 反病毒/反流氓软件论坛 » 多年的回忆没了
所罗门11 - 2008-10-6 10:54:00
电脑里的照片突然中毒了
大小都变成一样
后缀名变成 jpg.exe
我想问下,我电脑重装后,照片还能恢复么?

用户系统信息:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
东嬉南北 - 2008-10-6 10:59:00
那要看这些文件有没有被病毒破坏了,如果没有破坏的话,是可以恢复的~
lz还可以看看瑞星的这个数据恢复网页(http://sos.rising.com.cn/new/index.shtml)看看可不可以帮助到你~
所罗门11 - 2008-10-6 11:00:00
怎么看这些照片时不是被破坏了呢?
东嬉南北 - 2008-10-6 11:04:00
:default2: 这个就需要看重新安装系统之后能不能正常打开了,其实lz可以先做下病毒处理,到实在没有办法了在重做系统,可以用瑞星听诊器这个软件,把系统情况扫出来给大家看看也可以按着下面的链接发给瑞星客户服务中心:
下载瑞星听诊器

下载地址:http://download.rising.com.cn/for_down/RsDetect.exe

运行扫描后会生成一个“瑞星听诊信息.htm”的文件,压缩后上报瑞星分析:

上报地址:http://up.rising.com.cn/webmail/othernew.htm
所罗门11 - 2008-10-6 11:13:00
好的,谢谢
东嬉南北 - 2008-10-6 11:15:00
:default7: 不客气
海生 - 2008-10-6 14:21:00
文件的后缀都被修改了?
宝剑开锋 - 2008-10-6 18:30:00
中的是否这病毒:
Backdoor.Win32.Hupigon.mrv (jpg.exe SSL.EXE)
一、病毒相关分析:

  病毒标签:
      病毒名称:Backdoor.Win32.Hupigon.mrv(IKARUS)
      病毒类型:木马
      危害级别:2
      感染平台:Windows
      病毒大小:341,504 字节
      MD5    :fbc46ac66ba8d1eb6e4b8ee061a36f3b
      加壳类型:--
      开发工具:--

病毒行为:
    1、程序运行后,释放副本
          %Systemroot%\SSL.exe 属性:只读、隐藏、系统。
  2、添加服务名为SSL的服务,然后启动进程SSL.EXE,连接网络:59.37.71.85
      3、SSL.exe试图启动IE,试图修改其内存。启动用户名为system的IE进程成功后,SSL.exe自动退出。

如果是这种病毒可参照如下:
解决方案:
1.终止IEXPLORE.EXE进程,删除 %Systemroot%\SSL.exe
2.删除病毒创建的注册表值,删除服务SSL
SREng--启动项目--服务--服务之如下项删除
[SSL / SSL]  <C:\WINDOWS\SSL.EXE><N/A>

  注: %System% 是一个可变路径,在windows95/98/me中该变量是指%Windir%\System,在WindowsNT/2000/XP/2003/VISTA中该变
   量指%Windir%\System32。其它:
      %SystemDrive%          系统安装的磁盘分区
      %SystemRoot% = %Windir%   WINDODWS系统目录
      %ProgramFiles%        应用程序默认安装目录
      %AppData%             应用程序数据目录
      %CommonProgramFiles%   公用文件目录
      %HomePath%          当前活动用户目录
      %Temp% =%Tmp%          当前活动用户临时目录
      %DriveLetter%          逻辑驱动器分区
      %HomeDrive%           当前用户系统所在分区
rainyblue - 2008-10-6 18:47:00
建议楼主将样本上传到可疑文件交流区好了
文物2 - 2008-10-6 23:21:00
提供资料,仅供参考:生成jpg文件



引用:

code segment
assume cs:code,ds:code
org 100h
start:
jmp install

;JPG 文件头定义
;---------------------------------------------------------------
JPG_HEAD    DB    'JP'        ;固定为 'JP'
D_FILE_LENGTH    DD    640*480*3+36h    ;文件总长度,包括文件头
D_RESERVED    DD    ?        ;reserved
D_OFFSET    DD    36h        ;数据区开始位置
D_BISIZE    DD    28h        ;bit map info' head length
D_WIDTH        DD    640        ;图形的宽度(单位象素)
D_HEIGHT    DD    480        ;图形的高度(单位象素)
D_PLANES    DW    1        ;图形的平面数
D_BIT        DW    24        ;颜色位数
D_COMPRESS    DD    0        ;压缩方式(0为不压缩)
D_SIZE        DD    640*480*3    ;数据长度
D_XPPM        DD    0c00h        ;pixels per meter (x)
D_YPPM        DD    0c00h        ;pixels per meter (y)
D_CLRUSED    DD    0        ;color used
D_CLRIMP    DD    0        ;important color index
JPG_HEAD_END    EQU    THIS BYTE
;----------------------------------------------------------------
HANDLE        DW    ?
FILE_NAME    DB    'test.jpg',0
LINE_BUF    DB    640*3 dup (0)
D_RED        DB    0ffh
D_GREEN        DB    0
D_BLUE        DB    0
install:
        mov    ah,3ch        ;建立文件
        xor    cx,cx
        mov    dx,offset file_name
        int    21h
        jnb    cre_ok
        int    20h
cre_ok:
        mov    handle,ax
       
        mov    ah,40h        ;写入文件头
        mov    bx,handle
        mov    cx,offset JPG_head_end-offset JPG_head
        mov    dx,offset JPG_head
        int    21h
       
        mov    cx,480        ;写入 480 行数据
        xor    bp,bp
b_lop:
        push    cx
       
        mov    ax,bp
        inc    bp
        cmp    ax,160
        jb    b1
        cmp    ax,320
        jb    b2
b3:
        sub    ax,320
        mov    si,offset d_blue
        mov    di,offset d_red
        jmp    short b4
b2:
        sub    ax,160
        mov    si,offset d_green
        mov    di,offset d_blue
        jmp    short b4
b1:
        mov    si,offset d_red
        mov    di,offset d_green
b4:
        mov    cx,0ffh
        mul    cx
        mov    cx,160        ;160
        div    cx
       
        mov    byte ptr ds:[si],0ffh
        sub    byte ptr ds:[si],al
        mov    byte ptr ds:[di],al
       
        mov    cx,640
        mov    di,offset line_buf
        cld
b_lop1:
        mov    al,d_red
        stosb
        mov    al,d_green
        stosb
        mov    al,d_blue
        stosb
        loop    b_lop1
       
        mov    ah,40h
        mov    bx,handle
        mov    cx,640*3
        mov    dx,offset line_buf
        int    21h
        pop    cx
        loop    b_lop
       
        mov    ah,3eh        ;关闭文件
        int    21h
        int    20h
CODE        ENDS
        END    START

文物2 - 2008-10-6 23:23:00


引用:

如何才能校验指定文件是否为一有效PE文件呢? 这个问题很难回答,完全取决于想要的精准程度。您可以检验PE文件格式里的各个数据结构,或者仅校验一些关键数据结构。大多数情况下,没有必要校验文件里的每一个数据结构,只要一些关键数据结构有效,我们就认为是有效的PE文件了。下面我们就来实现前面的假设。

我们要验证的重要数据结构就是 PE header。从编程角度看,PE header 实际就是一个 IMAGE_NT_HEADERS 结构。定义如下:

IMAGE_NT_HEADERS STRUCT
  Signature dd ?
  FileHeader IMAGE_FILE_HEADER <>
  OptionalHeader IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS ENDS

Signature 一dword类型,值为50h, 45h, 00h, 00h(PE\0\0)。 本域为PE标记,我们可以此识别给定文件是否为有效PE文件。
FileHeader 该结构域包含了关于PE文件物理分布的信息, 比如节数目、文件执行机器等。
OptionalHeader 该结构域包含了关于PE文件逻辑分布的信息,虽然域名有"可选"字样,但实际上本结构总是存在的。

我们目的很明确。如果IMAGE_NT_HEADERS的signature域值等于"PE\0\0",那么就是有效的PE文件。实际上,为了比较方便,Microsoft已定义了常量IMAGE_NT_SIGNATURE供我们使用。

IMAGE_DOS_SIGNATURE equ 5A4Dh
IMAGE_OS2_SIGNATURE equ 454Eh
IMAGE_OS2_SIGNATURE_LE equ 454Ch
IMAGE_VXD_SIGNATURE equ 454Ch
IMAGE_NT_SIGNATURE equ 4550h

接下来的问题是: 如何定位 PE header? 答案很简单: DOS MZ header 已经包含了指向 PE header 的文件偏移量。DOS MZ header 又定义成结构 IMAGE_DOS_HEADER 。查询windows.inc,我们知道 IMAGE_DOS_HEADER 结构的e_lfanew成员就是指向 PE header 的文件偏移量。

现在将所有步骤总结如下:

首先检验文件头部第一个字的值是否等于 IMAGE_DOS_SIGNATURE,是则 DOS MZ header 有效。
一旦证明文件的 DOS header 有效后,就可用e_lfanew来定位 PE header 了。
比较 PE header 的第一个字的值是否等于 IMAGE_NT_HEADER。如果前后两个值都匹配,那我们就认为该文件是一个有效的PE文件。
Example:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib

SEH struct
PrevLink dd ?    ; the address of the previous seh structure
CurrentHandler dd ?    ; the address of the exception handler
SafeOffset dd ?    ; The offset where it's safe to continue execution
PrevEsp dd ?      ; the old value in esp
PrevEbp dd ?    ; The old value in ebp
SEH ends

.data
AppName db "PE tutorial no.2",0
ofn OPENFILENAME <>
FilterString db "Executable Files (*.exe, *.dll)",0,"*.exe;*.dll",0
                db "All Files",0,"*.*",0,0
FileOpenError db "Cannot open the file for reading",0
FileOpenMappingError db "Cannot open the file for memory mapping",0
FileMappingError db "Cannot map the file into memory",0
FileValidPE db "This file is a valid PE",0
FileInValidPE db "This file is not a valid PE",0

.data?
buffer db 512 dup(?)
hFile dd ?
hMapping dd ?
pMapping dd ?
ValidPE dd ?

.code
start proc
LOCAL seh:SEH
mov ofn.lStructSize,SIZEOF ofn
mov ofn.lpstrFilter, OFFSET FilterString
mov ofn.lpstrFile, OFFSET buffer
mov ofn.nMaxFile,512
mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetOpenFileName, ADDR ofn
.if eax==TRUE
    invoke CreateFile, addr buffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
    .if eax!=INVALID_HANDLE_VALUE
      mov hFile, eax
      invoke CreateFileMapping, hFile, NULL, PAGE_READONLY,0,0,0
      .if eax!=NULL
          mov hMapping, eax
          invoke MapViewOfFile,hMapping,FILE_MAP_READ,0,0,0
          .if eax!=NULL
            mov pMapping,eax
            assume fs:nothing
            push fs:[0]
            pop seh.PrevLink
            mov seh.CurrentHandler,offset SEHHandler
            mov seh.SafeOffset,offset FinalExit
            lea eax,seh
            mov fs:[0], eax
            mov seh.PrevEsp,esp
            mov seh.PrevEbp,ebp
            mov edi, pMapping
            assume edi:ptr IMAGE_DOS_HEADER
            .if [edi].e_magic==IMAGE_DOS_SIGNATURE
                add edi, [edi].e_lfanew
                assume edi:ptr IMAGE_NT_HEADERS
                .if [edi].Signature==IMAGE_NT_SIGNATURE
                  mov ValidPE, TRUE
                .else
                  mov ValidPE, FALSE
                .endif
            .else
                mov ValidPE,FALSE
            .endif
FinalExit:
            .if ValidPE==TRUE
                invoke MessageBox, 0, addr FileValidPE, addr AppName, MB_OK+MB_ICONINFORMATION
            .else
                invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION
            .endif
            push seh.PrevLink
            pop fs:[0]
            invoke UnmapViewOfFile, pMapping
          .else
            invoke MessageBox, 0, addr FileMappingError, addr AppName, MB_OK+MB_ICONERROR
          .endif
          invoke CloseHandle,hMapping
      .else
          invoke MessageBox, 0, addr FileOpenMappingError, addr AppName, MB_OK+MB_ICONERROR
      .endif
      invoke CloseHandle, hFile
    .else
      invoke MessageBox, 0, addr FileOpenError, addr AppName, MB_OK+MB_ICONERROR
    .endif
.endif
invoke ExitProcess, 0
start endp

SEHHandler proc uses edx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD
    mov edx,pFrame
    assume edx:ptr SEH
    mov eax,pContext
    assume eax:ptr CONTEXT
    push [edx].SafeOffset
    pop [eax].regEip
    push [edx].PrevEsp
    pop [eax].regEsp
    push [edx].PrevEbp
    pop [eax].regEbp
    mov ValidPE, FALSE
    mov eax,ExceptionContinueExecution
    ret
SEHHandler endp
end start

分析:
本例程打开一文件,先检验DOS header是否有效,有效就接着检验PE header的有效性,ok就认为是有效的PE文件了。这里,我们还运用了结构异常处理(SEH),这样就不必检查每个可能的错误: 如果有错误出现,就认为PE检测失效所致,于是给出我们的报错信息。其实Windows内部普遍使用SEH来检验参数传递的有效性。若对SEH感兴趣的话,可阅读Jeremy Gordon的 文章。

程序调用打开文件通用对话框,用户选定执行文件后,程序便打开文件并映射到内存。并在有效性检验前建立一 SEH:

  assume fs:nothing
  push fs:[0]
  pop seh.PrevLink
  mov seh.CurrentHandler,offset SEHHandler
  mov seh.SafeOffset,offset FinalExit
  lea eax,seh
  mov fs:[0], eax
  mov seh.PrevEsp,esp
  mov seh.PrevEbp,ebp

一开始就假设寄存器 fs为空(assume fs:nothing)。 记住这一步不能省却,因为MASM假设fs寄存器为ERROR。接下来保存 Windows使用的旧SEH处理函数地址到我们自己定义的结构中,同时保存我们的SEH处理函数地址和异常处理时的执行恢复地址,这样一旦错误发生就能由异常处理函数安全地恢复执行了。同时还保存当前esp及ebp的值,以便我们的SEH处理函数将堆栈恢复到正常状态。

  mov edi, pMapping
  assume edi:ptr IMAGE_DOS_HEADER
  .if [edi].e_magic==IMAGE_DOS_SIGNATURE

成功建立SEH后继续校验工作。置目标文件的首字节地址给edi,使其指向DOS header的首字节。为便于比较,我们告诉编译器可以假定edi正指向IMAGE_DOS_HEADER结构(事实亦是如此)。然后比较DOS header的首字是否等于字符串"MZ",这里利用了windows.inc中定义的IMAGE_DOS_SIGNATURE常量。若比较成功,继续转到PE header,否则设ValidPE 值为FALSE,意味着文件不是有效PE文件。

      add edi, [edi].e_lfanew
      assume edi:ptr IMAGE_NT_HEADERS
      .if [edi].Signature==IMAGE_NT_SIGNATURE
        mov ValidPE, TRUE
      .else
        mov ValidPE, FALSE
      .endif

要定位到PE header,需要读取DOS header中的e_lfanew域值。该域含有PE header在文件中相对文件首部的偏移量。edi加上该值正好定位到PE header的首字节。这儿可能会出错,如果文件不是PE文件,e_lfanew值就不正确,加上该值作为指针就可能导致异常。若不用SEH,我们必须校验e_lfanew值是否超出文件尺寸,这不是一个好办法。如果一切OK,我们就比较PE header的首字是否是字符串"PE"。这里在此用到了常量IMAGE_NT_SIGNATURE,相等则认为是有效的PE文件。
如果e_lfanew的值不正确导致异常,我们的SEH处理函数就得到执行控制权,简单恢复堆栈指针和基栈指针后,就根据safeoffset的值恢复执行到FinalExit标签处。

FinalExit:
  .if ValidPE==TRUE
      invoke MessageBox, 0, addr FileValidPE, addr AppName, MB_OK+MB_ICONINFORMATION
  .else
      invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION
  .endif

上述代码简单明确,根据ValidPE的值显示相应信息。

  push seh.PrevLink
  pop fs:[0]

一旦SEH不再使用,必须从SEH链上断开。


叶陵君 - 2008-10-6 23:46:00
建议 打包上传 被感染的 程序文件, 瑞星更新后 就可能可以查杀修复了
1
查看完整版本: 多年的回忆没了