Предыстория.. в Plugin.h от OllyDbg есть такая структура Код (Text): typedef struct t_reg { // Excerpt from context int modified; // Some regs modified, update context int modifiedbyuser; // Among modified, some modified by user int singlestep; // Type of single step, SS_xxx ulong r[8]; // EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI ulong ip; // Instruction pointer (EIP) ulong flags; // Flags int top; // Index of top-of-stack long double f[8]; // Float registers, f[top] - top of stack char tag[8]; // Float tags (0x3 - empty register) ulong fst; // FPU status word ulong fcw; // FPU control word ulong s[6]; // Segment registers ES,CS,SS,DS,FS,GS ulong base[6]; // Segment bases ulong limit[6]; // Segment limits char big[6]; // Default size (0-16, 1-32 bit) ulong dr6; // Debug register DR6 ulong threadid; // ID of thread that owns registers ulong lasterror; // Last thread error or 0xFFFFFFFF int ssevalid; // Whether SSE registers valid int ssemodified; // Whether SSE registers modified char ssereg[8][16]; // SSE registers ulong mxcsr; // SSE control and status register int selected; // Reports selected register to plugin ulong drlin[4]; // Debug registers DR0..DR3 ulong dr7; // Debug register DR7 } t_reg; а также есть Plugin.inc тот же хидер переведенный под масм Код (Text): t_reg struc 1 ; Excerpt from context modified dword ? ; Some regs modified, update context modifiedbyuser dword ? ; Among modified, some modified by user singlestep dword ? ; Type of single step, SS_xxx r dd 8 dup (?) ; EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI ip dword ? ; Instruction pointer (EIP) flags dword ? ; Flags top dword ? ; Index of top-of-stack f real10 8 dup (?) ; Float registers, f[top] - top of stack tag db 8 dup (?) ; Float tags (0x3 - empty register) fst_ dword ? ; FPU status word fcw dword ? ; FPU control word s dd 6 dup (?) ; Segment registers ES,CS,SS,DS,FS,GS base dd 6 dup (?) ; Segment bases limit dd 6 dup (?) ; Segment limits big db 6 dup (?) ; Default size (0-16, 1-32 bit) dr6_ dword ? ; Debug register DR6 threadid dword ? ; ID of thread that owns registers lasterror dword ? ; Last thread error or 0xFFFFFFFF ssevalid dword ? ; Whether SSE registers valid ssemodified dword ? ; Whether SSE registers modified ssereg db 8 dup (16 dup (?)) ; SSE registers mxcsr dword ? ; SSE control and status register selected dword ? ; Reports selected register to plugin dummy dd 4 dup (?) ; Reserved for future compatibility t_reg ends Масмовский вариант работает нормально, а сишный нет. Распечатал смещения всех элементов, выяснил что проблема в long double f[8]; // Float registers, f[top] - top of stack в сях(MS VS NET 2005) у long double другой размер, не соответствует масмовскому варианту. Можно ли пофиксить не трогая хидера?
поставил intel compiler включил в командную строку компилятора /Qlong-double (/Qlong-double enable 80-bit 'long double') теперь получается sizeof(long double) = 16 почему 16, почему не 10 собственно, не пойму никак?
Rustem что похоже? дело не в выравнивании, у Olly в SDK требование "VERY IMPORTANT NOTICE: COMPILE THIS DLL WITH BYTE ALIGNMENT OF STRUCTURES AND UNSIGNED CHAR!", что и соблюдено в настройках проекта. Причина в том что у MS sizeof(long double)=64bit, а нужно 80bit, по идее intel это поддерживает, но на деле непонятно что происходит :/
Visual до сих пор не поддерживает 80-битную FPU арифметику, long double тупо соответсвует double. Судя по статьям в блогах, в 2005-ой версии уже должны были включить совместимость со стандартным long double, но, по моим поверхностным наблюдениям, так и не включили. В GCC sizeof(long double) = 10 или 12 или 16, в зависимости от ключей. Надо отдать должное разработчикам. Про интел не в курсе.
я в замешательстве, у cl возможно поддержка появится в 9й версии http://blogs.msdn.com/ericflee/archive/2004/06/10/152852.aspx но от интела, где эта поддержка заявлена я не ожидал, откуда icc взял что 80bit это 16 ?
W4FhLF адресуйте вопрос автору OllyDbg, а также внимательнее читайте топик а у intel'а действительно тоже не все так как хотелось бы, вот что написано: The /Qlong-double option changes a long-double to an 80-bit data type. However, the alignment requirement of the data type is 16 bytes, and its size must be a multiple of its alignment, so the sizeof a long-double on Windows is 16 bytes as well. Only the lower 10 bytes (80 bits) of the 16 byte space will have valid data stored in it.
Asterix Я имел ввиду, что при передаче в функции структуры ты можешь сконевертировать 64 в 80 написав небольшую функцию, а в остальном работать в своеём плагине с 64.
W4FhLF вы не внимательно читаете и анализируете, структура физически находится в другом модуле, указатель на нее возвращает функция, если long double будет не того размера на который рассчитывал автор я просто считаю не те данные, т.к. из-за изменения размеров long double изменяется местоположение элементов струтуры и размер, в моем коде мне не long double не double вобще не нужен
Отписаться автору дебагера и\или перейти на версию С, у к-рой long double это 80 бит? (Я так понимаю, что автор OllyDbg пишет отладчик и плагины на bcc, стало быть там не должно быть этой проблемы?)
автору будем писать когда выйдет СДК под Олли 2.0 сейчас решение найдено такое объявлены две свои структуры t_reg_ и t_thread_, аналогичные t_reg и t_thread в t_reg_ long double заменено на LONG_DOUBLE typedef struct LONG_DOUBLE { char buff[10]; } LONG_DOUBLE; на BC++ переходить не хотелось, а на intel не получилось по причинам выше если кто-то видит лучшее решение предлагайте