帮助破译几行装配

Iro*_*ron 5 x86 assembly pointers dword ollydbg

我在ollydbg中找到了这几行汇编:

MOV ECX,DWORD PTR DS:[xxxxxxxx] ; xxxxxxxx is an address
MOV EDX,DWORD PTR DS:[ECX]
MOV EAX,DWORD PTR DS:[EDX+116]
CALL EAX
Run Code Online (Sandbox Code Playgroud)

有人可以介入并告诉我这里发生了什么吗?

Hea*_*utt 6

这是对结构中存储的函数指针的调用.

第一行获得存储在地址处的指针DS:xxxxxxxx.方括号表示解除对地址的引用,就像*在C中一样.来自内存的值即将用作指针; 它被ecx注册.

MOV ECX,DWORD PTR DS:[xxxxxxxx] ; xxxxxxxx is an address
Run Code Online (Sandbox Code Playgroud)

第二行取消引用上面获得的指针.该值ecx现在用作地址,该地址被解除引用.在内存中找到的值是另一个指针.第二个指针放在edx寄存器中.

MOV EDX,DWORD PTR DS:[ECX]
Run Code Online (Sandbox Code Playgroud)

第三行再次引用记忆; 这次,访问发生在从上面获得的指针偏移 0x116字节的地址.这不能被4整除,所以这个函数指针似乎不是来自C++ vtable.从存储器获得的值此时存储在寄存器中eax.

MOV EAX,DWORD PTR DS:[EDX+116]
Run Code Online (Sandbox Code Playgroud)

最后,eax执行指向的函数.这只是通过函数指针调用函数.该函数似乎采用零参数,但我有一个关于修改我的答案的问题:PUSH这个片段之前是否有指令?那些将是函数参数.问号表明这个功能可能会返回一个值,我们无法从我们的优势中得知.

CALL EAX
Run Code Online (Sandbox Code Playgroud)

总的来说,代码片段看起来像是从插件库到OllyDbg的扩展函数的调用.OllyDbg ABI指定struct包含一些函数指针的各种s.还有函数指针数组,但是获得edx-held指针的双间接(也就是非对齐偶数多次偏移)让我觉得这是一个struct函数指针或C++的数组而不是班级的表格.

换句话说,xxxxxxxx是指向struct包含函数指针的指针的指针.

在OllyDbg源文件中,PlugIn.h是一些候选struct定义.这是一个例子:

typedef struct t_sorted {              // Descriptor of sorted table
  char           name[MAX_PATH];       // Name of table, as appears in error
  int            n;                    // Actual number of entries
  int            nmax;                 // Maximal number of entries
  int            selected;             // Index of selected entry or -1
  ulong          seladdr;              // Base address of selected entry
  int            itemsize;             // Size of single entry
  ulong          version;              // Unique version of table
  void           *data;                // Entries, sorted by address
  SORTFUNC       *sortfunc;            // Function which sorts data or NULL
  DESTFUNC       *destfunc;            // Destructor function or NULL
  int            sort;                 // Sorting criterium (column)
  int            sorted;               // Whether indexes are sorted
  int            *index;               // Indexes, sorted by criterium
  int            suppresserr;          // Suppress multiple overflow errors
} t_sorted;
Run Code Online (Sandbox Code Playgroud)

允许这些示例NULL,并且您的asm片段不检查NULL函数指针中的指针.因此,它必须是DRAWFUNCt_tableSPECFUNCt_dump.

您可以创建一个包含头文件的小项目,并使用printf()offsetof()确定其中任何一个是否位于0x116的偏移量.

否则,我想OllyDbg的内部是用同样的风格写的.因此,structOllyDbg 中可能存在用于各种目的的私有定义(未在Plugin.h文件中发布).


我想补充一点,我认为OllyDbg来源不可用是一种遗憾.我的印象是它所包含的静态链接的反汇编程序是在某种GPL许可下,但我没有运气获得OllyDbg的消息.