【问题标题】:Hooking to a program structure safely with std::atomic<int> for threaded access?使用 std::atomic<int> 安全地挂接到程序结构以进行线程访问?
【发布时间】:2013-09-28 13:55:48
【问题描述】:

我想知道是否可以将“原子访问”(C++11 特性)用于从注入到另一个进程的 DLL 中的多线程访问。

例如,我们有这个程序:

struct SSomeStructure
{
    int value_a;
    int value_b;
};

int main()
{
    SSomeStructure some_variable;
    while(!GetAsyncKeyState('Q'))//loop while Q is not pressed
    {
        std::cout << some_variable.value_a << some_variable.value_b;
        some_variable.value_a = GetTickCount();
        some_variable.value_b = -some_variable.value_a;
        std::cout << some_variable.value_a << some_variable.value_b;
    }
}

并且程序是闭源的,但是我已经反汇编了“SSomeStructure”结构:

struct SSomeStructure
{
    int value_a;
    int value_b;
};

现在我正在编写一个将被注入到进程中的 DLL,但是除了 std::out 之外没有什么可以挂钩的,因此,无需挂钩而是创建另一个线程,以安全地访问/修改这些变量,它们需要是原子的,对吧?

所以我想在我的(伪代码)DLL 中创建它:

#include <atomic>
#include <thread>

//disasembled structure, but added syd::atomic
struct SSomeStructure
{
    std::atomic<int> value_a;
    std::atomic<int> value_b;
};

//start thread when dll loads etc...

void SomeThread()
{
    SSomeStructure * some_variable = ObtainAddressOfSomeVariableFromHostProcess();
    while(true)
    {
        some_variable->value_a = 1337;//is this now an atomic operation which is thread-safe?
    }
}

运行它自己的线程的“hack” dll 中的 std::atomic 是否会提供对主机进程中全局变量的安全多线程访问? (因为 DLL 在宿主进程中以原子方式访问值?)

【问题讨论】:

    标签: c++ multithreading dll c++11 shared-memory


    【解决方案1】:

    正式地,这个程序表现出未定义的行为;您正在通过指向另一种不相关类型的指针访问一种类型的对象。

    它在实践中也行不通。探戈需要两个:对于两个线程来观察标量对象的一致状态,两个线程必须使用原子指令来访问和修改它。可以这样想:你可以在增加一个计数器之前获得一个锁,但是如果另一个线程在没有首先获得相同的锁的情况下增加所述计数器,它对你没有任何好处。

    在限制中,主机进程可能已将some_variable-&gt;value_a 的值加载到寄存器中,并且根本没有观察到您的任何修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2015-03-03
      • 2014-02-28
      • 2021-08-13
      • 2017-10-18
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多