Assist.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Assist.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "Assist.h"
  5. // 8组寄存器存储;
  6. BYTE byEAX[8] = {0};
  7. BYTE byEBX[8] = {0};
  8. BYTE byECX[8] = {0};
  9. BYTE byEDX[8] = {0};
  10. BYTE byEBP[8] = {0};
  11. BYTE byESP[8] = {0};
  12. BYTE byESI[8] = {0};
  13. BYTE byEDI[8] = {0};
  14. DWORD dwEAX = 0;
  15. DWORD dwEBX = 0;
  16. DWORD dwECX = 0;
  17. DWORD dwEDX = 0;
  18. DWORD dwEBP = 0;
  19. DWORD dwESP = 0;
  20. DWORD dwESI = 0;
  21. DWORD dwEDI = 0;
  22. // 新的Call;
  23. BYTE byNewCall[5] = {0};
  24. // 旧的Call备份;
  25. BYTE byOldCall[5] = {0};
  26. void __declspec(naked) Call_MySaveAsOutputData()
  27. {
  28. //004AB3FC
  29. __asm {
  30. // 保存寄存器;
  31. mov dwEAX, EAX;
  32. mov dwEBX, EBX;
  33. mov dwECX, ECX;
  34. mov dwEDX, EDX;
  35. mov dwEBP, EBP;
  36. mov dwESP, ESP;
  37. mov dwESI, ESI;
  38. mov dwEDI, EDI;
  39. // my call
  40. mov eax,0x004AB3FC
  41. mov dl,1
  42. call dword ptr[eax]
  43. // 恢复寄存器;
  44. mov EAX, dwEAX;
  45. mov EBX, dwEBX;
  46. mov ECX, dwECX;
  47. mov EDX, dwEDX;
  48. mov EBP, dwEBP;
  49. mov ESP, dwESP;
  50. mov ESI, dwESI;
  51. mov EDI, dwEDI;
  52. // 返回
  53. ret
  54. }
  55. }
  56. DWORD dwGoNextAddr = 0x00417B2A;
  57. void __declspec(naked) MyGo()
  58. {
  59. // 备份寄存器;
  60. __asm{
  61. // 保存寄存器;
  62. mov dwEAX, EAX;
  63. mov dwEBX, EBX;
  64. mov dwECX, ECX;
  65. mov dwEDX, EDX;
  66. mov dwEBP, EBP;
  67. mov dwESP, ESP;
  68. mov dwESI, ESI;
  69. mov dwEDI, EDI;
  70. }
  71. MessageBox(NULL, _T("MyGo Function"), _T("MyGo"), MB_OK);
  72. __asm{
  73. // 恢复寄存器;
  74. mov EAX, dwEAX;
  75. mov EBX, dwEBX;
  76. mov ECX, dwECX;
  77. mov EDX, dwEDX;
  78. mov EBP, dwEBP;
  79. mov ESP, dwESP;
  80. mov ESI, dwESI;
  81. mov EDI, dwEDI;
  82. // 最后返回原Call地址下一行;
  83. jmp dwGoNextAddr;
  84. }
  85. }
  86. // 00417A84
  87. // 00417B25 | E8 FA9F0E00 | call demo.501B24 |
  88. void Call_MyGo()
  89. {
  90. BYTE szMyCall[5] = {0};
  91. szMyCall[0] = 0xE9; // 硬编码:jmp或call
  92. *(LPDWORD)(&szMyCall[1]) = (DWORD)MyGo - 0x00417B25 - 5;
  93. HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
  94. // 将要Hook的地址指令备份下来;
  95. if ( !ReadProcessMemory(GetCurrentProcess(), (LPVOID)0x00417B25, byOldCall, 5, NULL) )
  96. {
  97. MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
  98. return;
  99. }
  100. // 将我们的Call地址指令写入目标地址;
  101. if ( !WriteProcessMemory(hProc, (LPVOID)0x00417B25, szMyCall, 5, NULL) )
  102. {
  103. MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
  104. return;
  105. }
  106. MessageBox(NULL, _T("替换成功"), _T("提示"), MB_OK);
  107. }