问题  如何使用DLL指针从内存中读取值?

博士

新成员
加入
2016年1月13日
消息
1
编程经验
1-3
首先,我想说抱歉,因为我根本不知道我需要做我正在寻找的东西,也许我会发布一些臭味。

嗯,我正在寻找的只是为了读取存储到程序的内存中的值。关键是这个程序使用DL​​L,似乎有一个指针(我认为)这个价值,但我不知道我如何使用它,我花了很多天搜索互联网,我认为我应该钩住DLL可以访问这样的代码,但我不确定这一点,顺便问一下,我找到了同一程序的代码,该程序完全是我所需要的 C ++ 我需要它 C# and I'm unable to "convert" it.

以下是我找到的代码的一些部分,让我们看看有人可以指导我的问题:

C#:
User_fn8 ptrUser::ptrFun8 = NULL;
static HINSTANCE ptrUser_h_Instance;
//END DATA

void User::Hook() //BEGIN HOOK
{
   ptrUser_h_Instance = GetModuleHandle(TEXT("engine.dll"));

   MAKE_POINTER(ptrUser_h_Instance, ptrUser::ptrFun8, User_fn8, "[email protected]@@QAEPAGXZ");
   HOOK_FUNC(ptrUser_h_Instance, "[email protected]@@QAEPAGXZ", &User::OnCalled_GetNickName, ptrUser::ptrFun8);
}//END HOOK

void User::UnHook() //BEGIN UNHOOK
{
   UNHOOK_FUNC(ptrUser_h_Instance, "[email protected]@@QAEPAGXZ", &User::OnCalled_GetNickName, ptrUser::ptrFun8);
} //END UNHOOK

unsigned short * User::OnCalled_GetNickName(void) //BEGIN EVENT: unsigned short * User::GetNickName(void)
{
   CHECK_THIS
   //Put your code here
   unsigned short * retval = NULL;
   if ( TITLE->GetTitle ( this, retval ) )
   {
      return retval;
   }
   return GetNickName();
} //END EVENT: unsigned short * User::GetNickName(void)

和我的尝试:
C#:
using System;
using System.Diagnostics;
using system.runtime.interopservices.;
using System.Text;
using System.Threading;

public class win32
{
    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    public static extern bool FreeLibrary(IntPtr hModule);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate short GetNickName();

    public static void Main()
    {
        IntPtr pDll = win32.LoadLibrary(@".\\Engine.dll");
        IntPtr pAddressOfFunctionToCall = win32.GetProcAddress(pDll, "[email protected]@@QAEPAGXZ");

        GetNickName getNickName = (GetNickName)marshal.getDelegateForFunctionPointer.(pAddressOfFunctionToCall, typeof(GetNickName));

        short theResult = getNickName();
        bool result = win32.FreeLibrary(pDll);
        Console.WriteLine(theResult);
    }
}

但我收到这个错误"未处理的异常:system.accessviolationException:尝试读取或写出受保护的内存。这通常是其他内存损坏的指示" at getNickName();

我做错了什么?
 

SINISTR93.

新成员
加入
2016年2月20日
消息
1
编程经验
1-3
我不知道这是否会解决您的错误,但值得一雄滋姓
C#中的动态调用C ++ DLL函数 - CodeProject

但是c#不缓和 C ++功能指针,所以我们不能举援一个 C ++功能指针 这里。 c#只有 代表 对象,我们必须将函数指针转换为 代表 经过 marshal.getDelegateForFunctionPointer.。它被宣布为 system.runtime.interopservices.

此外,在C ++ / C#中有一堆关于内存编辑的教程,您应该在这里查看:
http://guidedhacking.com/forumdisplay.php?20-Tutorials

我仍然是C#的初学者,但我完成了一点内存编辑在C ++中,上面的教程是我能找到的最好。
希望这可以帮助  :)
 

chetstar625

新成员
加入
2016年5月20日
消息
1
编程经验
1-3
最佳 底部