D2-AUTOHITS(6) Games Manual D2-AUTOHITS(6)

NAME

Diablo II Autohits — A combat automation utility for Diablo II v1.09 using packet bursting and hotkeyed target locking.

METADATA

Platform: Diablo II
Release: 2001-08-22
Status: Source available

SYNOPSIS

AutoHits.exe

DESCRIPTION

Autohits was a combat utility designed to streamline dueling and boss runs by automating the repetitive clicking required for constant attacks. Compatible with Battle.net Realms, Open games, and TCP/IP, it allowed players to engage targets without the character physically moving toward them, providing a client-side visual bypass for positioning.

The hack’s core mechanism involved intercepting the attack routine to send a burst of redundant attack packets to the server. By flooding the server with multiple packets per click (defaulting to 300), it increased the likelihood of a “valid” hit being interpreted correctly, effectively bypassing some of the latency-related synchronization checks in the v1.09 engine.

The archive includes the original MASM32 source code for the standalone patcher.

KEY FEATURES

  • Packet Bursting — Floods the server with a configurable number of attack packets (up to 999) to ensure hits are registered despite network latency.
  • Last Hit (Hotkey) — Pressing SPACE automatically re-engages the last target clicked, allowing the player to focus on positioning or potion management.
  • Stationary Attacking — Enables the player to attack monsters/players on screen without moving, though the server still respects weapon range for damage vulnerability.
  • v1.09 Compatibility — Specifically adjusted to hook into the memory offsets used in the major Diablo II v1.09 patch.

NOTES

To be honest, this hack wasn’t as useful as it looked like on the surface. I personally have used it for a few runs and never felt like it was giving me an advantage. The fact that your player movement was desynchronized with what you saw on screen was a major drawback.

It was more of an experiment in packet manipulation and memory patching than anything else, and my first attempt at making a working hack on the battle.net Realm servers.

ATTACHMENTS (Browsing /usr/games/hacks/)

Path: /usr/games/hacks/diablo_2/autohits/AutoHits.asm10536 bytes
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
GetHandleProc proto
SpyCheckProc proto :DWORD
AboutProc proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

;Define macro
szText MACRO Name, Text:VARARG 
        LOCAL lbl 
          jmp lbl 
            Name db Text,0 
          lbl: 
        ENDM

.data

ClassName db "OneClass",0
MenuName db "MyMenu",0
DlgName db "MyDialog",0
AppName db "Diablo II Auto Hits",0
TestString2 db "You clicked on the Undo Menu",0
AboutDlgName db "AboutBox",0		;About dialog
InstDlgName db "InstBox",0		;Instructions dialog
InfoDlgName db "InfoBox",0		;Hack info dialog


;String to search
GameName db "Diablo II",0

;ERRORS 
err_cap db "ERROR",0

err_noText db "You must specify the number of hit  ",0
err_mustRun db "Diablo II must be running!	",0
err_writing db "DLLs are not totally loaded in memory.	",13,10
	    db "	Join a game first",0	    
err_writingOld db "Cannot write in memory	",0


;DONE
doneText db "Diablo II has been successfully patched!",0
oldText db "The hack has been unloaded",0

infoText db "This hack works on Battle.net Realms, open games and TCP/IP games whether you're the host or not.",13,10
	 db 13,10
	 db "What this program does :",13,10
	 db "- Attack monsters/players on your screen by clicking on them without moving (Client side).",13,10
	 db "- Send multiple attack packets at the same time per click.",13,10
	 db "- Last Hit feature : Pressing the Space Bar will attack the last monster/player that you clicked on.",13,10
	 db 13,10
	 db "A complete and more detailed description of this hack can be found in the readme.txt along with this package.",13,10
	 db 13,10,13,10
	 db "The original copy of this program can always be found at http://onesided.cjb.net",0

;Icon
hIcon	  dd 0

;------------------------------------------------------------
;Datas to be written

buffer db 06h,01h,00h,00h,00h,01h,00h,00h,00h

monstClickData db 0e8h,0b0h,0e9h,0bh,00h,90h,90h

playerClickData db 0e8h,2dh,0eah,0bh,00h,90h,90h,90h,90h,90h

playerClickSub db 0c6h,05h,3ch,66h,0c3h,6fh,00h,0e8h,0a4h,0ffh,0ffh,0ffh,0c3h

