这是我的disas代码:
0x0804844d <+0>: push %ebp
0x0804844e <+1>: mov %esp,%ebp
0x08048450 <+3>: and $0xfffffff0,%esp
0x08048453 <+6>: sub $0x20,%esp
0x08048456 <+9>: movl $0x8048540,(%esp)
0x0804845d <+16>: call 0x8048310 <puts@plt>
0x08048462 <+21>: lea 0x1c(%esp),%eax
0x08048466 <+25>: mov %eax,0x4(%esp)
0x0804846a <+29>: movl $0x8048555,(%esp)
0x08048471 <+36>: call 0x8048320 <scanf@plt>
0x08048476 <+41>: mov 0x1c(%esp),%eax
0x0804847a <+45>: cmp $0x208c,%eax
0x0804847f <+50>: jne 0x804848f <main+66>
0x08048481 <+52>: movl $0x8048558,(%esp)
0x08048488 <+59>: call 0x8048310 <puts@plt>
0x0804848d <+64>: jmp 0x804849b <main+78>
=> 0x0804848f <+66>: movl $0x8048569,(%esp)
0x08048496 <+73>: call 0x8048310 <puts@plt> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用memcpy获取函数地址以将其内容复制到缓冲区中.
我遇到的问题是获取功能地址.这是我的代码:
__declspec(noinline) int gio()
{
const char yle[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
return 7;
}
int main(int argc, TCHAR* argv[])
{
int(*funcptr)() = gio;
unsigned char *p = (unsigned char *)&funcptr;
size_t ik;
for (ik = 0; ik < sizeof funcptr; ik++)
{
printf("%02x ", p[ik]);
}
putchar('\n');
printf("gio x -> %x\n", gio);
printf("gio p -> %p\n", gio);
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个小测试程序,我尝试以不同的方式打印函数地址.
我正在使用Visual Studio并关闭了优化和内联函数扩展(但无论如何都使用了无内联).所有的打印语句都打印相同的输出(0x00d213ca 截图),但是当我把光标(在VS内)放在gio功能上时,它显示完全不同的地址(0x00d218c0 截图).
当我右键单击gio功能时,Go To Dissasembler我跳到我把光标放在它上面时显示的地址(0x00d218c0 截图).这清楚地表明了这个功能的真正含义.
我在这里有点困惑,似乎我不明白的东西.
为什么print语句显示不正确的值?获取"真实"功能地址的方法是什么?
I'm new with c++ and currently came across with constexpr. As I realize constexpr functions are evaluated at compile time. Here is my source code:
constexpr int sum(float a, int b)
{
return a + b;
};
int main(int argc, char *argv[])
{
std::cout << sum(1, 2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
It is a simple function which just sums to integers. The problem is that when I set breakpoint at return a + b and start debugging, the breakpoint is …
我是C ++的新手,目前正在从事某些项目,并希望使用C ++而不是C。
我遇到的第一个问题是,例如在OpenSSL中,有接受char*参数的函数。
在C ++中,使用不是一个好主意char*。我读过有人建议std::string或std::vector<char>代替。
但是例如OpenSSL中的BIO_read(将数据写入char*)函数accepts char*。std::string具有功能,c_str()但返回const char*。我知道我可以const使用const_cast强制转换,但这不是一个好主意,因为这不是应该更改字符串的方式。
这个问题的“ C ++解决方案”是什么?我想同时使用RAII和OOP原则。我唯一想到的解决方案是创建一个类,该类将在构造函数中接受内存大小作为参数,并具有类似这样的内容char* _buf = new char[size]并在析构函数中释放内存。这是针对这种情况的最佳解决方案吗?
还是在我recv不知道大小的情况下应该使用从套接字接收的数据呢?在CI中,将使用分配内存malloc并将其写入那里。但是,我该如何以“ C ++风格”做到这一点?创建我上面提到的类,并使用它代替malloc?