首页
社区
课程
招聘
[求助]修改IMPORT ADDRESS TABLE的疑问
发表于: 2008-8-5 11:16 3837

[求助]修改IMPORT ADDRESS TABLE的疑问

2008-8-5 11:16
3837
在一篇文章看到,WINDOW使用flat memory model,所以可以在队列中存放机器指令,这样就可以当作函数来调用。

但是我的疑问是,机器指令可以放在任何地方来调用?还是必须是指令指针指的地方才算指令?

修改IMPORT ADDRESS TABLE ENTRY,存放CALL指令,会被调用?

原来在IMPORT ADDRESS TABLE ENTRY中存放的不是一个地址吗?现在修改成CALL指令,这样会被调用?

下边是文章里边的代码:

struct RelocatedFunction{DWORD proxyptr;
    DWORD funtioncptr;char *dllname;char *functionname;};

BYTE* ptr=(BYTE*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,32);
RelocatedFunction * reloc=(RelocatedFunction*)&ptr[6];
DWORD addr=(DWORD)&ProxyProlog;
reloc->proxyptr=addr;
reloc->funcname= functionname;
reloc->dllname=dllname;
memmove (&reloc->functionptr, IATentryaddress,4);
ptr[0]= 0xFF; ptr[1]= 0x15;
//这里就是CALL的机器码
memmove(&ptr[2],&reloc,4);
DWORD byteswritten;
WriteProcessMemory(GetCurrentProcess(),IATentryaddress,&ptr,4,&byteswritten);

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
我很想回答你的问题,但是你的描述让我根本不明白你想问什么。。。
2008-8-5 11:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
基础差,有点晕,都语无伦次了,不好意思。

IMAGE_IMPORT_DESCRIPTOR
*descriptor=
      (IMAGE_IMPORT_DESCRIPTOR *)(BYTE*) hMod +
      opthdr->DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT].
VirtualAddress;

while(descriptor ->FirstThunk)
{
    char*dllname=(char*)((BYTE*)hMod+ descriptor ->Name);

    IMAGE_THUNK_DATA* thunk=( IMAGE_THUNK_DATA*)((BYTE*) hMod +
                                 descriptor ->OriginalFirstThunk);

    int x=0;
    while(thunk->u1.Function)
    {
        char*functionname=(char*)((BYTE*) hMod +
                ( DWORD)thunk->u1.AddressOfData+2);

        DWORD *IATentryaddress=( DWORD *)((BYTE*) hMod +
                descriptor->FirstThunk)+x;
        x++; thunk++;
    }

    descriptor++;
}

上面是文章里的代码段。

WriteProcessMemory(GetCurrentProcess(),IATentryaddress,&ptr,4,&byteswritten);

ptr数组里存放了call指令,

这样修改,这个call指令为什么会被执行呢?
2008-8-5 12:15
0
雪    币: 371
活跃值: (67)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
1.如果是将CALL的机器码直接放入IMPORT ADDRESS TABLE,然后再通过ORDIANL,NAME调用是不会执行CALL的,而执行JMP xxxx15ff之类的,因为程序会把CALL指令当成地址.
2.后边那一段代码看不懂.
2008-8-5 12:18
0
游客
登录 | 注册 方可回帖
返回
//