如何从地址获取字符串?

时间:2017-04-05 03:01:08

标签: c++ reverse-engineering memory-editing

我不知道如何从C ++中的地址获取字符串。

假装这是地址:0x00020348 假装这个地址具有价值"美味"

我如何获得字符串"美味"从地址0x00020348? 谢谢。

1 个答案:

答案 0 :(得分:1)

这个答案是为了在评论中帮助扩展我们的对话。

请参阅以下代码作为示例:

#include <stdio.h>
#include <string.h>
#include <string>

int main()
{
    // Part 1 - Place some C-string in memory.
    const char* const pszSomeString = "delicious";
    printf("SomeString = '%s' [%08p]\n", pszSomeString, pszSomeString);

    // Part 2 - Suppose we need this in an int representation...
    const int iIntVersionOfAddress = reinterpret_cast<int>(pszSomeString);
    printf("IntVersionOfAddress = %d [%08X]\n", iIntVersionOfAddress, static_cast<unsigned int>(iIntVersionOfAddress));

    // Part 3 - Now bring it back as a C-string.
    const char* const pszSomeStringAgain = reinterpret_cast<const char* const>(iIntVersionOfAddress);
    printf("SomeString again = '%s' [%08p]\n", pszSomeStringAgain, pszSomeStringAgain);

    // Part 4 - Represent the string as an std::string.
    const std::string strSomeString(pszSomeStringAgain, strlen(pszSomeStringAgain));
    printf("SomeString as an std::string = '%s' [%08p]\n", strSomeString.c_str(), strSomeString.c_str());

    return 0;
}

第1部分 - 变量pszSomeString应代表您尝试搜索的内存中的实际字符串(为了您的示例,为0x00020348,但是为int)。< / p>

第2部分 - 您提到您将指针值存储为iIntVersionOfAddress,因此const char* const是指针的整数表示。

第3部分 - 然后我们取整数“指针”并将其恢复为std::string,以便可以将其视为C字符串。

第4部分 - 最后我们使用C字符串指针和字符串的长度构造'\0'。你实际上不需要这里的字符串长度,因为C字符串是空字符(std::string) - 已终止,但是我在你的情况下说明SomeString = 'delicious' [0114C144] IntVersionOfAddress = 18137412 [0114C144] SomeString again = 'delicious' [0114C144] SomeString as an std::string = 'delicious' [0073FC64] 构造函数的这种形式我必须自己逻辑地计算出长度。

输出如下:

std::string

指针地址会有所不同,但前三个十六进制指针值与预期的相同。为void*版本构造的新字符串缓冲区是一个完全不同的地址,也是预期的。

最后注意事项 - 对您的代码一无所知,int通常被认为是通用指针的更好表示而不是 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int pos = ((LinearLayoutManager)(recyclerView.getLayoutManager())).findFirstVisibleItemPosition(); btnAction(pos,5); } }); private void btnAction(int position, int bannerListSize) { for (int i = 0; i < bannerListSize; i++) { ImageView imageView = (ImageView) linlay_pager.getChildAt(i); if (i == position) { imageView.setImageDrawable(mVectorPagerFillCircle); } else { imageView.setImageDrawable(mVectorPagerCircle); } } }