首页
社区
课程
招聘
[原创]外挂普及教程
发表于: 2010-3-10 20:56 54880

[原创]外挂普及教程

2010-3-10 20:56
54880
标 题: 【原创】外挂普及教程
作 者: garyzjq
时 间: 2010-3-10 20:59
链 接: http://bbs.pediy.com/showthread.php?t=108616

最近看到几篇关于问外挂制作的帖子,那我就来介绍一种常用的简单的外挂注入方式吧,仅作为普及教程(觉得在看雪发表这种没技术含量的文章比较上不了台面。。。)
这里只介绍自己怎么做外挂,就不介绍怎么穿过NP或其他游戏保护或者怎么做商用外挂(一是我没做过,二是做了估计也立马被这里的牛们当CrackMe了。。。=。=)

好了,我不废话了
做调用CALL的外挂主要是要找基址找偏移找CALL地址,这些我就不介绍了,可以去看看“啊冲视频笔记”之类的外挂教学视频,很容易就掌握了,由于“未经同意,请不要转载”这句话,我就不在这里公布下载地址了。。。

找到这些地址之后就是怎么在外挂中找到游戏及显示数据(比如HP、MP)和利用CALL
下面来介绍显示数据和利用CALL

一、疯狂CreateRemoteThread(VC++6环境)
这种办法,不需要建立DLL,对于没做过DLL的初学者来说就比较简单,但效率没后一种高
1.首先,你要获得这个游戏进程的句柄
  //找窗体
 	iHWnd=::FindWindow(aClassName,aWindowName);
  //获得进程PID
  ::GetWindowThreadProcessId(iHWnd,&iPID);
	//用PROCESS_ALL_ACCESS属性打开这个进程
	iProcessHandle=::OpenProcess(PROCESS_ALL_ACCESS,false,iPID);
       
有了这个iProcessHandle你就能用ReadProcessMemory和WriteProcessMemory来读和写游戏进程里的数据了
那么显示的问题就解决了
	::ReadProcessMemory(iProcessHandle,(LPCVOID)(aAddr+aBuffer),(LPVOID)aBuf,aSize,&readbyte);
	::WriteProcessMemory(iProcessHandle,(LPVOID)(aAddr+aBuffer),(LPVOID)aBuf,aSize,&writebyte);


要读一个DWORD或者一个指针地址可以如下
  DWORD temp;
  ::ReadProcessMemory(iProcessHandle,(LPCVOID)(aAddr+aBuffer),(LPVOID)&temp,4,&readbyte);

  这里aAddr是基址,aBuffer是偏移,aBuf是读/写入数据缓存的地方,aSize是读/写入数据大小
一般读HP MP之类的就能这么读

2.之后就是调用CALL,前提是已经找到了正确的call地址。调用CALL其实就是在你代码里写入类似 mov eax,xxxxxxxx CALL eax(前面可能有一些push传参数)的汇编代码,然后把这段代码写入游戏的进程里,然后再创建一个远程线程在游戏进程里运行这段代码,它就调用那个CALL实现某些功能了
  //在目标进程里申请要注入代码的空间
	iCallBase=::VirtualAllocEx(iProcessHandle,NULL,MAX_CALL_SIZE,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  iArgBase=::VirtualAllocEx(iProcessHandle,NULL,MAX_ARG_SIZE,MEM_COMMIT,PAGE_READWRITE);
  //写入函数代码
	if(!::WriteProcessMemory(iProcessHandle,iCallBase,aAddFunc,MAX_CALL_SIZE,&numofbyte))return 0;
	if(!numofbyte)return 0;
	if(aAddArg&&aArgSize>0)
	{
		numofbyte=0;
		if(!iArgBase)return 0;
		//写入参数代码(可以没有参数)
		if(!::WriteProcessMemory(iProcessHandle,iArgBase,aAddArg,aArgSize,&numofbyte))return 0;
		if(numofbyte!=aArgSize)return 0;
	}
	//关键!远程创建线程,这样游戏就开始创建一个线程运行你这段代码了
  iRemoteThreadHandel=::CreateRemoteThread(iProcessHandle,NULL,0,(LPTHREAD_START_ROUTINE)iCallBase,iArgBase,0,NULL);
	if(!iRemoteThreadHandel)return 0;
	::WaitForSingleObject(iRemoteThreadHandel,INFINITE);
	::CloseHandle(iRemoteThreadHandel);
	iRemoteThreadHandel=NULL;

注意:
a.用push传参数是c里面一般函数调用的做法,所以你要确保游戏是用c语言写的
b.由于某些原因(网上有说,这里不重复),你要远程CALL的话一定不能用debug编译外挂程序,一定要用release,而且嵌入的代码要尽可能简单,不然有很多原因会让你远程失败

剩下的事情就很简单了,在外挂里设个SetTimer(),把检查HP然后吃药,检查有没有打怪,选怪打怪等等的功能放进去组合一下就好了
这个方法不用做DLL,一个exe就能搞定,但是有个小问题,你如果装360安全卫士然后让外挂运行一小时的话会发现他已经记录了几万个远程创建线程事件。。。因此称之为“疯狂CreateRemoteThread”

二、DLL注入(VC++6 & DELPHI 7)
有个前提,游戏不反对你注入=。=(或者参考论坛里的一篇介绍利用输入法注入的文章也行)
DLL注入就要你先写一个DLL,里面就是外挂程序,然后把这个DLL注入到目标游戏,启动它,让它不断检查HP打怪状态等等然后CALL,这些基本和上一种方法一致
这里主要来说一下怎么注入一个始终伴随游戏存在的DLL,并且能在游戏里呼出挂的窗口进行一些设置

1.呼出窗口
  大家都知道,一般呼出就是在DLL里用钩子挂钩KEYBOARD
 	iHook:=SetWindowsHookEx(WH_KEYBOARD, MyHookProc , HInstance, aThreadId);
  //键盘挂钩反馈函数
  function MyHookProc(iCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
  var
    wKey:word;
  begin
    wKey:=word(wParam);
    if (HIWORD(lParam) and KF_UP = 0) and (HC_ACTION = iCode)  then
      //按F2显示外挂呼出窗口
      if (wKey = VK_F2) then
      begin
          frmMain.Show;
          end;
      //按F3隐藏外挂呼出窗口
      if (wKey = VK_F3) then
      begin
          frmMain.Hide;
          end;
      //按F4结束外挂线程
      if(wKey = VK_F4) then
      begin
          iIsExit:=1;
      end;
      Result:=CallNextHookEx(iHook,iCode,wParam,lParam);
  end;
  
2.DLL的制作
  这里我用到了DELPHI 7,因为要做一个可以呼出窗口的DLL嘛,VC++在DLL里放个窗体显示貌似有点麻烦,所以这里我选用DELPHI,懂VC++的不要BS我啊。。。
  DLL要完成的是如何创建一个伴随游戏主线程而存在的子线程
  在DLL的入口:
    CreateThread(nil,0,@ZStartThread,nil,0,id);
    
procedure ZStartThread;stdcall;
begin
    //挂钩键盘
    if not ZHookKeyboard(ZGetMainThreadId(GetCurrentProcessId())) then
    begin
    	messagebox(0,'hook error',0,0);
      exit;
    end;
    //建一个FORM,是已经编辑好的外挂呼出窗口
    frmMain:=TfrmMain.Create(nil);
  //这里创建了一个循环的线程,直到iIsExit=1
	while iIsExit=0 do
    begin
      //主动让出CPU
    	sleep(1);
      application.ProcessMessages;
    end;
    //卸载钩子
    if not ZUnhookKeyboard() then
    begin
    	messagebox(0,'unhook error',0,0);
      exit;
    end;
    frmMain.FreeOnRelease;
    DLLProc(DLL_PROCESS_DETACH);
end;


基本上DLL框架就这点内容,具体怎么显示HP怎么CALL就要根据游戏实际情况了

3.DLL注入进游戏
那么怎么注入进游戏呢?其实有两种方式,一种是挂键盘钩子,然后在游戏中按呼出外挂键,这时如果游戏进程内没有该DLL,则系统会帮你加载进去,完成了注入(附件ZCommonWG2);还有一种是利用CreateRemoteThread,让游戏主动LoadLibrary你的外挂DLL(附件ZCommonWG)
这里用后一种方式实现(VC++)

int RemoteLoadDll(HWND aHwnd)
{
	DWORD dwId;
	HANDLE hProcess;
	char sz[MAX_PATH];
	HANDLE hThread;
	DWORD dwModule;
	void *pData;

	::GetWindowThreadProcessId(aHwnd,&dwId);
	hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwId);
	if(!hProcess)return 0;
	ZFile::ZGetCurFileName(sz,"ZKeyHook.dll");
	pData=::VirtualAllocEx(hProcess,0,sizeof(sz)+1,MEM_COMMIT,PAGE_READWRITE);
	if(!pData)return 0;
	if(!::WriteProcessMemory(hProcess,pData,sz,sizeof(sz)+1,0))	return 0;
	hThread=::CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)::GetProcAddress(::LoadLibrary("kernel32.dll"),"LoadLibraryA"),pData,0,0);
	if(hThread==NULL)return 0;
	::WaitForSingleObject(hThread,INFINITE);
	::GetExitCodeThread(hThread,&dwModule);
	::CloseHandle(hThread);
	::VirtualFreeEx(hProcess,pData,sizeof(sz),MEM_RELEASE);
	hThread=::CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)::GetProcAddress(::LoadLibrary("kernel32.dll"),"FreeLibrary"),&dwModule,0,0);
	if(hThread==NULL)return 0;
	::WaitForSingleObject(hThread,INFINITE);
	::CloseHandle(hThread);
	::CloseHandle(hProcess);
	return 1;
}


CreateRemoteThread的使用在第一种方式里介绍过了,这里就不重复了

要注意的是,在2中说在DLL入口用CreateThread建立一个无限循环的线程,而不是在DLL入口直接无限循环,否则会导致远程注入的程序因等待LoadLibrary结束而挂起

总结:这里只是大致介绍了DLL的一种注入方式和做这类外挂的一个大体框架,具体外挂的代码还要自己实践来实现,比如找CALL就要用到OD,所以新人们OD技术一定要过关啊~

提示,示例代码中凡是函数前有Z字母的基本就是用户定义的函数(我的坏习惯~嘿嘿)

这是偶滴看雪处女座,如果有不当之处请大家见谅,如果有错误或不足之处请大家指出啊~

下面两个源码(在文中已经分别介绍过他们的实现原理了):

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (52)
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
支持,期待下文
2010-3-10 21:49
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
对我这个初学者确实有用,我已经收藏了,呵呵
2010-3-28 11:47
0
雪    币: 1045
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2010-3-28 14:08
0
雪    币: 204
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还有没有下文的
2010-3-28 16:51
0
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢楼主分享,期待下文
2010-3-30 20:16
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
外挂要都这么做,游戏开发商不用混了
2010-3-30 20:18
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持一下,普及是好的 ;)
2010-3-31 01:32
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持一下先。。。
2010-4-3 16:52
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持一下..
2010-4-3 17:19
0
雪    币: 2194
活跃值: (1001)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
多一些这样的科普文章就好啊
2010-4-3 23:44
0
雪    币: 555
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错 支持一下
2010-4-4 12:22
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
外挂最重要的是逆向分析游戏,而不是这些编程上的花招吧。。。
2010-4-4 12:42
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
这个好像对时髦的游戏没用吧  进去要有作为至少要有个dll吧 Read/WriteProcessMemory一般说来是属于刀耕火种 会累死人的 stud_pe有给dll加输入项功能 不过这个很不现实 有很多哥哥有这的源码也舍不得拿出来分享 看来这些为人民做好事的精神只有我才有了 大家等我吧
2010-4-4 14:46
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
哈 我喜欢 这个 嘿嘿
2010-4-5 00:07
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感谢楼主分享,期待下文
2010-4-5 23:40
0
雪    币: 201
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
请的非常好,支持
2010-4-6 02:38
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我觉的不错,支持一下
2010-4-13 22:28
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
不错 不错 不错
2010-4-14 13:29
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我什么都不懂 看不懂 什么也不说了
2010-4-25 00:14
0
雪    币: 6092
活跃值: (734)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
22
精神可嘉,不过对于保护的游戏,函数都被拦截了,根本无用,无保护的游戏,没有意义,可以娱乐。
所以感谢分享。
2010-5-6 11:13
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看了以后,只觉想笑!
2010-5-6 15:05
0
雪    币: 116
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
有个问题。。。为什么不能注入游戏后通过复制socket句柄来实现呢?
直接在外部send不是更方便吗?
2010-5-8 01:04
0
雪    币: 234
活跃值: (83)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
25
我很是喜欢啊,外挂..... 灰色产业链。。
2010-5-8 10:46
0
游客
登录 | 注册 方可回帖
返回
//