hitRoutineData db 0c6h,05h,3ch,66h,0c3h,6fh,01h,0e8h,04h,00h,00h,00h,8bh,46h,1ch,0c3h
	       db 89h,1dh,40h,66h,0c3h,6fh,60h,66h,8bh,35h,4bh,66h,0c3h,6fh,0b9h,3bh
	       db 66h,0c3h,6fh,8bh,15h,84h,0b0h,0c3h,6fh,6ah,00h,6ah,09h,51h,52h,0ffh
	       db 15h,84h,71h,0c3h,6fh,66h,4eh,66h,85h,0f6h,75h,0e2h,61h,0c3h
	     
spaceAddData db 0e8h,1ch,96h,13h,00h,0c3h

;------------------------------------------------------------

;Original Datas

monstClickOld db 85h,0c0h,74h,25h,8bh,46h,1ch

playerClickOld db 53h,33h,0d2h,8bh,0ceh,0e8h,0edh,02h,00h,00h
	       
spaceAddOld db 0e9h,5bh,0bah,0fdh,0ffh,90h


.data?

hInstance HINSTANCE ?
retDlg dd ?
getInt db ?
nbLoop dw ?
processID dd ?
processHandle dd ?


.const
IDC_APPLY      equ 3000
IDC_UNDO        equ 3001
IDC_TEXT	equ 3002
IDC_GETNB	equ 3003
IDM_APPLY     equ 32000
IDM_UNDO      equ 32001
IDM_EXIT        equ 32002
IDM_ABOUT	equ 32003
IDM_INST	equ 32004
IDM_INFO	equ 32005

INFO_TEXT	equ 5000
IDC_ABOUTOK	equ 4000

;Addresses memory to be patched
SPEEDADD equ 6fc3664bh
BUFFADD equ 6fc3663bh
MONSTCLICK equ 6fb77c46h
PLAYERCLICK equ 6fb77c29h
PLAYERCLICKSUB equ 6fc3665bh
HITROUTINE equ 6fc365fbh
SPACEADD equ 6fafcff0h


