避免在 Ollydbg 中重新运行之间重新启用补丁

逆向工程 ollydbg 修补
2021-06-12 19:46:30

在 Ollydbg 1.1 中,当我创建动态补丁时,它们会在我重新启动应用程序(已调试的应用程序,而不是 Olly)时自动禁用,我必须再次手动启用它们。是否有我错过的菜单选项,或者可以在重新启动之间启用这些选项的脚本?

2个回答

飞补丁就是它们:飞补丁。因此,每当您重新启动程序时,它们都不会加载,这是正常行为。

如果您想在两次执行之间保留补丁,您有两种解决方案:

  • 绝对修补您的二进制文件,因此您不必再次打补丁:对代码进行更改后,突出显示更改,右键单击它,选择“复制到可执行文件”。您可以选择刚刚更改的当前选择,或者,您可以选择将所有更改复制到可执行文件。当您选择一个时,它会弹出一个新窗口,即新文件,在弹出的新窗口中右键单击,然后选择“保存文件”,它将保存对您选择的给定文件的更改。一步一步的动画:http : //i.imgur.com/G1J7EVP.gif

  • 使用Multiline Ultimate Assembler等插件,这样您就可以编写补丁、保存它们并在执行期间随时加载它们。

ctrl+p->space按住以进行多次激活

启用补丁插件的源代码(自动化上面发布的击键)

#include <windows.h>
#include "plugin.h"
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"odbgvc10.lib")
/*
compiled and linked with
@call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
cl /nologo /Zi /Zp1 /W4 /EHsc /O1 /J /FD /c /analyze /TP /WX patcha.cpp
link /nologo /dll  /RELEASE /incremental:no /debug patcha.obj
*/
int Enablepatch() { //use once to activate use again to deactivate all patches
  Createpatchwindow();
  t_table *patch = (t_table *)Plugingetvalue(VAL_PATCHES);
  int patches = patch->data.n;
  Selectandscroll(patch,0,2);  
  for(int i=0;i<patches;i++) {
    SendMessage(patch->hw,WM_KEYDOWN,VK_SPACE,MapVirtualKey(VK_SPACE,0));
  }
  return 0;
};

BOOL WINAPI DllMain( HINSTANCE , DWORD , LPVOID ) { return 1; }

extc int _export _cdecl ODBG_Plugindata( char shortname[32] ) {
  strcpy_s( shortname,30, "patcha" );
  return PLUGIN_VERSION;
};

extc int _export _cdecl ODBG_Plugininit( int ollydbgversion, HWND , PULONG ){
  if (ollydbgversion<PLUGIN_VERSION) { return -1; }
  Addtolist( 0, 1, "patcha Plugin by blabb" );
  return 0;
};

extc int _export _cdecl ODBG_Pluginmenu( int origin, char data[4096], PVOID ) {
  switch (origin) {
  case PM_MAIN:
    strcpy_s( data, 4000, "0 &patcha" );
    return 1;
  default: break;
  };
  return 0;
};

extc void _export _cdecl ODBG_Pluginaction( int origin, int action, PVOID ) {
  if (origin==PM_MAIN) {
    switch (action) {
    case 0:
      Enablepatch();
      break;
    default:
      break;
    };
  };
};           

                   .