我需要能够编辑存储在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
}
}
答案 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;
}