首页
社区
课程
招聘
垃圾代码生成
发表于: 2009-3-28 13:13 12584

垃圾代码生成

2009-3-28 13:13
12584
没几行,也没什么用了,放出来,忽悠一些不懂的,效果不错.

/*
__declspec(naked) void pre_poly_handler()
{
	_asm
	{
		pushfd
		add dword ptr [esp], 0xdeadbeef
		sub esp, 4

		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}

__declspec(naked) void post_poly_handler()
{
	_asm
	{
		sub dword ptr [esp+4], 0xdeadbeef
		add esp, 4
		popfd
		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}


DWORD get_stub_size(void* stub_address)
{
	BYTE stub_end[] = {0x11, 0x11, 0x11, 0x11};
	DWORD stub_size = 0;
	while(TRUE)
	{
		if(!memcmp((BYTE*)stub_address + stub_size, stub_end, sizeof(stub_end)))
		{
			return stub_size;
		}
		stub_size++;
	}
}

DWORD get_stub_fixup_offset(void* stub_address, DWORD magic, DWORD size)
{
	DWORD offset = 0;
	while(offset < size)
	{
		if(!memcmp((BYTE*)stub_address + offset, &magic, sizeof(DWORD)))
		{
			return offset;
		}
		offset++;
	}
	return 0;
}

__declspec(naked) void poly_jmp()
{
	_asm
	{
		_emit 0xe9
		_emit 0xef
		_emit 0xbe
		_emit 0xad
		_emit 0xde

		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}
__declspec(naked) void poly_call1()
{
	_asm
	{
		sub esp, -4
		_emit 0xe8
		_emit 0xef
		_emit 0xbe
		_emit 0xad
		_emit 0xde

		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}

__declspec(naked) void poly_call2()
{
	_asm
	{
		add esp, 4
		_emit 0xe8
		_emit 0xef
		_emit 0xbe
		_emit 0xad
		_emit 0xde

		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}
__declspec(naked) void poly_call3()
{
	_asm
	{
		pop dword ptr [esp-4]
		_emit 0xe0
		_emit 0xef
		_emit 0xbe
		_emit 0xad
		_emit 0xde

		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}
__declspec(naked) void poly_call4()
{
	_asm
	{
		lea esp, dword ptr[esp+4]
		_emit 0xe0
		_emit 0xef
		_emit 0xbe
		_emit 0xad
		_emit 0xde

		_emit 0x11
		_emit 0x11
		_emit 0x11
		_emit 0x11
	}
}

void make_poly(BYTE* buf, DWORD size)
{
	DWORD tmp = 0;
	DWORD key = 0;
	DWORD offset = 0;
	DWORD pre_poly_size = get_stub_size((void*)pre_poly_handler);
	DWORD post_poly_size = get_stub_size((void*)post_poly_handler);
	DWORD poly_jmp_size = get_stub_size((void*)poly_jmp);
	DWORD poly_call1_size = get_stub_size((void*)poly_call1);
	DWORD poly_call2_size = get_stub_size((void*)poly_call2);
	DWORD poly_call3_size = get_stub_size((void*)poly_call3);
	DWORD poly_call4_size = get_stub_size((void*)poly_call4);
	DWORD puresize = size - post_poly_size;
	memset(buf, 0x90, size);
	BYTE lastjunk = 0;
	BYTE junk = 0;
	if(size < pre_poly_size + poly_call4_size + post_poly_size)
	{
		return;
	}

	key = GetRandomDword();
	memcpy(buf, (void*)pre_poly_handler, pre_poly_size);
	memcpy(buf + get_stub_fixup_offset(buf, 0xdeadbeef, pre_poly_size), &key, sizeof(DWORD));
	offset += pre_poly_size;
	while(offset + poly_call4_size <= puresize)
	{
		DWORD tmp = GetRandomByte()%5;
		switch(tmp)
		{
			case 0:
				memcpy(buf + offset, (void*)poly_jmp, poly_jmp_size);
				offset += poly_jmp_size;
				break;
			case 1:
				memcpy(buf + offset, (void*)poly_call1, poly_call1_size);
				offset += poly_call1_size;
				break;
			case 2:
				memcpy(buf + offset, (void*)poly_call2, poly_call2_size);
				offset += poly_call2_size;
				break;
			case 3:
				memcpy(buf + offset, (void*)poly_call3, poly_call3_size);
				offset += poly_call3_size;
				break;
			case 4:
				memcpy(buf + offset, (void*)poly_call4, poly_call4_size);
				offset += poly_call4_size;
				break;

		}
		tmp = GetRandomByte()%0x50;
		if(offset + tmp <= puresize)
		{
			if(GetRandomByte()%3 == 0 && tmp >=post_poly_size)
			{
				memcpy(buf + offset, (void*)post_poly_handler, post_poly_size);
				memcpy(buf + offset + get_stub_fixup_offset(buf + offset, 0xdeadbeef, post_poly_size), &key, sizeof(DWORD));
				offset +=post_poly_size;
				tmp -= post_poly_size;
			}
			else if(GetRandomByte()%3 == 0 && tmp >=pre_poly_size)
			{
				memcpy(buf + offset, (void*)pre_poly_handler, pre_poly_size);
				memcpy(buf + offset + get_stub_fixup_offset(buf + offset, 0xdeadbeef, pre_poly_size), &key, sizeof(DWORD));
				offset +=pre_poly_size;
				tmp -= pre_poly_size;
			}
			while(tmp > 0)
			{
				junk = GetRandomByte();
				if(junk == 0xde && lastjunk == 0xad)
				{
					junk++;
				}
				lastjunk = junk;
				memcpy(buf + offset, &junk, sizeof(BYTE));
				offset++;
				tmp--;
			}
		}
	}

	DWORD fixup_offset = 0;
	DWORD dest_offset = 0;
	DWORD dest_offset_diff = 0;

	fixup_offset = get_stub_fixup_offset(buf, 0xdeadbeef, puresize);
	memset(buf + fixup_offset, 0, sizeof(DWORD));

	while(get_stub_fixup_offset(buf, 0xdeadbeef, puresize))
	{
		tmp = GetRandomByte();
		while(tmp > puresize)
		{
			tmp = GetRandomByte();
		}
		if(GetRandomByte()%2)
		{
			if(get_stub_fixup_offset(buf + tmp, 0xdeadbeef, puresize - tmp))
			{
				dest_offset = tmp + get_stub_fixup_offset(buf + tmp, 0xdeadbeef, puresize - tmp);
			}
		}
		else
		{
			if(get_stub_fixup_offset(buf + puresize - tmp, 0xdeadbeef, tmp))
			{
				dest_offset = puresize - tmp + get_stub_fixup_offset(buf + puresize - tmp, 0xdeadbeef, tmp);
			}
		}
		if(dest_offset != 0)
		{
			dest_offset_diff = dest_offset - fixup_offset - 5;
			if(*(buf + dest_offset - 1) == 0xe0)
			{
				dest_offset_diff -= 4;
			}
			else if(*(buf + dest_offset - 1) == 0xe8)
			{
				dest_offset_diff -= 3;
			}
			if(*(buf + fixup_offset - 1) == 0xe0)
			{
				memset(buf + fixup_offset - 1, 0xe8, sizeof(BYTE));
			}
			memcpy(buf + fixup_offset, &dest_offset_diff, sizeof(DWORD));
			fixup_offset = dest_offset;
			memset(buf + fixup_offset, 0, sizeof(DWORD));
		}
	}
	dest_offset = puresize - fixup_offset - 5 + 1;
	if(*(buf + fixup_offset - 1) == 0xe0)
	{
		memset(buf + fixup_offset - 1, 0xe8, sizeof(BYTE));
	}
	memcpy(buf + fixup_offset, &dest_offset, sizeof(DWORD));

	DWORD fill_size = puresize - offset;
	wmc.FillBytes((char*)buf + offset, fill_size);
	offset += fill_size;

	memcpy(buf + puresize, (void*)post_poly_handler, post_poly_size);

	memcpy(buf + puresize + get_stub_fixup_offset(buf + puresize, 0xdeadbeef, post_poly_size), &key, sizeof(DWORD));


}

*/

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发
看来这就是NP的萎缩了
2009-3-28 13:15
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
3
早就不用这个了.
2009-3-28 13:18
0
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
4
我只是过来膜拜的
2009-3-28 14:30
0
雪    币: 233
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
强     
2009-3-28 17:31
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我来膜拜Nooby的。
2009-3-28 19:02
0
雪    币: 220
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
功能类似花?
起干扰作用的?
2009-3-28 20:24
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
8
友情支持
2009-3-28 21:04
0
雪    币: 240
活跃值: (204)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢。这段时间在写自己的加密程序,用的上
2009-4-6 10:28
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
TAG: NP早已不用而我视若神明的JUNK垃圾代码生成 花指令
2009-4-6 18:01
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这句话是什么意思, 这是NP的浓缩?

