首页
社区
课程
招聘
[求助][求助]关于BeaEngine的用法和问题
发表于: 2012-12-9 17:10 7747

[求助][求助]关于BeaEngine的用法和问题

2012-12-9 17:10
7747
想用BeaEngine的反汇编引擎做一些工作,从官方网站上下载了相关的包,官网上提供的例子,为使用.lib的静态编译方法,源码如下:
#include <stdio.h>
#include <string.h>
#define BEA_ENGINE_STATIC  /* specify the usage of a static version of BeaEngine */
#define BEA_USE_STDCALL    /* specify the usage of a stdcall version of BeaEngine */
#include "BeaEngine.h"
int main(int argc, char* argv [])
{
    /* ============================= Init datas */
    DISASM MyDisasm;
    int len, i = 0;
    int Error = 0;
    
    (void) printf("Version : %s\n", BeaEngineVersion());
    (void) printf("Revision : %s\n", BeaEngineRevision());
    (void) memset (&MyDisasm, 0, sizeof(DISASM));
 
    MyDisasm.EIP = (UIntPtr) &main;
 
    while ((!Error) && (i<20)){
        len = Disasm(&MyDisasm);
        if (len != UNKNOWN_OPCODE) {
            (void) puts(MyDisasm.CompleteInstr);
            MyDisasm.EIP = MyDisasm.EIP + (UIntPtr)len;
            i++;
        }
        else {
            Error = 1;
        }
    };
    return 0;
}

但是我在使用的过程中,用静态lib编译,总是出问题,可能是由于提供的接口为__stdcall调用的方式,我在VS2008下进行的开发,后来想着静态编译不行,就使用了里面提供的DLL,想着动态调用其提供的接口,代码如下:

// 指向函数的指针类型
typedef int (__stdcall *MY_EXPORT_PROC)();
typedef int (__stdcall *MY_DISAM)(PDISASM MyDisasm);
// main
VOID main(VOID) 

  HINSTANCE hinstLib; 
  MY_EXPORT_PROC lpProcAdd; 
  MY_DISAM Disasm;
  BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
  //初始化反汇编引擎
  DISASM MyDisasm;
  int len=0;
  int i = 0;
  int Error = 0;
  //初始化反汇编结构体
  (void) memset (&MyDisasm, 0, sizeof(DISASM));

  // 获得Dll模块句柄
  hinstLib = LoadLibrary(TEXT("BeaEngine.dll")); 

  // 是否加载成功
  if (hinstLib != NULL) 
  {
    // 获得指定导出函数的地址
    lpProcAdd = (MY_EXPORT_PROC) GetProcAddress(hinstLib, "_BeaEngineRevision@0"); 
    Disasm=(MY_DISAM)GetProcAddress(hinstLib,"_Disasm@4");

    // 判断是否成功
    if (NULL != lpProcAdd) 
    {
      fRunTimeLinkSuccess = TRUE;
      (lpProcAdd)(); 
    } 
    // 释放DLL 
    fFreeResult = FreeLibrary(hinstLib); 
  } 

  // 出错
  if (! fRunTimeLinkSuccess) 
    printf("error; %u\n",GetLastError()); 

  MyDisasm.EIP = (UIntPtr) &main;
  /* ============================= Loop for Disasm */
  while ((!Error) && (i<20))
  {
    len = Disasm(&MyDisasm);
    if (len != UNKNOWN_OPCODE) {
      (void) puts(MyDisasm.CompleteInstr);
      MyDisasm.EIP = MyDisasm.EIP + (UIntPtr)len;
      i++;
    }
    else {
      Error = 1;
    }
  };
}

问题是:LoadLibrary能够加载BeaEngine.dll,GetProcAddress能够获得_BeaEngineRevision@0和_Disasm@4的地址,前者的查看版本信息的调用能够正常,但是运行到如下代码,总是会显示XXXX地址内存访问冲突~,其中的XXXX为GetProcAddress获得的DLL中导出函数_Disasm@4的地址。。。
len = Disasm(&MyDisasm);

为什么呢???哪位大牛能够帮帮忙,小弟谢谢了~~~是哪里的代码出问题了吗?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 86
活跃值: (237)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
自己挂od
2012-12-9 21:49
0
雪    币: 246
活跃值: (101)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
我用的VC6和MASM10,BeaEngine版本2.31没得问题,更高级的编译器没用过就不清楚了。
2012-12-10 00:30
0
游客
登录 | 注册 方可回帖
返回
//