地址的奇怪错误
Weird bug with addresses
我有几个问题要解决,请帮忙!
我的第一个问题是表达式必须是指向完整对象类型的指针,但是我已经通过在变量之前添加和解决了这个问题,我做得对吗?
下面的代码片段。
LPVOID dll;
PIMAGE_DOS_HEADER dos;
dll = LoadLibraryA(a[1]);
dos = (PIMAGE_DOS_HEADER)dll;
nt = (PIMAGE_NT_HEADERS)(&dll+dos->e_lfanew);
下一个问题是我的程序输出总是不同的,为什么? 我的程序应该显示所有地址和函数名称,下面的代码。
#include<stdio.h>
#include<windows.h>
#include<winternl.h>
int main(int i, char* a[]) {
LPVOID dll, faddr;
PIMAGE_DOS_HEADER dos;
PIMAGE_NT_HEADERS nt;
PIMAGE_EXPORT_DIRECTORY exp;
PWORD f_addr_list, f_name_list;
PWORD f_ord_list;
DWORD rva;
LPSTR fname;
if (i != 2) {
printf("error");
return 0;
}
dll = LoadLibraryA(a[1]);
if (dll == NULL) {
printf("failed to load");
return 0;
}
dos = (PIMAGE_DOS_HEADER)dll;
nt = (PIMAGE_NT_HEADERS)(dll+dos->e_lfanew);
exp = (PIMAGE_EXPORT_DIRECTORY)(&dll + nt->OptionalHeader.DataDirectory[0].VirtualAddress);
f_addr_list = (PDWORD)(&dll + exp->AddressOfFunctions);
f_name_list = (PDWORD)(&dll + exp->AddressOfNames);
f_ord_list = (PWORD)(&dll + exp->AddressOfNameOrdinals);
printf("Total function names: %ldnTotal Function: %ldn", exp->NumberOfNames, exp->NumberOfFunctions);
printf("AddressttttFunction Namen");
printf("-------ttttt----------n");
for (i = 0; i < exp->NumberOfNames; i++)
{
fname = (LPSTR)dll + f_name_list[i];
rva = f_ord_list[i];
faddr = &dll + f_addr_list[rva];
printf("%ptttt%sn", faddr, fname);
}
FreeLibrary(dll);
return 0;
}
示例输出:
C:UsersuserProject2Debug>Project2.exe user32.dll
Total function names: 2
Total Function: 11914128
Address Function Name
------- ----------
C:UsersuserProject2Debug>Project2.exe user32.dll
Total function names: 2
Total Function: 11914128
Address Function Name
------- ----------
C:UsersuserProject2Debug>Project2.exe user32.dll
Total function names: 22826784
Total Function: 2
Address Function Name
------- ----------
里面有什么问题?
在 WIN OS 下,模块句柄是加载到内存中的库的基址。
在地址之前添加&
并不能解决问题,但会创建一个更大的地址,添加导致内存冲突的间接寻址(现在您使用变量dll
的地址作为模块基址(。
您不能对空指针进行数学运算,因为void
没有阻止正确位移计算的大小。将基指针设置为BYTE
指针,而不是将基数大小设为 1。
您尝试执行的操作的工作代码是:
#include<stdio.h>
#include<windows.h>
#include<winternl.h>
int main(int i, char *a[])
{
LPVOID faddr;
BYTE *dll;
PIMAGE_DOS_HEADER dos;
PIMAGE_NT_HEADERS nt;
PIMAGE_EXPORT_DIRECTORY exp;
PDWORD f_addr_list, f_name_list;
PWORD f_ord_list;
DWORD rva;
LPSTR fname;
if (i != 2)
{
printf("errorn");
return 0;
}
dll = (BYTE *)LoadLibraryA(a[1]);
if (dll == NULL)
{
printf("failed to loadn");
return 0;
}
dos = (PIMAGE_DOS_HEADER)dll;
nt = (PIMAGE_NT_HEADERS) (dll + dos->e_lfanew);
exp = (PIMAGE_EXPORT_DIRECTORY) (dll + nt->OptionalHeader.DataDirectory[0].VirtualAddress);
f_addr_list = (PDWORD) (dll + exp->AddressOfFunctions);
f_name_list = (PDWORD) (dll + exp->AddressOfNames);
f_ord_list = (PWORD) (dll + exp->AddressOfNameOrdinals);
printf("Total function names: %ldnTotal Function: %ldn", exp->NumberOfNames, exp->NumberOfFunctions);
printf("AddressttttFunction Namen");
printf("-------ttttt----------n");
for (i = 0; i < exp->NumberOfNames; i++)
{
fname = (LPSTR)(dll + f_name_list[i]);
rva = f_ord_list[i];
faddr = dll + f_addr_list[rva];
printf("%ptttt%sn", faddr, fname);
}
FreeLibrary((LPVOID)dll);
return 0;
}
相关文章:
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 地址的奇怪错误
- 为什么我得到以下代码地址清理器:未知地址错误的SEGV
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- Assimp 库错误:获取打包成员的地址
- 运行时错误地址清理器:LEETCODE 中的致命信号
- 瓦尔格林德错误 - 地址0x0不是堆叠的 malloc'd 或自由的
- 获取未知分段错误"(地址)在 std::__cxx11::basic_string<char, std::char_traits<char>,..., std::分配器<cha
- 来自简单循环的 OpenAcc 错误:内核执行期间的非法地址
- 带有 NORM 的 ZeroMQ - 地址已在使用 错误被抛出在第二个 .bind() 上 - 为什么?
- 重载新返回错误的地址
- 线程 1:xcode 中出现EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)错误
- C++带有 CMakeList 的地址清理器.txt会导致 asan 错误
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- C++ 临时地址不会导致生成错误
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 分段错误:地址未映射/地址失败:(无)
- 为什么在递增后使用 [] 运算符访问指针数组会返回错误地址的当前内存位置
- 绑定错误:地址已在使用中