另外上面的代码也看不明白呀,

  key = GetRandomDword(); 这个函数用 rand替换可行不?

wmc.FillBytes((char*)buf + offset, fill_size);

wmc 又是什么类?

怎么样编译成功呢>?
2009-4-7 04:21
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
太强了,我找了很久,原来在这里
2009-4-7 08:41
0
雪    币: 7309
活跃值: (3778)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
13
上个月就发了?
我居然没看到,罪过罪过
2009-4-7 10:53
0
雪    币: 28961
活跃值: (7443)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
14
太强了,Google不到,这里找到了
2009-4-7 11:00
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
15
.................................晕。。

06年小零就放过一个Executable Trash Generator,没人顶。
...................这个这么多人顶。
http://bbs.pediy.com/showthread.php?t=33642
2009-4-8 11:10
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
那个贴子我很想顶
但是关闭了啊
2009-4-8 11:50
0
雪    币: 7309
活跃值: (3778)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
17
ETG的asm代码被杀软杀了
2009-4-8 23:15
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
18
支持啊123
2009-4-10 00:37
0
雪    币: 264
活跃值: (11)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
19
学会了先山寨走..
2009-4-10 01:53
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
20
我觉得我和你的区别在于我放的是注释掉的东西。
2009-4-11 23:34
0
雪    币: 8149
活跃值: (1875)
能力值: ( LV8,RANK:122 )
在线值:
发帖
回帖
粉丝
21
学习一下
2009-4-12 02:37
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
尝试编译了一下。
发现一个很奇怪的问题

函数放在不同的地方长度居然不一样

pre_poly_size[167] + poly_call4_size[132] + post_poly_size[142]

pre_poly_size[161] + poly_call4_size[126] + post_poly_size[136]

而且没弄明白这些函数的size怎么会这么大

还有一个不明白的地方 只看到e0 e8,e9呢

有C语言原文件都看不懂,更别说如果是汇编了。。

差的不是一点半点呀

Nooby应该出来解读解读。
2009-4-13 22:36
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
莫非是debug。。。
2009-4-13 22:46
0
游客
登录 | 注册 方可回帖
返回
//