バイト0x660x5b0xc3(pop ebx / ret)をdistorm64でデコードする次のコードがあります(コードはこの例から取得されました)
// Holds the result of the decoding.
_DecodeResult res;
// Decoded instruction information.
_DecodedInst decodedInstructions[MAX_INSTRUCTIONS];
// next is used for instruction's offset synchronization.
// decodedInstructionsCount holds the count of filled instructions' array by the decoder.
unsigned int decodedInstructionsCount = 0, i, next;
// Default decoding mode is 32 bits, could be set by command line.
_DecodeType dt;
if(!x64)
dt = Decode32Bits;
else
dt = Decode64Bits;
// Default offset for buffer is 0, could be set in command line.
_OffsetType offset = 0;
char* errch = NULL;
char tempBuf[500];
// Decode the buffer at given offset (virtual address).
while (1)
{
// If you get an unresolved external symbol linker error for the following line,
// change the SUPPORT_64BIT_OFFSET in distorm.h.
res = distorm_decode(offset, (const unsigned char*)byteCodeBuffer, byteCodeBufferSize, dt, decodedInstructions, MAX_INSTRUCTIONS, &decodedInstructionsCount);
if (res == DECRES_INPUTERR)
{
// Null buffer? Decode type not 16/32/64?
printf("Input error, halting!");
return EXIT_FAILURE;
}
for (i = 0; i < decodedInstructionsCount; i++)
{
#ifdef SUPPORT_64BIT_OFFSET
sprintf_s(tempBuf, 500, "%0*I64x (%02d) %-24s %s%s%s\n", dt != Decode64Bits ? 8 : 16, decodedInstructions[i].offset, decodedInstructions[i].size, (char*)decodedInstructions[i].instructionHex.p, (char*)decodedInstructions[i].mnemonic.p, decodedInstructions[i].operands.length != 0 ? " " : "", (char*)decodedInstructions[i].operands.p);
outputText.append(tempBuf);
#else
printf("%08x (%02d) %-24s %s%s%s\n", decodedInstructions[i].offset, decodedInstructions[i].size, (char*)decodedInstructions[i].instructionHex.p, (char*)decodedInstructions[i].mnemonic.p, decodedInstructions[i].operands.length != 0 ? " " : "", (char*)decodedInstructions[i].operands.p);
#endif
}
if (res == DECRES_SUCCESS) break; // All instructions were decoded.
else if (decodedInstructionsCount == 0) break;
// Synchronize:
next = (unsigned long)(decodedInstructions[decodedInstructionsCount-1].offset - offset);
next += decodedInstructions[decodedInstructionsCount-1].size;
// Advance ptr and recalc offset.
byteCodeBuffer += next;
byteCodeBufferSize -= next;
offset += next;
}
return EXIT_SUCCESS;
結果は
00000000 (02) 665b POP BX
00000002 (01) c3 RET
レジスタがBXではなくEBXであるため、これは間違っています。
「popbx/ret」シーケンスを(nasmを使用して)コンパイルしようとすると、0x5b 0xc3が取得され、distormはそれを次のように変換します。
00000000 (01) 5b POP EBX
00000001 (01) c3 RET
これも同様に間違っています(EBXではありませんが、BXを返す必要があります!)
どこが間違っているのですか?それはdistorm64のバグですか、それとも何ですか?