.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	
	invoke WinMain, hInstance,NULL,NULL,SW_SHOWDEFAULT
	invoke ExitProcess,eax
	
	
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
	
	LOCAL wc:WNDCLASSEX
	LOCAL msg:MSG
	LOCAL hDlg:HWND
	
	invoke LoadIcon,hInst,500    ; icon ID
      	mov hIcon, eax
	
	mov   wc.cbSize,SIZEOF WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, OFFSET WndProc
	mov   wc.cbClsExtra,NULL
	mov   wc.cbWndExtra,DLGWINDOWEXTRA
	push  hInst
	pop   wc.hInstance
	mov   wc.hbrBackground,COLOR_BTNFACE+1
	mov   wc.lpszMenuName,OFFSET MenuName
	mov   wc.lpszClassName,OFFSET ClassName
	
	push hIcon		; Put Icon on the Exe
	pop   wc.hIcon
	push hIcon
	pop   wc.hIconSm
	
	invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	
	invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL
	mov   hDlg,eax
		
	INVOKE ShowWindow, hDlg,SW_SHOWNORMAL
	INVOKE UpdateWindow, hDlg
	
	invoke GetDlgItem,hDlg,IDC_APPLY
	invoke SetFocus,eax
			
	.WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke IsDialogMessage, hDlg, ADDR msg
                .if eax==FALSE
                        INVOKE TranslateMessage, ADDR msg
                        INVOKE DispatchMessage, ADDR msg
                .endif
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
						
	.IF uMsg==WM_DESTROY
		invoke PostQuitMessage,NULL
	.ELSEIF uMsg==WM_COMMAND
		mov eax,wParam
		.IF lParam==0
			
			;***********************************************
			.IF ax==IDM_APPLY
			
				invoke GetDlgItemInt,hWnd,IDC_GETNB,addr getInt,FALSE
				.IF getInt==FALSE
					invoke MessageBox,hWnd,addr err_noText,addr err_cap,MB_OK
				
				.ELSE			
					
					mov nbLoop,ax	;Get the number entered
					
					invoke SpyCheckProc,hWnd
					
					.IF eax==NULL		;Spy doesn't exist
					
						call GetHandleProc	;Get the handle of DII
						.IF eax!=NULL		;Diablo is running
						
							;Write memory
											
							invoke WriteProcessMemory,processHandle,SPEEDADD,addr nbLoop,SIZEOF nbLoop,NULL
							test eax,eax
								jz Error_Writing
			
							invoke WriteProcessMemory,processHandle,BUFFADD,addr buffer,SIZEOF buffer,NULL
							test eax,eax
								jz Error_Writing
							
							invoke WriteProcessMemory,processHandle,MONSTCLICK,addr monstClickData,SIZEOF monstClickData,NULL
							test eax,eax
								jz Error_Writing
							
							invoke WriteProcessMemory,processHandle,PLAYERCLICK,addr playerClickData,SIZEOF playerClickData,NULL
							test eax,eax
								jz Error_Writing
								
							invoke WriteProcessMemory,processHandle,PLAYERCLICKSUB, addr playerClickSub,SIZEOF playerClickSub,NULL
							test eax,eax
								jz Error_Writing
							
							invoke WriteProcessMemory,processHandle,HITROUTINE,addr hitRoutineData,62,NULL
							test eax,eax
								jz Error_Writing
							
							invoke WriteProcessMemory,processHandle,SPACEADD,addr spaceAddData,SIZEOF spaceAddData,NULL
							test eax,eax
								jz Error_Writing
										
							;Patch successful							
							invoke MessageBox,hWnd,addr doneText,addr AppName,MB_OK
							jmp Done
							
							
							Error_Writing:
								invoke MessageBox,hWnd,addr err_writing,addr err_cap,MB_ICONERROR
							
							Done:
							
								invoke CloseHandle,processHandle ;Close the opened process
							
							
						.ENDIF
						
					.ENDIF
				.ENDIF			
			;***********************************************	
				
			.ELSEIF ax==IDM_UNDO
				
				invoke SpyCheckProc,hWnd
				
				.IF eax==NULL		;Spy doesn't exist
				
					invoke GetHandleProc	;Get the handle of DII
			
					.IF eax!=NULL		;Diablo is running
				
						invoke WriteProcessMemory,processHandle,MONSTCLICK,addr monstClickOld,SIZEOF monstClickOld,NULL
						test eax,eax
						jz Error_Patching
								
						invoke WriteProcessMemory,processHandle,PLAYERCLICK,addr playerClickOld,SIZEOF playerClickOld,NULL
						test eax,eax
						jz Error_Patching
				
				
						invoke WriteProcessMemory,processHandle,SPACEADD,addr spaceAddOld,SIZEOF spaceAddOld,NULL
						test eax,eax
						jz Error_Patching
				
				
					;Patch successful
					invoke MessageBox,hWnd,addr oldText,addr AppName,MB_OK
					jmp Done2
					
					Error_Patching:
					
						invoke MessageBox,hWnd,addr err_writingOld,addr err_cap,MB_ICONERROR
										
					Done2:
					
						invoke CloseHandle,processHandle ;Close the opened process
						
					.ENDIF
					
				.ENDIF	
				
					
			.ELSEIF ax==IDM_ABOUT
			
				invoke DialogBoxParam,hInstance,addr AboutDlgName,hWnd,addr AboutProc,NULL
				mov retDlg,eax
							
							
			.ELSEIF ax==IDM_INST
			
				invoke DialogBoxParam,hInstance,addr InstDlgName,hWnd,addr AboutProc,NULL
				mov retDlg,eax			
			
			
			.ELSEIF ax==IDM_INFO
			
				invoke DialogBoxParam,hInstance,addr InfoDlgName,hWnd,addr AboutProc,NULL
				mov retDlg,eax	
			
			
			.ELSE
				invoke DestroyWindow,hWnd
				
			.ENDIF
		.ELSE
			mov edx,wParam
			shr edx,16
			.IF dx==BN_CLICKED
				.IF ax==IDC_APPLY
					invoke SendMessage,hWnd,WM_COMMAND,IDM_APPLY,0
                        	.ELSEIF ax==IDC_UNDO
					invoke SendMessage,hWnd,WM_COMMAND,IDM_UNDO,0
				.ENDIF
			.ENDIF
		.ENDIF
	.ELSE
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
		ret
	.ENDIF
	xor    eax,eax
	ret
WndProc endp


