欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]纯汇编打造PE感染病毒

[原创]纯汇编打造PE感染病毒

本人文笔非常烂,想到什么就写什么,望见谅。
这个是上一年写的代码,最近翻了翻硬盘发现了这尘封了多年的东西。
由于PE感染病毒中了很麻烦,请小心运行。
编译环境是masm32,附件里有编译用的命令行,改改就行。xp下测试通过
PE感染病毒要克服几个重要的问题:变量的存放,函数地址的调用,对PE文件的处理,还要考虑在宿主的变量函数等存储等,很麻烦,我一年前写的我都忘的差不多了。
程序的一切是从main.asm的start标号开始。顺着他看下去一切思路又回来了。
要处理的问题:
1,重定位。
  由于病毒会在宿主里运行,病毒不知道自己是在哪里运行,哪个地址被执行的,所以要想办法知道自己在哪里。
  call @1                                    @1:
  pop ebp
    sub ebp, offset @1  
sub ebp, offset @1  的意思是把@1处的地址,被ebp减,如果是在本程序,ebp为0,但如果这代码运行在宿主程序里,那么ebp的值就是原编译好的程序的地址与宿舍新地址的差。以后要用变量,只要 offset var + ebp就是变量地址。这样就达到重定位的目的。
例如,在上面定义的变量:
kernel32_base  dd 0          ;kernel32.dll的基地址
mov eax , dword ptr [ebp + kernel32_base]
这样就可以使用这个变量,而不管这段代码是在宿主的哪个地方运行的。
2,API地址的获取
   R3的程序肯定要调用系统的API,不然没法工作。找api的方法通常来讲都是这样:找到kernel32.dll的基址, 通过输出表,找到GetProcAddress地址,再通过GetProcAddress找到任何你想要的函数地址。
我这里找kernel32.dll采用暴力搜索法,但其实是可以通过fs来找到的,方法各异。
因为当程序在入口点运行时,栈里就是kernel32.dll的某个地址。
  ;下面要取得kernel32.dll的基地址
  mov eax,[esp]    ;取得kernel返回地址
@step1:  
  dec eax
  cmp dword ptr [eax], 4550h      ;如果是MZ标志的DOS头标志
  
  je offset @step2 
  jmp offset @step1 
@step2:
  dec eax
  cmp word ptr[eax], 5A4Dh
  je offset @step3
  jmp @step2
  
@step3:                  ;现在eax就是kernel32.dll的基地址了
  mov dword ptr [ebp + kernel32_base] , eax
至于在k32.dll里通过导出表找到函数的方法,我封装了下:
;函数名称                    :getApiAddr_K32
;说明                        :根据导出表,得出在K32里的API的函数地址
;k32base                    :kernel32.dll的基地址
;export_table                :导出表地址
;api_name                    :要取得api的函数名称地址
;返回值                      :找到的API地址,如找不到则为0
getApiAddr_K32 proc k32base:DWORD, export_table:DWORD, api_name_addr:DWORD
具体代码在看代码吧。
3,感染PE文件
对于感染PE文件,我采用文件映射到内存的方法,CreateFileMapping什么的。一个个搜索指定的目录,判断是否是PE文件,然后感染。
首先做的是打开文件,然后进行文件映射,然后增加一个节,用来存放病毒代码。把病毒本身的代码写进去。
当然,也要把程序的原始入口点保存起来,到时执行完病毒 的代码,就跳转回原来的执行。
在病毒执行的过程中,你可以增加别的代码,在程序启动前干什么事都行。这里我的程序只是弹一个网页而已。

上传的附件 病毒完成(弹广告版).rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功