首页
社区
课程
招聘
[原创]逆向应该知道的~!
发表于: 2009-6-29 18:33 7396

[原创]逆向应该知道的~!

2009-6-29 18:33
7396

前段时间,发的贴受到很大的争议,所以,为了避免类似的情况,我想说明一下,此贴只适应对逆向有兴趣爱好的朋友,而且是对逆向有浓厚兴趣的初学者,如果,读贴者高人也,可以JMP或RETURN,如果读贴者是学习者,请CALL。当觉得此贴对你没有任何价值时,或觉得是忽悠的话,请忽略RETURN,我只写给需要的朋友,请口留吉言,在此,谢过~~!我不想因为我的贴给PEDIY带来没必要的麻烦,此贴,也没太多技术含量只是一些方法和思路,并不探讨高深技术,所以初学者只要懂点汇编,应该都很快就能明白,如那些地方说的不明白,只管跟贴询问,我看到自然就回答了,^_^。
        正题开始…………

        逆向有个误区,需要说明,如果是需要了解流程,完全没必要这样,只需要看懂代码整体实现,类自行写出类似代码,这个不算是逆向,逆向就是要写出几乎编译结果一样的代码。要做到这个是十分不容易的,编译有着太多的不确定,所以要写出编译结果完全一样的代码,以前的我也觉得不可能,可现在似乎我不这么认为,在我的手里已经有编译结果完全一样的代码,编译结果完全一样代表是逆出原来的代码了吗?答案是否,只能说是接近了原来的代码,但是无法完全复原出原来的代码,这又是个误区。逆向比较忌讳这样的做法:

//列如这样,比较复杂点算术函数,由于符点,不太好懂,索性直接嵌入汇编了事,运行结果完全没问题似乎编译结果也是完全一样的,但是,它根本不算什么逆向,只能说是个残废。

void     AngleMatrix(float* unk1,float* unk2)
{
    float   dunk1;

	dunk1 = unk1[2]*_real_004A6CBC;
	float   dunk2=(float)sin((double)dunk1);
	float   dunk3=(float)cos(dunk1);

	dunk1 = unk1[1]*_real_004A6CBC;
	float   dunk4=(float)sin((double)dunk1);
	float   dunk5=(float)cos(dunk1);

	dunk1 = unk1[0]*_real_004A6CBC;
	float   dunk6=(float)sin((double)dunk1);
	float   dunk7=(float)cos(dunk1);

	*unk2=dunk5*dunk3;
	*(unk2+0x04)=dunk5*dunk2;

	_asm{
		fld   dunk4
		fchs
		mov   edx,unk2
		fstp  dword ptr[edx+0x20]
	}

	_asm{
		fld   dunk6
		fmul  dunk4
		fmul  dunk3
		fld   dunk2
		fchs
		fmul  dunk7
		faddp st(1),st
		mov   eax,unk2
		fstp  dword ptr[eax+0x04]
		fld   dunk6
		fmul  dunk4
		fmul  dunk2
		fld   dunk7
		fmul  dunk3
		faddp st(1),st
		mov   ecx,unk2
		fstp  dword ptr[ecx+0x14]
		fld   dunk6
		fmul  dunk5
		mov   edx,unk2
		fstp  dword ptr[edx+0x24]
		fld   dunk7
		fmul  dunk4
		fmul  dunk3
		fld   dunk6
		fchs 
		fld   dunk2
		fchs
		fmulp st(1),st
		faddp st(1),st
		mov   eax,unk2
		fstp  dword ptr[eax+0x08]
		fld   dunk7
		fmul  dunk4
		fmul  dunk2
		fld   dunk6
		fchs
		fmul  dunk3
		faddp st(1),st
		mov   ecx,unk2
		fstp  dword ptr[ecx+0x18]
	}
	*(unk2+0x0A)=dunk7*dunk5;
	unk2[0x03]=0;
	unk2[0x07]=0;
	unk2[0x0B]=0;
}

//我们为什么不吧它写成这样的呢?这段代码和原来的代码编译出来的结果是完全一样的,但是为什么,我们不去花点精神,去把它写好呢,虽然算术符点有点麻烦,但是整体来看,似乎它还是那么的容易,这样的代码是接近原代码了,但是它并不是原来的代码,原来的代码至少有X和Y之类的变量名,而我却用A-Z类代之。但是这样的代码是不是变的十分好懂了许多,我们可以发现,原代码的书写者很有可能是C程序原,在我逆的时候发现了,变量定义与C++的不同。我们可以根据逆出来的代码分析出写代码的人的水平等等~~!

void		AngleMatrix( float * fBuffer1, float fBuffer2[] )
{
	//	
	float	fA,fB,fC,fD,fE,fF,fG;		//04,08,0C,10,14,18,1C
	
	//
	fA = fBuffer1[2] * 0.01745329f;
	
	//
	fD = sin( fA );
	fG = cos( fA );

	//
	fA = fBuffer1[1] * 0.01745329f;

	//
	fC = sin( fA );
	fF = cos( fA );

	//
	fA = fBuffer1[0] * 0.01745329f;
	
	//
	fB = sin( fA );
	fE = cos( fA );

	//
	fBuffer2[0] = fF *fG;
	fBuffer2[4] = fF *fD;

	//
	fBuffer2[8] = -fC;

	fBuffer2[1] = fB * fC * fG + ( -fD * fE );
	fBuffer2[5] = fB * fC * fD + ( fE * fG );

	fBuffer2[9] = fB * fF;

	//
	fBuffer2[2] = fE * fC * fG + ( -fB * -fD );

	//
	fBuffer2[6] = fE * fC * fD + ( -fB * fG );

	//
	fBuffer2[10] = fE * fF;

	//
	fBuffer2[3] = 0;
	fBuffer2[7] = 0;
	fBuffer2[11] = 0;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
支持梦婷姐姐
但是真的有必要挑战编译器吗,想完全一样用__declspec(naked)直接写就和谐,汇编式的C太雷人了
2009-6-29 18:44
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
3
感谢美女的好文章。

学习了~~
2009-6-29 19:02
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好文。不过说着容易做着难~~~
2009-6-29 21:52
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主说的是有道理
但是只能说是有兴趣或者搞研究的话,才有必要做到这种程度

如果真正把逆向用到工作上,就没有必要像楼主说的这样了
2009-6-30 13:44
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
6
好文章,进来支持一下!
2009-6-30 14:14
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
7
这样把逆向做到极致是好的,也是很有挑战性的,不过一般情况下大家只把逆向作为了解程序原理、逻辑的手段,而不是把完美的逆向作为目的,不是“为了逆向而逆向”。因此从追求逆向能力的技术角度上看这是很值得的,但是如果目的不同的话,不可能每次逆向都去做到这种程度。
2009-6-30 14:41
0
游客
登录 | 注册 方可回帖
返回
//