这是对结构中存储的函数指针的调用.
第一行获得存储在地址处的指针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函数指针中的指针.因此,它必须是DRAWFUNC从t_table或SPECFUNC的t_dump.
您可以创建一个包含头文件的小项目,并使用printf()和offsetof()确定其中任何一个是否位于0x116的偏移量.
否则,我想OllyDbg的内部是用同样的风格写的.因此,structOllyDbg 中可能存在用于各种目的的私有定义(未在Plugin.h文件中发布).
我想补充一点,我认为OllyDbg来源不可用是一种遗憾.我的印象是它所包含的静态链接的反汇编程序是在某种GPL许可下,但我没有运气获得OllyDbg的消息.
| 归档时间: |
|
| 查看次数: |
930 次 |
| 最近记录: |