草庐IT

windows - 识别和拦截函数调用

coder 2024-06-05 原文

我正在为游戏开发启动器。 想要拦截游戏对打印文本的函数的调用。

我不知道包含这个函数的代码是动态链接的还是静态的。所以我什至不知道函数名称。

我确实通过microsoft Detours、Ninject和其他一些拦截了这个游戏的一些windows-api调用。

但是这个也不在导入表中。

我应该怎么做才能捕捉到这个函数调用?应该使用什么分析器?开发协会?如何做到这一点?


编辑:

终于找到函数地址了。谢谢,Skino!

尝试用 Detours Hook 它,注入(inject) dll。注入(inject)的 DllMain:

typedef int (WINAPI *PrintTextType)(char *, int, float , int);

static PrintTextType PrintText_Origin = NULL;

int WINAPI PrintText_Hooked(char * a, int b, float c, int d)
{
    return PrintText_Origin(a, b, c , d);
}

HMODULE game_dll_base;
/* game_dll_base initialization goes here */

BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    if(fdwReason==DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hinstDLL);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        PrintText_Origin = (PrintTextType)((DWORD)game_dll_base + 0x6049B0);
        DetourAttach((PVOID *)&PrintText_Origin , PrintText_Hooked);
        DetourTransactionCommit();
    }
}

它按预期 Hook 。参数 a 包含应显示的文本。但是当调用原始函数时 return PrintText_Origin (a, b, c , d); 应用程序崩溃( http://i46.tinypic.com/ohabm.png , http://i46.tinypic.com/dfeh4.png )

原函数反汇编:

http://pastebin.com/1Ydg7NED

弯路之后:

http://pastebin.com/eM3L8EJh

编辑 2:

弯路之后:

http://pastebin.com/GuJXtyad

PrintText_Hooked 反汇编 http://pastebin.com/FPRMK5qt w3_loader.dll是注入(inject)的dll

我不擅长 ASM,请告诉我哪里出了问题?

最佳答案

Want to intercept game's call for a function that prints text.

您可以在调查阶段使用调试器。 IDA,甚至 Visual Studio(结合​​例如 HxD)都应该这样做。使用以下步骤识别函数应该相对容易:

  1. 确定要跟踪其打印的特定文本片段(例如 Hello World!)
  2. 在游戏正常打印您在上面确定的片段之前随时中断游戏执行
  3. 在游戏内存中搜索该文本片段(查找 Unicode 或 ANSI)。 IDA 将允许您这样做 IIRC,免费的 HxD 也是如此。 (Extras > 打开 RAM...)
  4. 一旦确定了片段的地址,设置一个访问中断/读取数据断点,这样调试器就会让您控制游戏尝试读取的时刻em> 所述片段(在显示它的同时或之前)
  5. 继续执行,等待数据断点触发
  6. 检查堆栈跟踪并寻找合适的 hook 对象
  7. 如果您想探索其他潜在的 Hook 点,则从片段从内存中读取到打印的那一刻逐步执行

†提供的文本直到最后一刻才保持压缩(或出于任何原因加密)

完成调查阶段并确定要将钩子(Hook)注入(inject)的位置后,您在编写启动器时有两个选择:

  1. 如果基于上述练习,您最终能够识别导出/导入,则使用任何 API Hook 技术
  2. EDIT 使用 Microsoft Detours,确保您首先正确 identify the calling convention (cdecl, fastcall, stdcall)您试图绕道而行的功能,并将该调用约定用于原始原型(prototype)以及虚拟对象的实现。参见 examples .
  3. 如果没有,你将不得不
    • 使用Debugging API以编程方式加载游戏
    • 根据您的调查阶段计算 Hook 地址(作为模块基址的硬编码偏移量,或通过查找 Hook 站点周围的指令字节)
    • 设置断点
    • 恢复进程
    • 等待断点触发,该做什么就做什么
    • 恢复执行、等待下一个触发器等。同样,所有操作均由您的启动器通过调试 API 以编程方式完成

‡能够继续使用游戏的最终补丁版本

关于windows - 识别和拦截函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537995/

有关windows - 识别和拦截函数调用的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  3. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  10. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

随机推荐