标签: codecave

什么是代码洞穴,是否有任何合法用途?

我在StackOverflow问题中第一次遇到这个词" C#理论:将一个JMP写入asm中的编解码器 ".根据维基词典,我看到一个代码洞穴是:

一个未使用的内存块,有人(通常是软件破解者)可以使用它来注入自定义编程代码来修改程序的行为.

我找到了正确的定义吗?如果是这样,代码洞穴是否有合法用途?

assembly terminology definition self-modifying codecave

25
推荐指数
6
解决办法
1万
查看次数

C#理论:将一个JMP写入asm中的编解码器

让我们假设我已经分配了我的编解码器使用VirtualAllocEx的地址(它返回地址),并使用我的代码将代码写入该地址WriteProcessMemory().

这是问题:

如何写一个跳转到我的编解码器?我知道跳转以" E9" 开头,但是如何将返回的地址VirtualAllocEx转换为正确的UInt32(dword),以便调试器/编译器能够理解指令?

例如:

我在地址00402020(原生应用程序的OEP).我写了一个跳转到004028CF(空地方)" JMP 004028CF".以字节为单位的指令如下所示:

CPU Disasm
Address   Hex dump      Command                                  Comments
00402020  E9 AA080000   JMP 004028CF
Run Code Online (Sandbox Code Playgroud)

" E9"是我们如何表明JMP.怎么样" AA080000",我该如何生成呢?

我需要做类似的事情,所以我可以将JMP初始化为我的codecave,它将位于返回的地址VirtualAllocEx().

任何帮助将不胜感激!

提前致谢.

c# assembly codecave

6
推荐指数
1
解决办法
2760
查看次数

使用注入的DLL从远程进程调用函数

我看到了一个类似但仍然不同的问题,所以只是为了澄清这不是13428881的欺骗(在注入的DLL中调用函数).

我现在所拥有的:一个DLL,注入到目标进程中,显示​​一个消息框并摆弄数学.

我将来想要的是:一个可以操纵和玩弄目标进程内部的DLL.

实现所需操作的下一步是在我注入的进程中调用远程线程中的方法.

让我们举一个例子:我有一个C++应用程序,它有int main,让我们说它看起来像这样:

int PrintText(string text)
{
    cout << text;
    return 1;
}

int main()
{
    while (true)
    {
        PrintText("From the DLL");
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,这很可爱,我的目标应用程序目前正在打印一些文本,而且它似乎非常愉快地这样做.它以令人难以置信的速度向它发送垃圾邮件,但如果我需要的话,我可以使用线程和睡眠等来降低速度.事实是这不是问题,这里的代码没有编译或测试,我也不打算使用这个确切的代码.我实际上正在玩游戏.

现在,假设我创建了一个指向方法PrintText的指针,并且我知道该进程中的地址.我如何在外部调用它,传递参数?

在本地,我相信它看起来像这样:

int i;
int (*PrintSomeText)(string) = PrintText;
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用引用调用此函数,如下所示:

i = operation("Text to be printed", PrintSomeText);
Run Code Online (Sandbox Code Playgroud)

根据我的理论,这应该声明一个名为i的整数,然后定义一个指向返回int的方法的指针,将一个字符串作为参数,指针存储PrintText中指针的值.(或者那种性质的东西).

非常好,所以我可以通过指针调用我自己的函数,这很好,实际上是破解.我真的对这种能力感到惊讶,现在我感觉像是超人.我会去保存一些婴儿或其他东西,brb.

回来,所以现在我想再继续下去,并采取下一步措施.假设我知道该方法位于目标进程中的地址100处(十进制,我可能会以十六进制表示,因为我使用CheatEngine/OllyDBG来查找目标进程中的方法,但对于此示例,我们'保持简单).

我假设我注入的DLL完全拥有自己的空间,它是否有更高的目标进程访问权限?我怎么能找到这个?

谢谢你的时间,乔希

编辑:一个小小的注释,我正在阅读C++教程书,到目前为止它已被证明是非常有用的.我注意到我忘了包含我的操作方法,所以对于遗失的道歉.如果需要,请告诉我.谢谢!

编辑nr 2:我刚刚编写了一些可编译的代码来测试这个,因为我在没有IDE的情况下从书中写下了大部分这个免费的手,而IDE终于自己配置了,所以这里是我目前的代码与...合作

#include "stdafx.h"
#include <iostream>

using namespace std;

int PrintText(char * Text)
{
    cout << Text << endl;
    return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int (*Print)(char*) …
Run Code Online (Sandbox Code Playgroud)

c++ dll code-injection codecave dll-injection

3
推荐指数
1
解决办法
3133
查看次数

VirtualAlloc C++,注入了dll,asm

我想在应用程序中为我的编解码器保留空间.我使用VirtualAlloc函数来保留这个空间.我有X个问题.

  1. 我应该使用哪些参数(sllocation类型和保护)来为代码洞穴分配内存?

  2. 作为返回值,我得到了我的编解码器的地址.在程序的其他部分我想要JMP到该编解码器.怎么做?我知道(纠正我,如果我错了)JMP采取偏离当前位置的agument nuber.但是我希望JMP能够进行编码.如何计算此偏移量.

在此输入图像描述

c++ memory dll assembly codecave

2
推荐指数
1
解决办法
1708
查看次数

OllyDbg 中的地址在程序重新加载时发生变化

这是我的第一篇文章,我是组装和调试的新手,所以请耐心等待。

我试图将一些代码(对 MessageBoxA 的一个小调用)注入到 Windows 7 记事本可执行文件中。但是,我遇到了地址问题。首先,我在 OllyDbg 中打开 exe,然后我转到包含“notepad.pdb” ASCII 文本的行。然后我在它下面放了一个 ASCII 字符串(例如,“INJECTED NOTEPAD”)。接下来,在下面,我输入了这个汇编代码:

PUSH 0
PUSH address_of_ASCII_string ; In this case, 00A6B668C
PUSH address_of_ASCII_string ; In this case, 00A6B668C
PUSH 0
CALL MessageBoxA
Run Code Online (Sandbox Code Playgroud)

接下来,我转到程序中的第一行代码(只需右键单击并按Go to Origin(或直接按数字键盘上的*))然后我用JMP指令替换第一行到第一个的地址在我注入的代码中按 0。然后,我将替换的指令放在注入代码的末尾。在那之后,我在跳转到我注入的代码的 JMP 指令之后的代码行中放置了一条 JMP 指令(是的,我刚刚描述了一个 codecave 或某种类型)。当我运行它时一切正常。但是,当我将修改后的代码保存到新的可执行文件中并再次使用 OllyDbg 运行它时,它不起作用。当我尝试引用我输入的 ASCII 字符串时,地址完全错误。示例如下图所示:

如您所见,我将字符串压入堆栈,但是当我再次将修改后的程序重新加载到调试器中时,字符串的地址发生了变化,但我的代码没有变化。因此,当我调用 MessageBoxA 函数时,它会出错,因为我为 Text 和 Caption 参数加载了错误的地址。我该如何解决?

windows x86 assembly memory-address codecave

2
推荐指数
1
解决办法
2213
查看次数