GetHandleProc proc 

	invoke FindWindow,NULL,addr GameName
	.IF eax==NULL
		invoke MessageBox,NULL,addr err_mustRun,addr err_cap,MB_ICONEXCLAMATION
		xor eax,eax
		ret
	.ENDIF
	
	invoke GetWindowThreadProcessId,eax,addr processID
	invoke OpenProcess,PROCESS_ALL_ACCESS,NULL,processID
	
	mov processHandle,eax
	ret
	
GetHandleProc endp
		
		
SpyCheckProc proc handle:HWND

	szText SpyName,"TRAINER SPY"
	invoke FindWindow,NULL,addr SpyName

	.IF eax!=NULL	;Spy exists

		szText err_trainerSpy,"Close trainer spy...	"	;Hide string
		invoke MessageBox,handle,addr err_trainerSpy,addr err_cap,MB_ICONERROR
		push 1
		pop eax
		
	.ENDIF	
		
	ret

SpyCheckProc endp
		
		
AboutProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_INITDIALOG
		invoke GetDlgItem, hWnd,IDC_ABOUTOK
		invoke SetFocus,eax
		
		invoke SetDlgItemText,hWnd,INFO_TEXT,addr infoText
		
	.ELSEIF uMsg==WM_CLOSE
		invoke EndDialog,hWnd,NULL	

	.ELSEIF uMsg==WM_COMMAND	
		mov eax,wParam
		mov edx,eax
		shr edx,16
		.IF dx==BN_CLICKED
			.IF eax==IDC_ABOUTOK
				invoke EndDialog,hWnd,NULL
				
			.ENDIF
			
		.ENDIF
		
	.ELSE
		mov eax,FALSE
		ret
		
	.ENDIF
	
	mov eax,TRUE
	ret
	
AboutProc endp

end start
Path: /usr/games/hacks/diablo_2/autohits/Patch v1.09/AutoHits109.asm10793 bytes
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
GetHandleProc proto
SpyCheckProc proto :DWORD
AboutProc proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

;Define macro
szText MACRO Name, Text:VARARG 
        LOCAL lbl 
          jmp lbl 
            Name db Text,0 
          lbl: 
        ENDM

.data

ClassName db "OneClass",0
MenuName db "MyMenu",0
DlgName db "MyDialog",0
AppName db "Diablo II Auto Hits",0
TestString2 db "You clicked on the Undo Menu",0
AboutDlgName db "AboutBox",0		;About dialog
InstDlgName db "InstBox",0		;Instructions dialog
InfoDlgName db "InfoBox",0		;Hack info dialog


;String to search
GameName db "Diablo II",0

;ERRORS 
err_cap db "ERROR",0

err_noText db "You must specify the number of hit  ",0
err_zero db "Zero is not a valid number!	",0
err_mustRun db "Diablo II must be running!	",0
err_writing db "DLLs are not totally loaded in memory.	",13,10
	    db "	Join a game first",0	    
err_writingOld db "Cannot write in memory	",0


;DONE
doneText db "Diablo II has been successfully patched!",0
oldText db "The hack has been unloaded",0

infoText db "This hack works on Battle.net Realms, open games and TCP/IP games whether you're the host or not.",13,10
	 db 13,10
	 db "What this program does :",13,10
	 db "- Attack monsters/players on your screen by clicking on them without moving (Client side).",13,10
	 db "- Send multiple attack packets at the same time per click.",13,10
	 db "- Last Hit feature : Pressing the Space Bar will attack the last monster/player that you clicked on.",13,10
	 db 13,10
	 db "A complete and more detailed description of this hack can be found in the readme.txt along with this package.",13,10
	 db 13,10,13,10
	 db "The original copy of this program can always be found at http://onesided.cjb.net",0

;Icon
hIcon	  dd 0

;------------------------------------------------------------
;Datas to be written

buffer db 06h,01h,00h,00h,00h,01h,00h,00h,00h

monstClickData db 0e8h,021h,73h,1bh,00h,90h,90h

playerClickData db 0e8h,9eh,73h,1bh,00h,90h,90h,90h,90h,90h

playerClickSub db 0c6h,05h,4bh,0f8h,0cfh,6fh,00h,0e8h,0a4h,0ffh,0ffh,0ffh,0c3h

