魔兽显血改建工具的制作及源码

1 篇文章 0 订阅
1 篇文章 0 订阅

 

        这段时间课很少,刚刚好罗云彬大大的那本WIN32汇编看到了第11章钩子,于是就想试着写一个魔兽改建显血的小工具。用OD逆向网上流行的那些魔兽工具发现,有的是用底层键盘钩子实现的,比如说xlWarKey,有的是用消息钩子等,因为不太熟悉用DLL,也不想弄个小工具还要有2个文件,就用了底层键盘钩子WH_KEYBOARD_LL

 

        目前实现的功能有:

1.      显血显魔法,最小化后重进游戏仍然显示血条和魔法

2.      屏蔽WIN键,改键,智能识别是聊天状态还是操作状态。

 

        下面是我的主要实现思路:

1.      显血:建立一个线程,检测魔兽窗口是否是当前激活窗口,若是,则用计时器回调函数每隔一定时间发送VK_OEM_4VK_OEM_6WM_KEYDOWN消息,模拟2个按键的按下,

函数就是:

invoke        SendMessage,hWinWar3,WM_KEYDOWN,VK_OEM_4,0
invoke       SendMessage,hWinWar3,WM_KEYDOWN,VK_OEM_6,0


若魔兽窗口失去焦点,这发送一次WM_KEYUP消息

2.      改键:建立2个数组,一个存储小键盘6个键和用户输入的要修改的键的虚拟码,另一个存储要修改成的虚拟码,每次被钩子钩到就循环处理里面的内容。

智能识别改键是通过读取魔兽的内存0045cb8c处的偏移,若为1则为聊天模式,为0则为操作模式。

invoke        ReadProcessMemory,hProcWar3,CHEATADDR,addr OldData,4,NULL
.if       eax
mov eax,dword ptr OldData
           mov bIsCheat,eax
.endif

为什么是这个地址呢,我是用Cheat Engine这个软件,通过不断调出和关闭聊天条来查找内存中的10找到的这个地址,结果果然是这里判断是否是处于聊天状态。后来发现U9出的那个爆强的魔兽工具也是用这种方法的,嘿嘿

 

附上目前各个版本的地址:

