如何通过C ++编辑存储在地址中的值?

时间:2015-02-28 23:19:51

标签: c++ assembly x86 inline-assembly

我需要能够编辑存储在ECX&中的两个地址所指向的两个存储区域。 EAX注册。

我通过在客户端原始的可执行文件中放置一个代码洞来跳转到我的Prepare_Encrypt()函数。

我的一般想法是Prepare_Encrypt()将获取地址,并且应该能够以某种方式使用它们来创建指向C ++中数据的指针。

一旦创建了指针,我就会创建一个For循环,它将对指针中的每个字符值执行XOR运算。

我是使用内联汇编的新手,所以我真的希望按照我想要的方式工作。

我想创建一个char *并使用MOV操作会起作用,但它没有。有没有人对如何使这个工作有任何想法?

这是我当前的Prepare_Encrypt()函数和我当前的Encrypt()函数。

DWORD_PTR* data1_address = NULL;
DWORD_PTR* data2_address = NULL;

void Encrypt()
{
    // Somehow create a pointer to the memory location at the address stored in data1_address & data2_address. Something like this...
    //char* data1_pointer = CreatePointerFromAddress(data1_address);
    //char* data2_pointer = CreatePointerFromAddress(data2_address);

    for(var i = 0; i < sizeof(data1_pointer); i++)
    {
        data1_pointer[i] ^= 200;
    }

    for(var i = 0; i < sizeof(data2_pointer); i++)
    {
        data2_pointer[i] ^= 125;
    }
}

_declspec(naked) void Prepare_Encrypt()
{
    // Save program state.
    __asm
    {
        MOV ECX, ESI
        MOV DWORD PTR SS : [ESP+0x1C], EAX
        PUSHAD
        PUSHFD

        // Get Current Data From Memory
        MOV data1_address, ECX
        MOV data2_address, EAX
    }

    Encrypt();

    // Restore the program state and return to original code.
    __asm
    {
        POPFD
        POPAD
        JMP SendJMPTo
    }
}

1 个答案:

答案 0 :(得分:0)

如果你想对它们做一些事情,你需要知道两个数组的大小。

使用全局变量(即.data部分)或将它们作为参数推送到Encrpyt()

有些事情:

#include "stdio.h"

void* pdata1 = NULL;
void* pdata2 = NULL;
size_t size_data1 = 0;
size_t size_data2 = 0;

/* test stuff */

void* test1 = NULL;
void* test2 = NULL;

void test(){
    test1 = malloc(0x100);
    memset(test1, 0x41, 0x100);
    test2 = malloc(0x100);
    memset(test2, 0x43, 0x100);
}

/* end test stuff*/

void Encrypt() {
    for (int i = 0; i < size_data1; ++i) {
        ((char*)(pdata1))[i] ^= 0x42;
    }

    for (int i = 0; i < size_data2; ++i) {
        ((char*)(pdata2))[i] ^= 0x42;
    }
}


_declspec(naked) void Prepare_Encrypt() {
    __asm{
            ; test stuff
            mov ecx, test1
            mov eax, test2
            ; end test

            pushad
            pushfd

            ; set pointers
            mov pdata1, ecx
            mov pdata2, eax

            ; set sizes
            mov size_data1, 100h
            mov size_data2, 100h

    }

    Encrypt();

    __asm {
        popfd
        popad

        ;.... return somewhere
        ret
    }

}

int main(int argc, char *argv[])
{

    test();

    Prepare_Encrypt();

    return 0;
}