首页
社区
课程
招聘
未解决 [悬赏]遍历win64PE文件的导入表 5.00雪花
发表于: 2017-5-23 14:56 2896

未解决 [悬赏]遍历win64PE文件的导入表 5.00雪花

2017-5-23 14:56
2896


在遍历某个程序的kernel32.dll对应导入表时,以OriginFirstThunk指向的位置作为IMAGE_THUNK_DATA数组的起始地址,第一个IMAGE_THUNK_DATA是有值的,第二个值则为0,我以为这个数组是以一个全0的元素作为结尾的,可是这就意味着kernel32中只导入了一个函数,这似乎有些问题。如果IMAGE_THUNK_DATA数组不是以0作为数组的结束,那么如何获取数组的大小?



        PIMAGE_THUNK_DATA target_trunk = (PIMAGE_THUNK_DATA)RvaToFileAddress(import_table[i].OriginalFirstThunk);
            int n = 0;
            bool found_func = false;
            while (target_trunk[n].u1.AddressOfData != NULL)
            {
                logptr("ord  :", (void*)target_trunk[n].u1.Ordinal);
                if (!IMAGE_SNAP_BY_ORDINAL(target_trunk[n].u1.Ordinal))
                {
                    //名字导入
                    PIMAGE_IMPORT_BY_NAME func_name = (PIMAGE_IMPORT_BY_NAME)RvaToFileAddress(target_trunk[n].u1.AddressOfData);
                    /*
                    typedef struct _IMAGE_IMPORT_BY_NAME {
                    WORD    Hint;
                    CHAR   Name[1]; //类似余变长数组的trick,在语法中Name标示起始地址
                    } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
                    */
                    logdstr("got function:", func_name->Name);
                    if (strcmp(func_name->Name, funcname) == 0)
                    {
                        found_func = true;
                        logdstr("got match:", funcname);
                        break;
                    }
                }
                n++;
            }



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
2

估计你的程序是WIN32程序,IMAGE_THUNK_DATA 在 WIN32程序里是 IMAGE_THUNK_DATA32

试下直接使用

PIMAGE_THUNK_DATA64 target_trunk = (PIMAGE_THUNK_DATA64)RvaToFileAddress(import_table[i].OriginalFirstThunk);


2017-5-23 17:42
0
雪    币: 730
活跃值: (3385)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
3
应该判断整个import_table[i]是否为0
2017-5-23 17:50
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
就是以全0结束的啊
2017-5-25 17:37
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
关键问题是要考虑代码是编译成32位的还是64位的程序来运行!32有32的道,64有64的桥,要区分对待。
2017-7-28 03:02
0
游客
登录 | 注册 方可回帖
返回
//