hitRoutineData db 0c6h,05h,4bh,0f8h,0cfh,6fh,01h,0e8h,04h,00h,00h,00h,8bh,46h,1ch,0c3h
	       db 89h,1dh,4fh,0f8h,0cfh,6fh,60h,66h,8bh,35h,5ah,0f8h,0cfh,6fh,0b9h,4ah
	       db 0f8h,0cfh,6fh,8bh,15h,84h,0b0h,0c0h,6fh,6ah,00h,6ah,09h,51h,52h,0ffh
	       db 15h,84h,71h,0c0h,6fh,66h,4eh,66h,85h,0f6h,75h,0e2h,61h,0c3h
	     
spaceAddData db 0e8h,0bh,24h,23h,00h,0c3h

;------------------------------------------------------------

;Original Datas

monstClickOld db 85h,0c0h,74h,25h,8bh,46h,1ch

playerClickOld db 53h,33h,0d2h,8bh,0ceh,0e8h,0efh,02h,00h,00h
	       
spaceAddOld db 0e9h,0ebh,0b6h,0fdh,0ffh,90h


.data?

hInstance HINSTANCE ?
retDlg dd ?
getInt db ?
nbLoop dw ?
processID dd ?
processHandle dd ?


.const
IDC_APPLY      equ 3000
IDC_UNDO        equ 3001
IDC_TEXT	equ 3002
IDC_GETNB	equ 3003
IDM_APPLY     equ 32000
IDM_UNDO      equ 32001
IDM_EXIT        equ 32002
IDM_ABOUT	equ 32003
IDM_INST	equ 32004
IDM_INFO	equ 32005

INFO_TEXT	equ 5000
IDC_ABOUTOK	equ 4000

;Addresses memory to be patched
SPEEDADD equ 6fcff85ah
BUFFADD equ 6fcff84ah
MONSTCLICK equ 6fb484e4h
PLAYERCLICK equ 6fb484c7h
PLAYERCLICKSUB equ 6fcff86ah
HITROUTINE equ 6fcff80ah
SPACEADD equ 6facd410h


