enumdrives.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include "enumdrives.h"
  4. #include "beacon.h"
  5. //START TrustedSec BOF print code: https://github.com/trustedsec/CS-Situational-Awareness-BOF/blob/master/src/common/base.c
  6. #ifndef bufsize
  7. #define bufsize 8192
  8. #endif
  9. char *output = 0;
  10. WORD currentoutsize = 0;
  11. HANDLE trash = NULL;
  12. int bofstart();
  13. void internal_printf(const char* format, ...);
  14. void printoutput(BOOL done);
  15. int bofstart() {
  16. output = (char*)MSVCRT$calloc(bufsize, 1);
  17. currentoutsize = 0;
  18. return 1;
  19. }
  20. void internal_printf(const char* format, ...){
  21. int buffersize = 0;
  22. int transfersize = 0;
  23. char * curloc = NULL;
  24. char* intBuffer = NULL;
  25. va_list args;
  26. va_start(args, format);
  27. buffersize = MSVCRT$vsnprintf(NULL, 0, format, args);
  28. va_end(args);
  29. if (buffersize == -1) return;
  30. char* transferBuffer = (char*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, bufsize);
  31. intBuffer = (char*)KERNEL32$HeapAlloc(KERNEL32$GetProcessHeap(), HEAP_ZERO_MEMORY, buffersize);
  32. va_start(args, format);
  33. MSVCRT$vsnprintf(intBuffer, buffersize, format, args);
  34. va_end(args);
  35. if(buffersize + currentoutsize < bufsize)
  36. {
  37. MSVCRT$memcpy(output+currentoutsize, intBuffer, buffersize);
  38. currentoutsize += buffersize;
  39. } else {
  40. curloc = intBuffer;
  41. while(buffersize > 0)
  42. {
  43. transfersize = bufsize - currentoutsize;
  44. if(buffersize < transfersize)
  45. {
  46. transfersize = buffersize;
  47. }
  48. MSVCRT$memcpy(output+currentoutsize, curloc, transfersize);
  49. currentoutsize += transfersize;
  50. if(currentoutsize == bufsize)
  51. {
  52. printoutput(FALSE);
  53. }
  54. MSVCRT$memset(transferBuffer, 0, transfersize);
  55. curloc += transfersize;
  56. buffersize -= transfersize;
  57. }
  58. }
  59. KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, intBuffer);
  60. KERNEL32$HeapFree(KERNEL32$GetProcessHeap(), 0, transferBuffer);
  61. }
  62. void printoutput(BOOL done) {
  63. char * msg = NULL;
  64. BeaconOutput(CALLBACK_OUTPUT, output, currentoutsize);
  65. currentoutsize = 0;
  66. MSVCRT$memset(output, 0, bufsize);
  67. if(done) {MSVCRT$free(output); output=NULL;}
  68. }
  69. //END TrustedSec BOF print code.
  70. void printDriveType(const char* drive) {
  71. UINT driveType = KERNEL32$GetDriveTypeA(drive);
  72. if (driveType == DRIVE_UNKNOWN) {
  73. internal_printf("%s\t[Unknown drive type]\n", drive);
  74. } else if (driveType == DRIVE_NO_ROOT_DIR) {
  75. internal_printf("%s\t[Invalid root path]\n", drive);
  76. } else if (driveType == DRIVE_REMOVABLE) {
  77. internal_printf("%s\t[Removable drive]\n", drive);
  78. } else if (driveType == DRIVE_FIXED) {
  79. internal_printf("%s\t[Fixed drive]\n", drive);
  80. } else if (driveType == DRIVE_REMOTE) {
  81. internal_printf("%s\t[Network drive]\n", drive);
  82. } else if (driveType == DRIVE_CDROM) {
  83. internal_printf("%s\t[CD-ROM drive]\n", drive);
  84. } else if (driveType == DRIVE_RAMDISK) {
  85. internal_printf("%s\t[RAM disk]\n", drive);
  86. } else {
  87. internal_printf("%s\t[Unknown drive type]\n", drive);
  88. }
  89. }
  90. int go() {
  91. if(!bofstart()) return;
  92. // Buffer to store drive strings
  93. char driveStrings[256];
  94. DWORD length = KERNEL32$GetLogicalDriveStringsA(sizeof(driveStrings), driveStrings);
  95. if (length == 0) {
  96. BeaconPrintf(CALLBACK_ERROR, "[-] Failed to get logical drive strings.\n");
  97. return 1;
  98. }
  99. internal_printf("[+] Available drive letters:\n\nDRIVE\tTYPE\n==========================================\n");
  100. // Iterate through the drive strings
  101. for (char* drive = driveStrings; *drive; drive += MSVCRT$strlen(drive) + 1) {
  102. printDriveType(drive);
  103. }
  104. printoutput(TRUE);
  105. BeaconPrintf(CALLBACK_OUTPUT, "[+] Finished enumerating!\n");
  106. return 0;
  107. }