如何调试jni dll

时间:2016-08-10 15:05:45

标签: java java-native-interface ollydbg

我有一个小的java程序。它加载一个jni dll并且该DLL加载一个正常的win32 dll。我想调试最终Java应用程序为win32 dll的一个特定调用提供哪些参数。我的计划是在ollydbg中对此DLL调用设置断点,然后检查堆栈。但是当我在ollydbg中启动调试模式时,我必须提供可执行文件,所以我唯一的选择是为java.exe提供启动我的java程序的参数。但是我最终只能在DLL加载时设置断点,这需要我基本上运行程序。我无法理解我是如何停止"设置断点的执行,如果我能以某种方式停止我不需要断点。谁能告诉我我需要做什么?

1 个答案:

答案 0 :(得分:3)

您可以指示调试器在加载特定dll时中断。

  • load" java.exe"在Ollydbg
  • 转到"选项>选项"菜单(ALT + O)。
  • 在选项窗口的左侧菜单中,转到"调试>事件"
  • 检查"暂停新模块(DLL)"
  • (可选)检查"仅在以下模块" (否则调试器将中断所有已加载的模块,包括系统模块。)
  • 点击"添加"按钮并在框中填入您的dll名称。
  • 点击"确定"在"调试事件"的底部窗口

enter image description here

  • 转到"文件>设置新论点"菜单,如果你想将一些args传递给java.exe。
  • 重新启动程序(CTRL + F2),这需要考虑更改。
  • 运行程序,当你加载jni dll时它应该会中断(在DLL main上)。
  • 按" CTRL + N"查看DLL导出的名称
    • 注意:您实际上可以在此窗口中键入要搜索的名称
    • 看起来就是这样(例如使用kernel32.dll系统DLL,我输入" CreatefileW"在窗口上):

enter image description here

  • 按下要打破的功能名称上的F2(这会在功能上设置断点)
  • 使用F9运行程序:如果调用该函数,则应该中断。