Advertisement
Guest User

C++ API Hashing

a guest
Mar 10th, 2014
677
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. //Credits: karcrack
  2. #ifndef CRYPTAPI
  3. #define CRYPTAPI
  4. struct FNV1a{
  5. template <size_t N>
  6. __forceinline static DWORD hash(const char (&str)[N]){
  7. return (hash<N-1>((const char(&)[N-1])str)^str[N-1]) * 16777619u;
  8. };
  9. template <>
  10. __forceinline static DWORD hash<1>(const char (&str)[1]){
  11. return (2166136261u^str[0]) * 16777619u;
  12. };
  13. __forceinline static DWORD hash(char* str){
  14. DWORD r = 2166136261u;
  15. do{
  16. r ^= *str;
  17. r *= 16777619u;
  18. }while(*str++);
  19. return r;
  20. };
  21. };
  22. struct CUSTOM{
  23. template <size_t N>
  24. __forceinline static DWORD hash(const char (&str)[N]){
  25. return ((hash<N-1>((const char(&)[N-1])str) ^ (str[N-1] << 24)) >> 2);
  26. };
  27. template <>
  28. __forceinline static DWORD hash<1>(const char (&str)[1]){
  29. return (str[0]<<24)>>2;
  30. };
  31. __forceinline static DWORD hash(char* str){
  32. DWORD r = 0;
  33. do{
  34. r ^= (*str << 24);
  35. r >>= 2;
  36. }while(*str++);
  37. return r;
  38. };
  39. };
  40. template <class ret, class hashFnc = FNV1a> class invoke{
  41. private:
  42. char* base;
  43. DWORD FuncHash;
  44. public:
  45. template <size_t N, size_t M>
  46. invoke(const char (&DLL)[N], const char (&Func)[M]){
  47. base = (char*)LoadLibraryA(DLL);
  48. FuncHash = hashFnc::hash<M>(Func);
  49. };
  50. ret operator()(int numArgs, ...){
  51. BYTE* dirApi;
  52. IMAGE_DOS_HEADER* IDH = (IMAGE_DOS_HEADER*)base;
  53. IMAGE_NT_HEADERS* INH = (IMAGE_NT_HEADERS*)(base + IDH->e_lfanew);
  54. IMAGE_OPTIONAL_HEADER* IOH = &INH->OptionalHeader;
  55. IMAGE_DATA_DIRECTORY* IDE = (IMAGE_DATA_DIRECTORY*)(&IOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);
  56. IMAGE_EXPORT_DIRECTORY* IED = (IMAGE_EXPORT_DIRECTORY *)(base + IDE->VirtualAddress);
  57. void** FTABLE = (void **)(base + IED->AddressOfFunctions);
  58. WORD* OTABLE = (WORD *)(base + IED->AddressOfNameOrdinals);
  59. char** NTABLE = (char **)(base + IED->AddressOfNames);
  60. for (DWORD i = 0; i <= IED->NumberOfNames; i++){
  61. if (hashFnc::hash(base + (DWORD)NTABLE[i]) == FuncHash){
  62. dirApi = (BYTE*)(base + (DWORD)FTABLE[OTABLE[i]]);
  63. break;
  64. }
  65. }
  66. va_list listaArgs;
  67. void** args;
  68. va_start(listaArgs, numArgs);
  69. args = &va_arg(listaArgs, void*);
  70. for(int n=numArgs-1; n>=0; n--){
  71. void* temp = args[n];
  72. __asm
  73. push [temp]
  74. }
  75. va_end(listaArgs);
  76. __asm
  77. call dirApi
  78. };
  79. };
  80. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement