• Note-Virus


    假如你有天知识储备够了,不学学病毒将是你的遗憾。

    看的时候最好准备个PE表在旁边。写病毒程序可以使用很多种语言来写比如C,汇编,甚至有人用Dephi这样可视化编程工具都能写出来。但是最适合写病毒程序的还是汇编语言。汇编语言底层,灵活,速度快,体积小的优势能将一个病毒程序发挥到极至

    一 代码重定位 

    二 自己找到所需API地址 

    三 搜索文件、目录 

    四 感染文件 

    五 破坏系统或文件

    (一)代码的重定位 

    一个变量或函数其实是一个内存地址

    在编译好后

    程序中的指令通过变量或函数的内存地址再去存取他们

    这个地址是个绝对地址

    如果你将代码插入到其他任何地方

    再通过原来编译时产生的地址去找他们就找不到

    因为他们已经搬家了

    但是,你在写程序时考虑到这个问题

    你就可以在代码最开始

    放上几行代码取得程序基地址

    以后变量和函数作为偏移地址

    显式的加上这个基地址就能顺利找到了

    这就是重定位 

    二、寻找API

    一个win32程序文件

    所调用的API函数地址

    是由系统填入到程序文件中描述各类数据位置的数据结构中的

    而病毒作为一个残废是享受不到这个待遇的

    因为你在把病毒的代码插入目标程序时没有把这些描述数据存放位置的数据结构信息也弄进去

    它被插入到其他目标程序后就成了只有代码的残废儿童

    所以作为一个残废儿童

    应当自力更生

    自己搜寻自己需要的API地址

    目标程序文件就包含了我们需要的东西

    我们需要自己去找

    目标程序文件只要还是win32程序

    它的地址空间中就包含的有Kernel32.dll

    如果找到了它

    我们就能找到其他任何的东东

    第一步

    搜寻kernel32.dll的基地址

    当然了

    整个地址空间有4GB

    可供搜索的用户进程空间也有2GB

    在2GB中搜索

    太吓人了

    总不能在执行被感染的目标程序时

    先让用户喝杯茶吧

    或者斗斗地主

    这里介绍两个技巧

    在程序被加载后

    加载程序会调用程序的主线程的第一条指令的位置

    它使用的指令是CALL

    就是说

    你程序还没执行

    堆栈区里就有了一个返回地址了

    这个返回地址指向的是加载程序

    而加载程序是包含在KERNEL32.dll中的

    我们顺着它向上找

    就能找到kernel32.dll的基地址

    当然也不是一个字节一个字节的挨者找

    而是一个页面一个页面地找

    因为win32下

    代码或数据的开始位置总是页面单位(windows平台下为4kb)对齐的

    Kernel32.dll是一个PE文件

    我们按比较PE文件dos签名标志和PE签名标志的方法找

    另外还有个办法是通过SHE技术找

    这是最好的办法了

    前一个办法因为堆栈是动态的原因不稳定

    一般只能将获取地址的代码块放在最开头

    这个方法完全是与堆栈无关的

    放在哪里执行都不会出错

    如果你的病毒需要用一些远程线程之类的技术

    最好用这个方法


    SHE结构

    第一个成员指向下一个SEH结构

    如果是最后一个那么它的值就是0ffffffffh

    第二个成员指向异常处理函数

    如果是最后一个SHE结构且没有指定的话

    缺省的是SetUnhandlederExceptionFilter函数地址

    当异常触发这个函数时就会弹出一个对话框

    问你发不发送错误

    98下显示蓝屏

    这个函数是包含在KERNEL32.dll中的

    只要取得它的地址向上找就能找到KERNEL32.dll的基地址

    在说SHE时总忘不了TEB

    TEB是创建一个线程时分配的线程相关的数据结构

    SHE只是它开头第一个数据结构体而已

    它还包含了其他许多重要的东西

    TEB由FS段选择器指向

    有兴趣的查查资料

    这里篇幅原因就不再多说

    接着上面的

    看看如何找SetUnhanderExceptionFilter函数地址

    先根据“下一个”SHE结构的值定位到最后一个SHE结构

    这时取出she处理函数的地址

    就是SetUnHandleredEceptionFilter函数地址了

    以页面为单位向上找就可以找到Kernel32.dll了


    得到Kernel32.dll的基地址后

    定位到它的导出表

    找出GetProcAddress地址再利用GetProcAddress就能找到其他任何所需要的函数

    在搜索API时应该注意API的名字

    API的名字实际的导出名字很有可能不是你调用时的名字

    windows下很多API都有两个版本ANSI版和UNICODE版

    ANSI版函数名后缀带个A

    比如CreateWindowExA

    而UNICODE版的函数名带个W后缀

    比如CreateWindowExW

    不过考虑到麻烦问题

    现有的很多编译器都不让你写后缀

    只是在编译的时候根据你程序是ANSI版的还是UNICODE版的自动改名字

    Win2K以后的API函数都是Unicode 版本的

    如果调用ANSI版本的函数

    系统只是将函数中的字符串通过进程默认堆将其转换成Unicode字符串

    再调用Unicode版的API

    Unicode是个发展方向

    大家应该养成使用它的习惯而不是ANSI

    (三)搜索文件、目录 

    主要是用FindFirstFile,FindNextFile,FindClose.这三个函数实现

    值得注意的是在用“*.*”搜索字符串时得到的是程序文件所在目录的所有文件和目录

    而GetCurrentDirectory取得的是系统当前的目录

    后者是随时会随着用户的操作而改变的

    前者只会随着目标程序文件的位置改变而改变

    搜索需要感染的目录和文件时应该重点搜索windows安装目录(GetWindowsDirectory)

    系统目录(GetSystemDIrectory)

    当前目录(GetCurrentDirectory)

    当然程序当前目录也是不可放过的

    比如

    你把QQ感染了

    QQ目录底下那么多常常使用的程序文件

    比如珊瑚虫外挂

    邮箱工具等等都是你的盘中餐了

    我最喜欢感染的地方还是系统中各个进程所在的目录

    那些才是用户最常用的

    我的遂宁一号病毒是通过代码插入的办法做到这点的

    很麻烦,且很不稳定

    常常莫名其妙的使被插入进程在插入时结束掉

    虽然可以用SHE避免

    但是还是没多大效果

    我现在正在构想我的下一个病毒

    那时我将会使用PEB来枚举各个进程所在的目录了

    不再使用代码插入了

    会使病毒稳定的多的

    我在遂宁一号中枚举进程使用的是toolhelp系列函数这样使病毒在Windows98也能正常运行

    (四)感染文件 

    所谓感染就是将病毒程序的代码插入到目标程序中

    然后让目标程序先执行病毒程序的代码

    至于将代码插入到目标程序的什么位置上

    如何使目标程序执行插入的病毒代码

    什么时机对什么文件进行感染都是感染问题的核心

    首先讨论将病毒代码插入到目标程序的什么位置才生效


    Windows平台下的可执行文件都是PE格式的

    这种格式的文件

    你可以将它看成两大部分

    第一部分是描述各类数据存放位置的数据结构

    第二部分就是各种数据,比如资源,代码,数据等等

    因此,想将代码正确插入到目标程序文件中

    就要读取和修改目标程序文件中描述各类数据存放位置的数据结构了

    下面我们来计算下我们的代码插入的位置

    在这里我们讲一个最简单的插入方法

    通过在文件中增加一个新的节区来实现

    根据对齐后新的文件大小对文件重新映射全部文件视图

    这时,文件在磁盘上的大小也相应增加了

  • 相关阅读:
    Linux网络协议栈(三)——网络设备(1)
    Linux网络协议栈(三)——网络设备(2)
    Linux网络协议栈(四)——链路层(1)
    Linux网络协议栈(四)——链路层(2)
    监视系统中进程的创建和终止
    APIHOOK
    APIHOOK
    Try running RemoteDll as Administrator
    用注册表创建无法删除的IE快捷方式
    用注册表创建无法删除的IE快捷方式
  • 原文地址:https://www.cnblogs.com/Cheetos/p/5164746.html
Copyright © 2020-2023  润新知