.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	
	invoke WinMain, hInstance,NULL,NULL,SW_SHOWDEFAULT
	invoke ExitProcess,eax
	
	
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
	
	LOCAL wc:WNDCLASSEX
	LOCAL msg:MSG
	LOCAL hDlg:HWND
	
	invoke LoadIcon,hInst,500    ; icon ID
      	mov hIcon, eax
	
	mov   wc.cbSize,SIZEOF WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, OFFSET WndProc
	mov   wc.cbClsExtra,NULL
	mov   wc.cbWndExtra,DLGWINDOWEXTRA
	push  hInst
	pop   wc.hInstance
	mov   wc.hbrBackground,COLOR_BTNFACE+1
	mov   wc.lpszMenuName,OFFSET MenuName
	mov   wc.lpszClassName,OFFSET ClassName
	
	push hIcon		; Put Icon on the Exe
	pop   wc.hIcon
	push hIcon
	pop   wc.hIconSm
	
	invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	
	invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL
	mov   hDlg,eax
		
	INVOKE ShowWindow, hDlg,SW_SHOWNORMAL
	INVOKE UpdateWindow, hDlg
	
	invoke GetDlgItem,hDlg,IDC_APPLY
	invoke SetFocus,eax
			
	.WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke IsDialogMessage, hDlg, ADDR msg
                .if eax==FALSE
                        INVOKE TranslateMessage, ADDR msg
                        INVOKE DispatchMessage, ADDR msg
                .endif
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
						
	.IF uMsg==WM_DESTROY
		invoke PostQuitMessage,NULL
	.ELSEIF uMsg==WM_COMMAND
		mov eax,wParam
		.IF lParam==0
			
			;***********************************************
			.IF ax==IDM_APPLY
			
				invoke GetDlgItemInt,hWnd,IDC_GETNB,addr getInt,FALSE
				.IF getInt==FALSE
					invoke MessageBox,hWnd,addr err_noText,addr err_cap,MB_OK
				
				.ELSE			
										
					.IF eax==NULL 	;If the user entered 0 hit
						invoke MessageBox,hWnd,addr err_zero,addr err_cap,MB_ICONERROR
						
					.ELSE					
								
						mov nbLoop,ax	;Get the number entered
										
						invoke SpyCheckProc,hWnd
					
						.IF eax==NULL		;Spy doesn't exist
					
							call GetHandleProc	;Get the handle of DII
							
							.IF eax!=NULL		;Diablo is running
						
								;Write memory
												
								invoke WriteProcessMemory,processHandle,SPEEDADD,addr nbLoop,SIZEOF nbLoop,NULL
								test eax,eax
								jz Error_Writing
			
								invoke WriteProcessMemory,processHandle,BUFFADD,addr buffer,SIZEOF buffer,NULL
								test eax,eax
								jz Error_Writing
								
								invoke WriteProcessMemory,processHandle,MONSTCLICK,addr monstClickData,SIZEOF monstClickData,NULL
								test eax,eax
								jz Error_Writing
							
								invoke WriteProcessMemory,processHandle,PLAYERCLICK,addr playerClickData,SIZEOF playerClickData,NULL
								test eax,eax
								jz Error_Writing
								
								invoke WriteProcessMemory,processHandle,PLAYERCLICKSUB, addr playerClickSub,SIZEOF playerClickSub,NULL
								test eax,eax
								jz Error_Writing
							
								invoke WriteProcessMemory,processHandle,HITROUTINE,addr hitRoutineData,62,NULL
								test eax,eax
								jz Error_Writing
								
								invoke WriteProcessMemory,processHandle,SPACEADD,addr spaceAddData,SIZEOF spaceAddData,NULL
								test eax,eax
								jz Error_Writing
										
								;Patch successful							
								invoke MessageBox,hWnd,addr doneText,addr AppName,MB_OK
								jmp Done
							
							
								Error_Writing:
									invoke MessageBox,hWnd,addr err_writing,addr err_cap,MB_ICONERROR
								
								Done:
							
									invoke CloseHandle,processHandle ;Close the opened process
							
							.ENDIF
						.ENDIF						
					.ENDIF
				.ENDIF			
			;***********************************************	
				
			.ELSEIF ax==IDM_UNDO
				
				invoke SpyCheckProc,hWnd
				
				.IF eax==NULL		;Spy doesn't exist
				
					invoke GetHandleProc	;Get the handle of DII
			
					.IF eax!=NULL		;Diablo is running
				
						invoke WriteProcessMemory,processHandle,MONSTCLICK,addr monstClickOld,SIZEOF monstClickOld,NULL
						test eax,eax
						jz Error_Patching
								
						invoke WriteProcessMemory,processHandle,PLAYERCLICK,addr playerClickOld,SIZEOF playerClickOld,NULL
						test eax,eax
						jz Error_Patching
				
				
						invoke WriteProcessMemory,processHandle,SPACEADD,addr spaceAddOld,SIZEOF spaceAddOld,NULL
						test eax,eax
						jz Error_Patching
				
				
					;Patch successful
					invoke MessageBox,hWnd,addr oldText,addr AppName,MB_OK
					jmp Done2
					
					Error_Patching:
					
						invoke MessageBox,hWnd,addr err_writingOld,addr err_cap,MB_ICONERROR
										
					Done2:
					
						invoke CloseHandle,processHandle ;Close the opened process
						
					.ENDIF
					
				.ENDIF	
				
					
			.ELSEIF ax==IDM_ABOUT
			
				invoke DialogBoxParam,hInstance,addr AboutDlgName,hWnd,addr AboutProc,NULL
				mov retDlg,eax
							
							
			.ELSEIF ax==IDM_INST
			
				invoke DialogBoxParam,hInstance,addr InstDlgName,hWnd,addr AboutProc,NULL
				mov retDlg,eax			
			
			
			.ELSEIF ax==IDM_INFO
			
				invoke DialogBoxParam,hInstance,addr InfoDlgName,hWnd,addr AboutProc,NULL
				mov retDlg,eax	
			
			
			.ELSE
				invoke DestroyWindow,hWnd
				
			.ENDIF
		.ELSE
			mov edx,wParam
			shr edx,16
			.IF dx==BN_CLICKED
				.IF ax==IDC_APPLY
					invoke SendMessage,hWnd,WM_COMMAND,IDM_APPLY,0
                        	.ELSEIF ax==IDC_UNDO
					invoke SendMessage,hWnd,WM_COMMAND,IDM_UNDO,0
				.ENDIF
			.ENDIF
		.ENDIF
	.ELSE
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
		ret
	.ENDIF
	xor    eax,eax
	ret
