thiago costa

thiago costa

  • NA
  • 319
  • 0

How to use ASM (Assembly) code with c# .... Is it possible

Dec 28 2010 3:34 PM
Hello there guys,
Since I don't enjoy masm32 toomuch, since ASM is way too complicated for my brain,
I found an easier way to mix ASM code, with c++.
But, I decided that c++ is also too complicated for me...
I realized that for me to write certain application in c++, which ever it may be, I will do it in c# in most likely a forth of the time.. c# is much more simple in my opinion.
Is there ANY possible way to combine ASM with C# as well?...
This is the main ASM code I've been using since july to update the stuff.
Assembly.ASM
  1. .486  
  2.   
  3.   
  4. .model flat, stdcall  
  5.   
  6.   
  7. option casemap: none  
  8.   
  9.   
  10. include \masm32\include\windows.inc  
  11. include \masm32\include\masm32.inc  
  12. include \masm32\include\user32.inc  
  13. include \masm32\include\kernel32.inc  
  14. include \masm32\include\gdi32.inc  
  15. include \masm32\include\debug.inc  
  16. includelib \masm32\lib\masm32.lib  
  17. includelib \masm32\lib\user32.lib  
  18. includelib \masm32\lib\kernel32.lib  
  19. includelib \masm32\lib\gdi32.lib  
  20. includelib \masm32\lib\debug.lib  
  21. include Tools.inc  
  22. include Game.inc  
  23. thread_Hotkeys proto :DWORD, :DWORD, :DWORD  
  24. thread_Callback proto :DWORD, :DWORD, :DWORD  
  25. thread_Hook proto  
  26. .data  
  27. szWindow         db "StarCraft II", 0  
  28. .data?  
  29. thread_HookID        dd ?  
  30. thread_HotkeysID     dd ?  
  31. .code  
  32. DllEntryPoint proc   hInstDLL:DWORD, lpReason:DWORD, lpReserved:DWORD  
  33. mov eax, lpReason  
  34. .if (eax == DLL_PROCESS_ATTACH)  
  35. ; Check that the game version is correct.  
  36. mov eax, hook_01  
  37. mov al, byte ptr [eax]  
  38. mov bl, byte ptr [h01_Reset]  
  39. .if (al != bl)  
  40. ret  
  41. .endif  
  42. ; Set up the hooking thread.  
  43. invoke CreateThread, NULL, 0, addr thread_Hook, 0, 0, addr thread_HookID  
  44. .endif  
  45. ret  
  46. DllEntryPoint endp  
  47. thread_Hotkeys proc   nCode:DWORD, wParam:DWORD, lParam:DWORD  
  48. ; Hotkey callback thread.  
  49. push eax  
  50. mov eax, lParam  
  51. or eax, 00FFFFFFh  
  52. .if (nCode == HC_ACTION && eax != 0C0FFFFFFh)  
  53. .if (wParam == VK_F5)  
  54. .if (mState == 00h)  
  55. ; Change to full mode.  
  56. invoke Tools_PatchMemory, hook_01, addr h01_Reset, 6  
  57. invoke Tools_PatchMemory, hook_02, addr h02_Full, 2  
  58. mov mState, 01h  
  59. .elseif (mState == 01h)  
  60. ; Change to shared vision mode.  
  61. invoke Tools_PatchMemory, hook_01, addr h01_Shared, 6  
  62. invoke Tools_PatchMemory, hook_02, addr h02_Reset, 2  
  63. mov mState, 02h  
  64. .elseif (mState == 02h)  
  65. ; Change to enemy vision mode.  
  66. invoke Tools_PatchMemory, hook_01, addr h01_Enemy, 6  
  67. invoke Tools_PatchMemory, hook_02, addr h02_Reset, 2  
  68. mov mState, 03h  
  69. .elseif (mState == 03h)  
  70. invoke Tools_PatchMemory, hook_01, addr h01_Reset, 6  
  71. invoke Tools_PatchMemory, hook_02, addr h02_Reset, 2  
  72. mov mState, 00h  
  73. .endif  
  74. .endif  
  75. .endif  
  76. pop eax  
  77. invoke CallNextHookEx, thread_HotkeysID, nCode, wParam, lParam  
  78. ret  
  79. thread_Hotkeys endp  
  80. thread_Hook proc  
  81. ; Hook setting thread.  
  82. ; Show the ad.  
  83. invoke MessageBox, NULL, CTEXT("Injected, you can close this now"), CTEXT("Injection Stats"), MB_OK  
  84. ; Get the device context.  
  85. invoke Tools_GetDeviceContext, addr szWindow  
  86. ; Get the process ID.  
  87. invoke FindWindow, 0, addr szWindow  
  88. .if (eax == 0)  
  89. invoke FindWindow, addr szWindow, 0 ;korean/taiwan client fix  
  90. .endif  
  91. invoke GetWindowThreadProcessId, eax, 0  
  92. .if (eax != 0)  
  93. ; Set the hotkey hook.  
  94. invoke SetWindowsHookEx, WH_KEYBOARD, addr thread_Hotkeys, NULL, eax  
  95. ; Save our thread handle and sleep.  
  96. mov thread_HotkeysID, eax  
  97. invoke Sleep, -1  
  98. .endif  
  99. thread_Hook endp  
  100. End DllEntryPoint 
