能够发帖,图应该不需要审核,是你编辑帖子的问题。
报
“0xC0000005: Access Violation”错,这是内存访问的问题,说明你有地方改得不对。
由于看不到图,只能从你的描述猜测。
1.找一片连续为0代码地址,将已有的导入表COPY过去。
2.增加一个IMAGE_IMPORT_DESCRIPTOR结构,并填写数据。情况如下图
3.修改程序导入表地址,和大小字段
这样看来,可能是IMAGE_IMPORT_DESCRIPTOR的内容有问题!
[FONT="Courier"]typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics; // 0 for terminating null import descriptor
DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
};
DWORD TimeDateStamp; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
DWORD ForwarderChain; // -1 if no forwarders
DWORD Name;
DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;[/FONT]
其中,Name和FirstThunk两个字段必填。
Name:一个RVA指针,指向导入lib名。比如你的情况为指向"mydll.dl\0"。
FirstThunk:一个RVA指针,指向IMAGE_THUNK_DATA32/IMAGE_THUNK_DATA64链表。表以一个NULL结束。
[FONT="Courier"]typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;
typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;[/FONT]
这里最常见的两种导入方式:by Ordinal或by Name。
如果是"by Ordinal",就填你导入函数的Ordinal。
如果是"by Name",又是一个RVA指针,指向IMAGE_IMPORT_BY_NAME。
[FONT="Courier"]typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;[/FONT]
其中Name必填,指向你的导入函数名,比如"MyFunction1\0"。
PS:DLL不一定非得有导出函数,DllEntry总归是有的。有人会把DllEntry也当作一个导出函数。
也就是说,当这个DLL载入时,该做的事情在DllEntry里去完成。也许有函数在DLL里,你在DLL的Exports里没有列出来,这时需要硬编码:得到你DLL的载入基址后,加上你导出函数的RVA,再Call过去。
DLL在卸载时,DllEntry会被再调用一次,给你一个Cleanup的机会。
在作系统DLL Hook的时候,你得“继承”原DLL的所有导出项,选其中一个或几个导出函数作为Monitor,在时机成熟时再做Patching,比如一个加了壳的目标解压缩完成后。