WndProc endp


GetHandleProc proc 

	invoke FindWindow,NULL,addr GameName
	.IF eax==NULL
		invoke MessageBox,NULL,addr err_mustRun,addr err_cap,MB_ICONEXCLAMATION
		xor eax,eax
		ret
	.ENDIF
	
	invoke GetWindowThreadProcessId,eax,addr processID
	invoke OpenProcess,PROCESS_ALL_ACCESS,NULL,processID
	
	mov processHandle,eax
	ret
	
GetHandleProc endp
		
		
SpyCheckProc proc handle:HWND

	szText SpyName,"TRAINER SPY"
	invoke FindWindow,NULL,addr SpyName

	.IF eax!=NULL	;Spy exists

		szText err_trainerSpy,"Close trainer spy...	"	;Hide string
		invoke MessageBox,handle,addr err_trainerSpy,addr err_cap,MB_ICONERROR
		push 1
		pop eax
		
	.ENDIF	
		
	ret

SpyCheckProc endp
		
		
AboutProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_INITDIALOG
		invoke GetDlgItem, hWnd,IDC_ABOUTOK
		invoke SetFocus,eax
		
		invoke SetDlgItemText,hWnd,INFO_TEXT,addr infoText
		
	.ELSEIF uMsg==WM_CLOSE
		invoke EndDialog,hWnd,NULL	

	.ELSEIF uMsg==WM_COMMAND	
		mov eax,wParam
		mov edx,eax
		shr edx,16
		.IF dx==BN_CLICKED
			.IF eax==IDC_ABOUTOK
				invoke EndDialog,hWnd,NULL
				
			.ENDIF
			
		.ENDIF
		
	.ELSE
		mov eax,FALSE
		ret
		
	.ENDIF
	
	mov eax,TRUE
	ret
	
AboutProc endp

end start
Path: /usr/games/hacks/diablo_2/autohits/Patch v1.09/readme.txt2496 bytes
				  Diablo II Auto Hits

-------------------------------------
CHANGES :

Version 1.1 08/22/01
1. Works with DII v1.09
2. Fixed the zero hit bug

-------------------------------------
				
				  
This hack works on Battle.net Realms, open games and TCP/IP games whether you're the host
or not. What this program does :

- Attack monsters/players on your screen by clicking on them without moving (Client side).
- Send multiple attack packets at the same time per click.
- Last Hit feature : Pressing the Space Bar will attack the last monster/player that you clicked
on.


However, even if it doesn't appear on the client screen, when you click on a target you will
actually go near of your enemy, or at the appropriate range of you weapon, to be able to hit
him. Which means, monsters/players are able to hit you even if they appear far from you. 

The configurable ammount of hit is actually the number of attack packets sent to the server when
you click on a target. Since all these packets are sent at the same time, most of them will be
ignored by the server. So it means the higher you set the number, the most will be actually 
valids and interpreted correctly. Setting it to 500 will approximately be 3 attacks in a row.
I've set the default ammount to 300. Note that setting it higher than this might freeze for a sec
people with low connection speed. The maximum is set to 999, cause if you send this ammount at
the same time you will most likely get booted from the game.

Pressing the Space Bar on your keyboard will automaticly attack the last monster or player you
have clicked on during that game. Can be useful while dueling or for Bosses. Also, it gives
you the chance to do other things while attacking, like taking a potion or running in circle :)
It's the same as if you were clicking on the target, so it will also send the number of attack
packets that you specified.

You can apply or unload the hack at anytime, but you must at least have joined one game since
you ran Diablo II to load all DLLs in memory.


This hack is not awesome, but I decided to release it 'cause some people might like it.


				Greetings to everyone I know and
			 special thanks to Red2run and ��V�G�^V^�W~��� 
			   for being my beta testers and to have spent
		    times with me while I was working on my codes and trying
				        some new shits :)


Have fun.

* -Arsenic-  a.k.a  Artemis`Entreri
My codes : http://onesided.cjb.net

SEE ALSO

  • d2-autohits(7) — Annotated ASM source for AutoHits — a Diablo II hack that fires multiple attack packets per click by patching game memory at runtime.

TECHNOLOGIES

  • x86 Assembly
  • Memory Patching
  • Automated Combat
int03h.com circa 2001 D2-AUTOHITS(6)