main.cpp
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:5k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. // diStorm64 library sample
  2. // http://ragestorm.net/distorm/
  3. // Arkon, Stefan, 2005
  4. #include <windows.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include "distorm.h"
  9. // Link the library into our project.
  10. #pragma comment(lib, "distorm.lib")
  11. // The number of the array of instructions the decoder function will use to return the disassembled instructions.
  12. // Play with this value for performance...
  13. #define MAX_INSTRUCTIONS (1000)
  14. int main(int argc, char **argv)
  15. {
  16. // Version of used compiled library.
  17. unsigned long dver = 0;
  18. // Holds the result of the decoding.
  19. _DecodeResult res;
  20. // Decoded instruction information.
  21. _DecodedInst decodedInstructions[MAX_INSTRUCTIONS];
  22. // next is used for instruction's offset synchronization.
  23. // decodedInstructionsCount holds the count of filled instructions' array by the decoder.
  24. unsigned int decodedInstructionsCount = 0, i, next;
  25. // Default decoding mode is 32 bits, could be set by command line.
  26. _DecodeType dt = Decode32Bits;
  27. // Default offset for buffer is 0, could be set in command line.
  28. _OffsetType offset = 0;
  29. char* errch = NULL;
  30. // Index to file name in argv.
  31. int param = 1;
  32. // Handling file.
  33. HANDLE file;
  34. DWORD filesize, bytesread;
  35. // Buffer to disassemble.
  36. unsigned char *buf, *buf2;
  37. // Disassembler version.
  38. dver = distorm_version();
  39. printf("diStorm version: %d.%d.%dn", (dver >> 16), ((dver) >> 8) & 0xff, dver & 0xff);
  40. // Check params.
  41. if (argc < 2 || argc > 4) {
  42. printf("Usage: disasm.exe [-b16] [-b64] filename [memory offset]rnRaw disassembler output.rnMemory offset is origin of binary file in memory (address in hex).rnDefault decoding mode is -b32.rnexample:   disasm -b16 demo.com 789arn");
  43. return -1;
  44. }
  45. if (strncmp(argv[param], "-b16", 4) == 0) {
  46. dt = Decode16Bits;
  47. param++;
  48. } else if (strncmp(argv[param], "-b64", 4) == 0) {
  49. dt = Decode64Bits;
  50. param++;
  51. } else if (*argv[param] == '-') {
  52. printf("Decoding mode size isn't specified!");
  53. return -1;
  54. } else if (argc == 4) {
  55. printf("Too many parameters are set.");
  56. return -1;
  57. }
  58. if (param >= argc) {
  59. printf("Filename is missing.");
  60. return -1;
  61. }
  62. if (param + 1 == argc-1) { // extra param?
  63. #ifdef SUPPORT_64BIT_OFFSET
  64. offset = _strtoui64(argv[param + 1], &errch, 16);
  65. #else
  66. offset = strtoul(argv[param + 1], &errch, 16);
  67. #endif
  68. if (*errch != '') {
  69. printf("Offset couldn't be converted.");
  70. return -1;
  71. }
  72. }
  73. file = CreateFile(argv[param], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  74. if (file == INVALID_HANDLE_VALUE) { 
  75. printf("Could not open file %s (error %d)n", argv[param], GetLastError());
  76. return -2;
  77. }
  78. if ((filesize = GetFileSize(file, NULL)) < 0) {
  79. printf("Error getting filesize (error %d)n", GetLastError());
  80. CloseHandle(file);
  81. return -3;
  82. }
  83. // We read the whole file into memory in order to make life easier,
  84. // otherwise we would have to synchronize the code buffer as well (so instructions won't be split).
  85. buf2 = buf = (unsigned char*)malloc(filesize);
  86. if (!ReadFile(file, buf, filesize, &bytesread, NULL)) {
  87. printf("Error reading file (error %d)n", GetLastError());
  88. CloseHandle(file);
  89. free(buf);
  90. return -3;
  91. }
  92. if (filesize != bytesread) {
  93. printf("Internal read-error in systemn");
  94. CloseHandle(file);
  95. free(buf);
  96. return -3;
  97. }
  98. CloseHandle(file);
  99. printf("bits: %dnfilename: %snorigin: ", dt == Decode16Bits ? 16 : dt == Decode32Bits ? 32 : 64, argv[param]);
  100. #ifdef SUPPORT_64BIT_OFFSET
  101. if (dt != Decode64Bits) printf("%08I64xn", offset);
  102. else printf("%016I64xn", offset);
  103. #else
  104. printf("%08xn", offset);
  105. #endif
  106. // Decode the buffer at given offset (virtual address).
  107. while (1) {
  108. // If you get an unresolved external symbol linker error for the following line,
  109. // change the SUPPORT_64BIT_OFFSET in distorm.h.
  110. res = distorm_decode(offset, (const unsigned char*)buf, filesize, dt, decodedInstructions, MAX_INSTRUCTIONS, &decodedInstructionsCount);
  111. if (res == DECRES_INPUTERR) {
  112. // Null buffer? Decode type not 16/32/64?
  113. printf("Input error, halting!");
  114. free(buf2);
  115. return -4;
  116. }
  117. for (i = 0; i < decodedInstructionsCount; i++) {
  118. #ifdef SUPPORT_64BIT_OFFSET
  119. printf("%0*I64x (%02d) %-24s %s%s%srn", 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);
  120. #else
  121. printf("%08x (%02d) %-24s %s%s%srn", 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);
  122. #endif
  123. }
  124. if (res == DECRES_SUCCESS) break; // All instructions were decoded.
  125. else if (decodedInstructionsCount == 0) break;
  126. // Synchronize:
  127. next = (unsigned long)(decodedInstructions[decodedInstructionsCount-1].offset - offset);
  128. next += decodedInstructions[decodedInstructionsCount-1].size;
  129. // Advance ptr and recalc offset.
  130. buf += next;
  131. filesize -= next;
  132. offset += next;
  133. }
  134. // Release buffer
  135. free(buf2);
  136. return 0;
  137. }