(注:以下地址转自http://www.streamlet.org/view.asp?id=9,因为我现在装了WIN7,Cheat Engine用不了了,2010.1.11日更新)

1.20、1.21:
 0x0045CB8C
以下偏移相对于game.dll
1.22:
 0x00ABDFE0
 
1.23:
 0x00AD6E30
 
1.24
 0x00AE8450

 

3.      其他:

(1).模拟按键按下用的是keybd_event函数

invoke        keybd_event,edx,0,KEYEVENTF_EXTENDEDKEY or 0,0;按下
invoke        keybd_event,edx,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0;抬起


(2).钩子设置

invoke        SetWindowsHookEx,WH_KEYBOARD_LL,addr HookProc,hInstance,NULL;设置钩子
.if                eax
mov hHook,eax
.endif

 钩子回调函数:

         HookProc          proc          _dwCode,_wParam,_lParam
                   .if               _dwCode ==     HC_ACTION
                            mov ecx,_wParam
                            .if      ecx ==WM_KEYUP || ecx ==WM_KEYDOWN
                                     mov esi,_lParam
                                               mov ebx,DWORD PTR [esi]
                                               .if      ebx == VK_RWIN      ||     ebx ==VK_LWIN
                                               ……………..
                                               .elseif 处理各种案键
                                               ………………
                                               .endif
                            .endif
                   .endif
         invoke       CallNextHookEx,hHook,_dwCode,_wParam,_lParam
         Ret
         HookProc endp


        (3).因为要读取魔兽进程空间,所以要用这些函数提升程序自己的权限令牌

                  invoke       GetCurrentProcess
                  invoke       OpenProcessToken,eax, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY,addr lphToken
                   mov ebx,dword ptr lphToken
                   push          ebx
                   invoke       LookupPrivilegeValue,NULL,addr szDebug,addr tkp.Privileges[0].Luid
                   mov           tkp.PrivilegeCount,1
                   mov           tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
                   pop  ebx
                   invoke       AdjustTokenPrivileges,ebx,FALSE,addr tkp,NULL,NULL,0

通过上面的提升,就可以调用
                   invoke       OpenProcess,PROCESS_ALL_ACCESS,FALSE,ebx;ebx值为魔兽进程ID

这样就可以读取魔兽的内存了

invoke      ReadProcessMemory,hProcWar3,CHEATADDR,addr OldData,4,NULL

(4).最小化到系统托盘,用的是函数Shell_NotifyIcon这个API,不过貌似因为MASM32WINDOWS.INC里的NOTIFYICONDATA结构体没有气球提示相关的东西,所以只能最小化到托盘,无法冒出那个气球提示,即使添加上了缺少的那些仍然没有那个气球提示,郁闷………

添加后的结构体

NOTIFYICONDATAA STRUCT
cbSize DWORD ?
hwnd DWORD ?
uID DWORD ?
uFlags DWORD ?
uCallbackMessage DWORD ?
hIcon DWORD ?
szTip BYTE 64 dup (?)
dwState DWORD ?
dwStateMask DWORD ?
szInfo BYTE 256 dup (?)
union
uTimeout DWORD ?
uVersion DWORD ?
ends
szInfoTitle BYTE 64 dup (?)
dwInfoFlags DWORD ?
guidItem DWORD ?
hBalloonIcon DWORD ?
NOTIFYICONDATAA ENDS,直接代替windows.inc的那个,或自己定义一个
;*************************************************************************
;        添加图标到系统托盘
;*************************************************************************
Icon_Add proc hWnd:DWORD
                            invoke       RtlZeroMemory,addr ntfData,sizeof       ntfData
                            mov ntfData.cbSize,sizeof       ntfData
                            push          hWnd
                            pop  ntfData.hwnd
                            mov ntfData.uFlags,NIF_MESSAGE or 16  or NIF_ICON OR NIF_TIP
                            mov ntfData.uCallbackMessage,MYWM_NOTIFYICON
                            mov ntfData.uID,IDC_ICO
                            push          hIco
                            pop  ntfData.hIcon
                            invoke       lstrcpy,addr ntfData.szTip,addr szHelp
                            invoke       lstrcpy,addr ntfData.szInfo,addr szHelp
                            mov ntfData.uTimeout,10000
                            mov ntfData.dwInfoFlags,1
                            mov ntfData.dwState,0
                            mov ntfData.dwStateMask,0
                            invoke       lstrcpy,addr ntfData.szInfoTitle,addr szHelp
                           
                            invoke       Shell_NotifyIcon,NIM_ADD,addr ntfData      
         Ret
Icon_Add endp
;******************************************************************************
;        删除系统托盘图标
;********************************************************************************
Icon_Del  proc
        
         invoke       Shell_NotifyIcon, NIM_DELETE,addr ntfData
         Ret
Icon_Del endp

而对托盘图标的消息处理 , 则是在主对话框消息回调函数里处理

.elseif       eax   ==     MYWM_NOTIFYICON
                   .if      lParam==WM_LBUTTONDOWN
                            invoke       ShowWindow,hWnd,SW_NORMAL
                            invoke       Icon_Del
                            ret
                   .endif


整个工程的代码我传到资源里面了,本来还想加入全图的,但是发现全图对版本有要求,分别去试验感觉比较麻烦,而且全图作弊也没有意思,所以就没去弄了。因为可以算是第一次自己写窗体程序,所以可能很多地方做的比较繁琐,有任何想法都可以和我联系,大家一起进步哈,呵呵。顺便鄙视下,发现这一类的资料好少啊,去魔兽的社区里就看到工具满天飞,源码就少的个要死,唉~~~~再次体会到逆向的重要性^-^

PS:在这里要特别感谢老江陪我一起测试这个工具(就是打魔兽啦,嘿嘿)


================================================================================

魔兽前段时间出了1.23,后来又网友反映说1.23版本无法正常改建,打了1.23的更新包,还是老办法,查了一下,发现1.23的判断地址已经不再是原来的那个地址了,而是在Game.dll内的00ad6e30h偏移处了,也就是:offset Game.dll +00ad6e30h,所以修改了一下原来的代码:

先判断魔兽的版本,如果不是1.23则用原来的地址,1.23版本则用新的地址,先找到game.dll的地址(枚举魔兽进程所有模块
EnumProcessModules找到),然后根据00ad6e30H偏移处判断...... 

 

最后感谢给我发邮件的各位热心童鞋们,谢谢大家~~~

 

 魔兽小助手V0.3下载地址:

http://e.ys168.com/?bysdy

csdn资源那刚刚传上去,还没显示出来,所以过段时间再放上来....

csdn资源上次传上去到现在还没显示出来.......

魔兽小助手截图

 

 09/8/14

更新了fengjilanghen网友提出的BUG......

        

 

================================================================================

2010/4/22

更新日志:

  

因为原来0.3,V0.4的代码因为各种意外导致再也找不到了,所以只好重新写了一遍了。具体代码已上传到:http://e.ys168.com/?bysdy 

 

 

 

 前面已经说了,魔兽在1.21之后的版本的改建判断不再是原来的war3.exe中的地址,而是根据GAME.DLL中的地址来判断是否是处于聊天状态或是需要改建。
具体地址以前也说过了,具体的判断方法是:

首先是获取魔兽的版本号,方法是:
1.用FindWindow获取war3.exe的窗口句柄
2.用GetWindowThreadProcessId,OpenProcess根据窗口句柄,获取war3的进程句柄
3.用EnumProcessModules获取war3的模块基地址列表,调用GetModuleFileNameEx获取war3的路径
4.根据获取到的路径(X:/.../war3.exe),替换为x:/.../game.dll
5.调用GetFileVersionInfoSize,GetFileVersionInfo,VerQueryValue,获取game.dll的版本号,并保存
6.调用GetModuleFileNameEx,比较获取的路径是否是前面获取到x:/.../game.dll,若相同,则是game.dll,在根据索引即可获取game.dll的基地址
7.根据前面获取的版本号,把相应的固定地址与是game.dll相加即可

 

 

 

===================================================================================

10/5/11更新

上次有朋友发来邮件说魔兽显示魔法条的事情,自己后来想了下,觉得实现起来貌似很麻烦,后来上网百度了下,发现牛人lynnux的一篇文章《关于war3显示魔法条》http://hi.baidu.com/lynnux/blog/item/5b279446cd59ef026a63e55a.html,看了一下,了解了个大概,在根据lynnux大牛的程序,自己也尝试着实现显示魔法条的功能,根据文章中说的,最初是一个老外根据game.dll的一些函数调用,自己画出魔兽的魔法蓝条,很牛很强大...

其实很多都是网上的东西,感谢网上共享资料的各位...

首先是画出魔法条的代码,我是根据lynnux的mana.dll拷出来,最近事情比较多,心情也不太好,所以没管具体是怎么实现的,因为都是汇编所以不用怎么弄,拿过来稍微改下就行了,而且省下了DLL注入的麻烦...

下面是具体的步骤:

1.在自己的程序中完成画出魔法条的功能代码

2.用VirtualAllocEx在war3中申请一块内存

3.用WriteProcessMemory把程序中的魔法显示功能的相关代码写入进去

4.调用CreateRemoteThread执行前面的代码...

执行注入的代码:

然后再说说注入的那段代码的作用:

1.根据魔兽的版本,获取game.dll中相应的函数地址,这些在后面画魔法条的时候会用到

2.HOOK里面的2个函数,这样才会在每次按下alt或[,]建后,在画出血条的同时,调用我们自己的函数,画出魔法条

 

 

注意:因为是HOOK函数来实现,所以必须在载入地图之前开启显示魔法功能,要不程序会出错的...

貌似具体就是这样了,整个代码和程序下载在http://e.ys168.com/?bysdy

 

最后,再次膜拜下老外exzap还有lynnux......

 

PS:因为没玩过VS之类的平台的东西,对VS的检测机制什么的不太清楚,所以不知道算不算外挂违规,要是有兴趣的同学可以试试看。刚刚在最新的VS上玩了几次,貌似可以,至于会不会封号之类的就不晓得啦,所以所有使用引起的后果就自负吧...

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
U盘启动制作工具是指能够将一个可引导的操作系统镜像文件安装到U盘上,使得用户可以通过U盘来启动并运行该操作系统的工具。这种工具通常会提供一个用户友好的界面,方便用户选择镜像文件和U盘设备,并自动执行相应的操作,完成U盘启动盘的制作过程。 U盘启动制作工具码主要包含以下几个方面的内容: 1. 用户界面:码中将包含用户界面的设计和实现,用于示操作界面、提供选择镜像文件和设备的功能,并展示制作过程的进度和结果。 2. 存储设备管理:码中将包含对U盘设备的检测和管理功能,用于自动识别插入的U盘、获取U盘的相关信息,以及对U盘设备进行分区、格式化等操作。 3. 操作系统镜像处理:码中将包含对操作系统镜像文件的处理功能,用于校验镜像文件的完整性、提取镜像文件中的引导程序和系统文件,并将其写入U盘的引导区和存储分区。 4. 引导设置:码中将包含对U盘设备的引导设置功能,用于将写入的引导程序和系统文件与U盘设备的启动顺序关联起来,以实现U盘的启动功能。 5. 错误处理和日志记录:码中将包含对操作过程中出现的错误进行处理,并将制作过程的详细日志记录下来,便于用户查看和排除问题。 需要注意的是,U盘启动制作工具码开发需要熟悉相关的编程语言和操作系统相关的底层知识,如C/C++、Python等编程语言,以及Windows/Linux等操作系统相关的API和驱动程序开发。此外,还需要对U盘的存储结构和操作系统的启动过程有一定的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值