意识到 what follows are undocumented stuff
创建一个file either named as [binary].arg
或common.arg
第一个名称仅适用于特定的[二进制]
第二个名称 common.arg 全局适用
将此粘贴到文件中
STRUCT _MYSTRUCT
QWORD DOUBLE x
QWORD DOUBLE y
QWORD DOUBLE z
BYTE CHAR id
DWORD INT label
DWORD ASCII* name
DWORD INT* foo
END
将文件放在 ollydbg 所在的文件夹中。
_MYSTRUCT 现在应该在下拉框中可用
STRUCT
是关键字
结构名称需要前导下划线
成员定义为
FIELDSIZE, TYPENAME , MEMBERNAME
有效的 FIELDSIZE 是
- 字节
- 单词
- 三
- 双字
- 字词
- 泰比特
对应于大小的1,2,3,4,8,16
TYEPNAMES 很大,你应该尝试和错误
我已经发布了一些常见的
注意我已经将你的最后一个结构转换为 INT* 而不是 anotherstruct*
你可能需要在文件中添加一个自定义类型,
你可以指定一个用星号重复计数 *
BYTE*48 BYTE somecrap
somecrap 是 MemberName 一个字符串
END is a keyword
表示结构结束
一些使用来自您的 Query 编译执行的结构的虚拟 src 和下面的屏幕截图
源文件
#include <stdio.h>
#include <windows.h>
#pragma pack(1)
typedef struct _TESTY {
int a;
int b;
}Testy,*PTesty;
typedef struct _MYSTRUCT {
double x,y,z;
unsigned char id;
int label;
char *name;
Testy *foo;
}MyStruct,*PMyStruct;
int main (void) {
MyStruct blah;
Testy arrgh;
char *test = "hello do i know c ?";
memset(&blah,0,sizeof(blah));
blah.x=43.0;
blah.y=76.34;
blah.z=0.0;
blah.id = 'a';
blah.label = 54;
blah.name = test;
arrgh.a =45;
arrgh.b =54000;
blah.foo = &arrgh;
printf("%f\n",blah.x);
printf("%s\n",blah.name);
printf("%d\n",blah.foo->b);
return 0;
}
被执行
structy.exe
43.000000
hello do i know c ?
54000
使用 ollydbg 运行
ollydbg.exe structy.exe
日志窗口显示它使用了我们由 xxxxx.arg 提供的结构定义
Log data
Address Message
OllyDbg v2.01
Command line: structy.exe
Loading function descriptions from 'common.arg'
2 structures
Total size of known data is 1521777 bytes
截屏