note : calculate opcode address
来源:互联网 发布:网络配音cv大神 编辑:程序博客网 时间:2024/06/07 12:11
#include <windows.h>#include <tchar.h>#include <string>/// calculate opcode address/// @fn AddrLE2BE/// @brief 小端地址转大端地址DWORD_PTR AddrLE2BE(DWORD_PTR dwLittleEndianVal);int main( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow ){ /// opcode below /// 3116000D E8 AD03FBCF DWORD_PTR dwAddrCur = 0x3116000D; // 3116000D DWORD dwOpcodeLen = 5; // E8 AD03FBCF DWORD dwOffsetLE = 0xAD03FBCF; /// 下一条OPCODE地址 + 大端地址 为要操作的地址 DWORD_PTR dwAddrObj = dwAddrCur + dwOpcodeLen + AddrLE2BE(dwOffsetLE); _tprintf(L"3116000D E8 AD03FBCF => CALL 0x%.8X\r\n", dwAddrObj); /** run result 3116000D E8 AD03FBCF => CALL 0x011103BF */ getwchar(); return 0; }DWORD_PTR AddrLE2BE(DWORD_PTR dwLittleEndianVal){ const UINT uByteBitsLen = 8; UINT uIndex = 0; DWORD_PTR dwAddrBE = 0; ///< 大端地址 BYTE byCur = 0; DWORD_PTR dwTmp = 0; DWORD_PTR dwSBR = 0; ///< shift bits to right /// shift bits to left DWORD_PTR dwSBL = (sizeof(DWORD_PTR) - 1) * uByteBitsLen; for (uIndex = 0; uIndex < sizeof(DWORD_PTR); uIndex++) { byCur = (BYTE)(dwLittleEndianVal >> dwSBR); dwTmp = byCur; dwTmp <<= dwSBL; dwAddrBE |= dwTmp; dwSBR += uByteBitsLen; dwSBL -= uByteBitsLen; } return dwAddrBE;}