Game.inc
  1. Game_TextOut proto :DWORD, :DWORD, :DWORD, :DWORD  
  2. .data  
  3. mState             db 00h  
  4. hook_01        dd 00A5C6D9h  
  5. hook_02        dd 00A5C6DFh  
  6. h01_Shared         db 0B3h, 02h, 90h, 90h, 90h, 90h  
  7. h01_Enemy          db 0B3h, 03h, 90h, 90h, 90h, 90h  
  8. h01_Reset          db 8Ah, 1Dh, 0Ch, 2Dh, 5Ah, 01h  
  9. h02_Full           db 0EBh, 09h  
  10. h02_Reset          db 3Ah, 1Dh  
  11. .code  
  12. Game_TextOut proc   lpX:DWORD, lpY:DWORD, lpText:DWORD, lpLen:DWORD  
  13. ; Displays text at specific coordinates in-game.  
  14. pushad  
  15. mov ebx, hdcDevice  
  16. invoke TextOut, ebx, lpX, lpY, lpText, lpLen  
  17. popad  
  18. ret  
  19. Game_TextOut endp 
Tools.inc
 
  1.  Tools_PatchMemory proto :DWORD, :DWORD, :DWORD  
  2. Tools_SetHook proto :DWORD, :DWORD  
  3. Tools_MoveString proto :DWORD, :DWORD  
  4. Tools_GetDeviceContext proto :DWORD  
  5. .data?  
  6. hdcDevice   dd ?  
  7. hWindow     dd ?  
  8. .code  
  9. Tools_PatchMemory proc   lpOffset:DWORD, lpData:DWORD, lpLen:DWORD  
  10. ; Patches specific memory locations of variable length.  
  11. LOCAL lpOld:DWORD  
  12. ; Give write permissions to the memory location.  
  13. invoke VirtualProtect, lpOffset, lpLen, PAGE_EXECUTE_READWRITE, addr lpOld  
  14. .if (eax != 0)  
  15. ; Write our data and return to the old permissions.  
  16. invoke RtlMoveMemory, lpOffset, lpData, lpLen  
  17. invoke VirtualProtect, lpOffset, lpLen, lpOld, addr lpOld  
  18. .endif  
  19. ret  
  20. Tools_PatchMemory endp  
  21. Tools_SetHook proc   lpFrom:DWORD, lpTo:DWORD  
  22. ; Sets up a jump to our internal code.  
  23. LOCAL lpJump:DWORD  
  24. push ecx  
  25. push ebx  
  26. mov ecx, lpFrom  
  27. mov ebx, lpTo  
  28. add ecx, 05h  
  29. sub ebx, ecx  
  30. lea ecx, lpJump  
  31. mov byte ptr [ecx], 0E9h  
  32. mov dword ptr [ecx+1], ebx  
  33. invoke Tools_PatchMemory, lpFrom, addr lpJump, 5  
  34. pop ebx  
  35. pop ecx  
  36. ret  
  37. Tools_SetHook endp  
  38. Tools_MoveString proc   lpDest:DWORD, lpSource:DWORD  
  39. ; Moves and terminates a string in memory.  
  40. push ecx  
  41. push ebx  
  42. push edx  
  43. mov ebx, lpDest  
  44. mov ecx, lpSource  
  45. .while (byte ptr [ecx] != 00h)  
  46. mov dl, byte ptr [ecx]  
  47. mov byte ptr [ebx], dl  
  48. inc ecx  
  49. inc ebx  
  50. .endw  
  51. mov byte ptr [ebx], 00h  
  52. pop edx  
  53. pop ebx  
  54. pop ecx  
  55. ret  
  56. Tools_MoveString endp  
  57. Tools_GetDeviceContext proc   szWindow:DWORD  
  58. ; Returns and stores a device context.  
  59. push eax  
  60. mov eax, szWindow  
  61. invoke FindWindow, 0, eax  
  62. invoke GetDC, eax  
  63. mov hdcDevice, eax  
  64. pop eax  
  65. ret  
  66. Tools_GetDeviceContext endp 
 
Sorry, the code looks Horrible in the [code tag]
I can  more or less mix these with c++ , 
But, can I with c# ?
The main question is, how would I create a memory hook with c#, and modify the memory valies values? ... 
Example 
hook_01        dd 00A5C6D9h
hook_02        dd 00A5C6DFh
when 00A5C6D9 and 00A5C6DF are the offsets
Thank you

Answers (4)