外挂编写完全攻略一、先说一下写一个外挂需要什么条件1、熟练的C语言知识目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件
2、具有很强的汇编基础一般游戏都不可能有原代码的,必须*反汇编或者跟踪的办法来探索其中的机理,所以有强的汇编基础也是必不可少的条件
二、写外挂面临的基本技术问题1、修改进程的执行代码要修改进程的执行代码,要先取得进程的ID,如果是由外挂程序启动,返回值里就有进程ID,如果不是的话,需要用findwindow找到窗口句柄,再用GetWindowProcessID取得进程ID,取得进程ID以后,就可以用writeprocessmemory来修改进程的执行代码了,使程序按照我们的意愿来执行,石器外挂里的不遇敌、寸步遇敌就是用这样的方法来实现的
2、截获外挂发送和接收的封包除了通过修改代码来实现的功能以外,很多的功能都是通过修改封包来实现的,要修改封包,首先要能截获它。第一步是要跟踪出发和收的位置,至于怎么跟踪,我以后会提到,找到位置以后,有2个办法,一是在那个位置加一个jmp语句,跳到你的处理函数位置,处理完后,再跳回来,这种方法要求比较高,需要处理好很多事情,另一种办法是往那个位置写条能造成例外的指令,比如int3,然后用DebugActiveProcess调试游戏进程,这样每当游戏执行到那个位置的时候,就会停下来,到外挂程序里面去,等外挂程序处理完以后,用ContinueDebugEvent继续运行程序。今天先写这么多,下回将讨论外挂的具体功能该怎么实现
1游戏外挂的原理外挂现在分为好多种,比如模拟键盘鼠标的,修改数据包的,还有修改本地内存的
2截获消息有些游戏的响应机制比较简单,是基于消息的,或者用什么定时器的东西,这个时候你就可以用拦截消息来实现一些有趣的功能了.我们拦截消息使用的也是hook技术,里面包括了键盘消息,鼠标消息,系统消息,日志等,别的对我们没有什么大的用处,我们只用拦截消息的回调函数就可以了,这个不会让我写例子吧,其实这个和上面的一样,都是用SetWindowHook来写的,看看就明白了很简单的.至于拦截了以后做什么就是你的事情了,比如在每个定时器消息里面处理一些我们的数据判断,或者在定时器里面在模拟一次定时器,那么有些数据就会处理两次,呵呵,后果嘛,不一定是好事情哦,呵呵,不过如果数据计算放在客户端的游戏就可以真的改变数据了,呵呵,试试看吧!用途还有很多,自己想也可以想出来的,呵呵!
利用鼠标钩子获得Win2000密码框密码
我们知道,Windows下有一条功能很强劲的函数——SendMessage(),利用它能够实现很多意想不到的功能,例如获得密码框的密码就是其中一例。我们可以这样做:charszPsw[255];SendMessage(hWnd,WM_GETTEXT,255,(LPARAM)(LPCTSTR)szPsw);通过发送消息WM_GETTEXT给目标窗口句柄,我们就能够获得密码框的密码了,可是它还有一点不足,就是无法在Win2000/WinXP里面获得密码。这是因为Win2000对这个方法作了防范(当然啦,老比因为这个问题已经业界被骂死了),只要你是对其他进程进行这个操作,就会失效。呵呵,这也就是为什么很多同类的软件到了Win2000就死翘翘的原因。:)那么是否就毫无办法了呢?当然不是!我们已经知道了失败的原因,就是不能在别的进程中使用这一函数……嗯?……聪明的你是不是已经想到了什么?对了,只要我们能够在同一个进程中使用它,就可以实现了!如何做到“同一个进程”?呵呵,这又是一个问题。
编译这个DLL的时候记住要这样:(否则会失败哦!)ml/c/coffHookDll.asmlink/section:.bss,S/DLL/subsystem:windows/def:HookDll.defHookDll.obj
分析客户端的有关资料自己作外挂,大多时候要分析封包,不过因为有的功能是由客户端来辨别的,所以分析客户端的程序同样也很重要,分析客户端首先要求你能看懂汇编指令(只要"看懂",要求很低的),其次是要能够熟练的运用一些工具,然后能剩下的也就是运气和游戏公司的漏洞了。(哈,不是每次都能成功的啊)下边我分步教给大家。第一章8086汇编指令注:AX,BX,CX…,EAX,EBX,ECX…这些都是CPU用来存储数据的地方。一、数据传输指令作用:它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
通用数据传送指令.MOV传送字或字节.MOVSX先符号扩展,再传送.MOVZX先零扩展,再传送.PUSH把字压入堆栈.POP把字弹出堆栈.PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP交换32位寄存器里字节的顺序XCHG交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)XADD先交换再累加.(结果在第一个操作数里)XLAT字节查表转换.BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)
输入输出端口传送指令.INI/O端口输入.(语法:IN累加器,{端口号│DX})OUTI/O端口输出.(语法:OUT{端口号│DX},累加器)输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX指定时,其范围是0-65535.
目的地址传送指令.LEA装入有效地址.例:LEADX,string;把偏移地址存到DX.LDS传送目标指针,把指针内容装入DS.例:LDSSI,string;把段地址:偏移地址存到DS:SI.LES传送目标指针,把指针内容装入ES.例:LESDI,string;把段地址:偏移地址存到ESI.LFS传送目标指针,把指针内容装入FS.例:LFSDI,string;把段地址:偏移地址存到FSI.LGS传送目标指针,把指针内容装入GS.例:LGSDI,string;把段地址:偏移地址存到GSI.LSS传送目标指针,把指针内容装入SS.例:LSSDI,string;把段地址:偏移地址存到SSI.
当然不是所有的指令都能用的上的,我在这里全部写出来是为了让大家认识一下,方便大家以后的学习,我归纳了一下常用的指令,这些指令大家一定要熟练掌握才可以啊。MOV数据传送指令PUSH,POP堆栈指令CMP比较指令LEA取地址指令XOR异或指令JE,JZ,JMP…(所有的转移指令)
FPE修改全教程很早的时候,当出现了视窗系统以后,图形界面就深得人们的喜爱,从古老的DOS界面的幼稚的波斯王子开始,便逐渐的出现了更高意义上的游戏,更优良的界面吸引了更多的人来进行游戏的娱乐。于是,GAME的意义便逐渐的深远和丰富多彩起来,便逐渐出现了游戏内容的分化,形成了一些源于早期形式上AVG,SLG,RPG,等趋势,这是早期的比较笼统的分化,期间,很多RPG的游戏就有很多繁琐枯燥乏味的升级及练习的系统,当时便有了一个思想,如何摆脱这些令人反感的东西修改游戏的源程序吗不是,便出现了一种类似于附加的程序,可以对人物的资料进行一定的修改,物品等等,便是早期修改的雏形,至后来,经过越来越多的人的发展,思想,逐步逐步的形成了一个比较完善的体系和共同的认识,后便有了风靡人心的FPE.
武器,攻击,药水…速度.一切有数字的东西,都这样做吧.
好了,基础完了,我们这部分很熟悉了,继续我在这里写上一个人的资料等级01经验100HP100MP100药水99…那么正确的地址是什么呢`010000006400000064000000640000006300000000000000000000000000000000000000000000000000000000000000不要和我说看不懂第二个例子武器初级刀机关枪子弹10/100火箭炮子弹04/100药小药3个中药5个大药8个我们来写这部分0101000004010A640F0300001005000011080000000000000000000000000000这个难看点,是什么意思01一定是最初级的武器的代码后面的01一定是表示数量一把,你改02就是两把刀,03就是3把…04是机关枪的代码,为什么不是02游戏里有没有什么小枪步枪如果有就是说明机关枪是厉害一点的枪,前面肯定还有一点小枪01是一把,02是两把,OA数量是10的子弹.64是子弹上限,以此类推…自己对着看看``````
中级别的会了吗熟练吧```多找游戏试试````别告诉我你看不懂
高级别的找什么我拿精灵开刀随便两个武器,弹出FPE,寻找地址,就是如下的部分
0000武器代码部分最小攻击最低攻击射程速度命中必杀率000000000000000-------------------–000000000武器基本要求000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000特效攻击加成------------------------有几个特效就有个附加前面你都看懂了,这里你就找的到往下翻翻页面就是你要改什么去掉要求要求部分全部改000000000000攻击FE00FF00==254255速度OA=101E=3032=50我改到50都没有问题必杀64==100%你要改的变态我也不拦你射程随你吧,还要我说吗~1级的屠龙枪怎么来的就这么来的会了吗~自己去改吧.不要再问我要了,*自己吧.以后你还想做什么`~~我提示吧,现在的修改器有低阶搜索的功能.什么意思,游戏里的东西不知道数值的部分,我们用搜索,输入然后增加+减少-这就是基本的格式,地址就是这样找到的,找到了地址,加个锁定的代码,做个启动文件,最后``````````自己去做外挂吧.装备吗有数值,自己想吧!世界上通向罗马的路很多.你总得找一条属于你自己吧
FPE修改教程进阶(地址编辑部分)
需要具备的几个初步知识1.十六进制十六进制是进制中的一种,是我们在进行编辑的时候将要碰到的最多的问题,你接触修改,就不可避免的会遇到进制上的换算,简单的说来,十六进制就是满十六就进一位,同十进制的满十进一是一样的道理,我在这里要求大家记住最基本的前十六位的代码换算,和几个最常用的数值具体十六进制的代码,而不是去临时的找个什么进制换算器来进行换算,这点非常重要,有很多时候,一个地址的编辑,在某个标志码数值上不是很大,但是要求你有很高的数据敏感性,这点很重要,我在这里将要求记住的一些代码写出来01=0102=0203=0304=0405=0506=0607=0708=0809=0910=0A11=0B12=0C13=0D14=0E15=OF16=10特征数值0F=15FF=255FFFF=6553532=5064=10063=9903E7=999270F=999901869F=999992.真/假址的基本识别问题我在这里举一个例子一个正常的全空地址000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
正常数据全满地址FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF假设我们寻求的目标是一个金钱的数量假设初始数量是1000的话,我们就开始以1000作为寻找目标1000>990>980>970>OK,我们找到了两个地址
024F6A5C7BE…024F7BCDD3A…地址一我们打开以后看到CA030000CA0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000地址二我们打开以后看到DECAD3B6A7D8E9FFD1A3A3A3DEFAFED2D6F7F2F8FA32212F2D3E4E2D6A4E5F3AF65A8D8D6E7D6E7E8A9D21413A3CD2F2如何判断呢,这是一个很明显的一个常见的真假地址并存的情况,我们的目标数值是970,换算过来是CA03那么地址中有那个出现了这个十六进制的970呢?很明显是在第一个地址,我们就称为真址,而第二个没有任何的数字的规律的地址,我们称之为假址,但是并不因为其真正意义上的假址,其实,这个地址也是反映了一个关联的变量,只是所包涵的信息不是我们所需要的当前变量值,但这种地址在某种情况下仍然非常有用,起一个验证的作用,我稍后会详细解说。这就是基本的真/假地址的构成,很多时候,真实的地址通常不是这种“清版”(我们的术语,就是非常干净好认识,整版地址代码全表,无关的全部显示空码,只表达一个有关变量数值)而是在一大串没有用的数据中夹在一段特定的段落
以下是一个样本
一纯具体数值类型对象举例:金钱在谈到一个具体数值的修改,我们很容易的就能想到一个非常常见的数据,金钱,我们在这里就以金钱做为目标,做第一个分析
当然也有很多例外如果金钱单独是一个地址00000000000000000000000000000000全部占用了第一个四位的话很常见的就是999999999为最高上限数值,这里只要对比四数位全代码FFFFFFFF就能明白,取一个正常的惯用的9尾数,也就得出了4294967295经过我们的取位数的话,也就是999999999,这就是大多数游戏金钱的最高数值的由来,这里道理大家仔细想一下,应该能明白的了。所以我们能做的修改,也就只在数位正常的情况下修改那个最大数值,这里就很明显的能够想到问题,当我们修改出一个数值超过间隔码,在理论上只能存在的时候,就会在显示上出了问题,很常见的就是数值溢出了那个数据框,被外面的文字,常见是:钱:字,或者一个黄色的图标盖住了,然后你再继续捡钱,怎么算呢?最后就是死机,循环错误,内存报错。精灵里面的这钟现象大家应该见到的很多。12345明白了这些,具体数值类型的,大家应该都能明白修改的基本道理和注意,也就是同上述没有太大的区别。常见的有钱,人物体力数值,级别,等等,此不繁琐的述说,请大家自行动手试验。
二非具体数据,非纯物品类的修改;连带修改
我们要通过一个开始的子弹的20发数量,实现全程道具,武器的修改。代码部分如下由于武器方面,很明显的初级给你的武器就是一把刀,所以很自然的联想到代码是0112345这在真实地址中也确实如此,所以。开始就需要大家有一个比较清楚的修改的思想和猜测,然后我们在开枪模式下20/19/18/17/10OK代码出来,去掉假址进入真址你就会看到如下形式
学会用浮点修改法
也许有的朋友看到标题时摸不到头脑,那么望下看吧。(仅适合FPE5.x)我改金色步行鸟时,好不容易用名字找出步行鸟地址的大概位置时,却看见满屏陌生的数据而无从下手。茫茫的数据中,哪个是要害字节呢?要找步行鸟的什么速度、耐力之类的,游戏中又没有具体数据,高阶分析无从下手。用低阶分析?那可是本人最忌讳的。山穷水尽想放弃时,眼睛一亮,OK,且听我慢慢道来。找到步行鸟名字的地址后,按E键进入内存编辑,不按任何键,切回游戏中。给步行鸟喂食,使它某一项能力增长,切到FPE,怎么还是上次的数据,那么按ESC键,恩,有几个数据在动啊(改变了),没看清?那么再照上面的方法来一边吧!发现改动的数据了吗,分析其上下的值,怎么样,有几行是很有规律的,对啦,那就是步行鸟的数据了。没听懂?自己实践一下吧,这个方法可是很有用的喔!特殊存档
CProcess是一个我编写的修改类,这里用到的函数代码如下HANDLECProcess::OpenProcess(char*p_ClassName,char*p_WindowTitle){HWNDhWindow;DWORDpid;hWindow=FindWindow(p_ClassName,p_WindowTitle);if(hWindow){GetWindowThreadProcessId(hWindow,&pid);return::OpenProcess(PROCESS_ALL_ACCESS,false,pid);}returnNULL;}boolCProcess::FindProcess(charp_WindowTitle){if(m_hProcess==NULL){m_hProcess=this->OpenProcess(NULL,p_WindowTitle);if(m_hProcess)m_bGameRunning=true;returnm_bGameRunning;}elsereturnfalse;}BYTECProcess::ReadByte(DWORDp_Address){DWORDbytes;BYTEtmpvalue;if(m_bGameRunning){if(ReadProcessMemory(m_hProcess,(void)p_Address,(void*)&tmpvalue,1,&bytes)==0)return0;elsereturntmpvalue;}return0;}
关于APIHOOK拦截封包原理
这里插接下传奇赌场封包的用法
由于不同区不同服务器的的数据不同,一个封包要想在每个服务器都能使用是不可能的。这就需要我们对原有的封包进行修改。
第二节8088汇编速查手册
一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
五节分析技术在进行软件的破解、解密以及计算机病毒分析工作中,一个首要的问题是对软件及病毒进行分析。这些软件都是机器代码程序,对于它们分析必须使用静态或动态调试工具,分析跟踪其汇编代码。一、从软件使用说明和操作中分析软件欲破解一软件,首先应该先用用这软件,了解一下功能是否有限制,最好阅读一下软件的说明或手册,特别是自己所关心的关键部分的使用说明,这样也许能够找点线索。二、静态反汇编所谓静态分析即从反汇编出来的程序清单上分析,从提示信息入手进行分析。目前,大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解。常用的静态分析工具是W32DASM、IDA和HIEW等。
第三节8088汇编跳转一、状态寄存器PSW(ProgramFlag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:1514131211109876543210OFDFIFTFSFZFAFPFCF
第四节浮点指令对下面的指令先做一些说明:st(i):代表浮点寄存器,所说的出栈、入栈操作都是对st(i)的影响src,dst,dest,op等都是指指令的操作数,src表示源操作数,dst/dest表示目的操作数mem8,mem16,mem32,mem64,mem80等表示是内存操作数,后面的数值表示该操作数的内存位数(8位为一字节)x<-y表示将y的值放入x,例st(0)<-st(0)-st(1)表示将st(0)-st(1)的值放入浮点寄存器st(0)1.数据传递和对常量的操作指令指令格式指令含义执行的操作
FLDsrc装入实数到st(0)st(0)<-src(mem32/mem64/mem80)
FILDsrc装入整数到st(0)st(0)<-src(mem16/mem32/mem64)
FBLDsrc装入BCD数到st(0)st(0)<-src(mem80)
FLDZ将0.0装入st(0)st(0)<-0.0
FLD1将1.0装入st(0)st(0)<-1.0
FLDPI将pi装入st(0)st(0)<-(ie,pi)
FLDL2T将log2(10)装入st(0)st(0)<-log2(10)
FLDL2E将log2(e)装入st(0)st(0)<-log2(e)
FLDLG2将log10(2)装入st(0)st(0)<-log10(2)
FLDLN2将loge(2)装入st(0)st(0)<-loge(2)
FSTdest保存实数st(0)到destdest<-st(0)(mem32/mem64)
FSTPdest
dest<-st(0)(mem32/mem64/mem80);然后再执行一次出栈操作
FISTdest将st(0)以整数保存到destdest<-st(0)(mem32/mem64)
FISTPdest
dest<-st(0)(mem16/mem32/mem64);然后再执行一次出栈操作
FBSTdest将st(0)以BCD保存到destdest<-st(0)(mem80)
FBSTPdest
dest<-st(0)(mem80);然后再执行一次出栈操作
2.比较指令指令格式指令含义执行的操作
FCOM实数比较将标志位设置为st(0)-st(1)的结果标志位
FCOMop实数比较将标志位设置为st(0)-op(mem32/mem64)的结果标志位
FICOMop和整数比较将Flags值设置为st(0)-op的结果op(mem16/mem32)
FICOMPop和整数比较将st(0)和op比较op(mem16/mem32)后;再执行一次出栈操作
FTST零检测将st(0)和0.0比较
FUCOMst(i)
比较st(0)和st(i)[486]
FUCOMPst(i)
比较st(0)和st(i),并且执行一次出栈操作
FUCOMPPst(i)
比较st(0)和st(i),并且执行两次出栈操作
FXAM
Examine:Eyeballst(0)(setconditioncodes)
3.运算指令指令格式指令含义执行的操作
加法
FADD加实数st(0)<-st(0)+st(1)
FADDsrc
st(0)<-st(0)+src(mem32/mem64)
FADDst(i),st
st(i)<-st(i)+st(0)
FADDPst(i),st
st(i)<-st(i)+st(0);然后执行一次出栈操作
FIADDsrc加上一个整数st(0)<-st(0)+src(mem16/mem32)
减法
FSUB减去一个实数st(0)<-st(0)-st(1)
FSUBsrc
st(0)<-st(0)-src(reg/mem)
FSUBst(i),st
st(i)<-st(i)-st(0)
FSUBPst(i),st
st(i)<-st(i)-st(0),然后执行一次出栈操作
FSUBRst(i),st用一个实数来减st(0)<-st(i)-st(0)
FSUBRPst(i),st
st(0)<-st(i)-st(0),然后执行一次出栈操作
FISUBsrc减去一个整数st(0)<-st(0)-src(mem16/mem32)
FISUBRsrc用一个整数来减st(0)<-src-st(0)(mem16/mem32)
乘法
FMUL乘上一个实数st(0)<-st(0)*st(1)
FMULst(i)
st(0)<-st(0)*st(i)
FMULst(i),st
st(i)<-st(0)*st(i)
FMULPst(i),st
st(i)<-st(0)*st(i),然后执行一次出栈操作
FIMULsrc乘上一个整数st(0)<-st(0)*src(mem16/mem32)
除法
FDIV除以一个实数st(0)<-st(0)/st(1)
FDIVst(i)
st(0)<-st(0)/t(i)
FDIVst(i),st
st(i)<-st(0)/st(i)
FDIVPst(i),st
st(i)<-st(0)/st(i),然后执行一次出栈操作
FIDIVsrc除以一个整数st(0)<-st(0)/src(mem16/mem32)
FDIVRst(i),st用实数除st(0)<-st(i)/st(0)
FDIVRPst(i),st
FIDIVRsrc用整数除st(0)<-src/st(0)(mem16/mem32)
FSQRT平方根st(0)<-sqrtst(0)
FSCALE2的st(0)次方st(0)<-2^st(0)
FXTRACTExtractexponent:st(0)<-exponentofst(0);andgetspushedst(0)<-significandofst(0)
FPREM取余数st(0)<-st(0)MODst(1)
FPREM1取余数(IEEE),同FPREM,但是使用IEEE标准[486]
FRNDINT取整(四舍五入)st(0)<-INT(st(0));dependsonRCflag
FABS求绝对值st(0)<-ABS(st(0));removessign
FCHS改变符号位(求负数)st(0)<-st(0)
F2XM1计算(2^x)-1st(0)<-(2^st(0))-1
FYL2X计算Y*log2(X)st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0)*log2(st(1))的值
FCOS余弦函数Cosst(0)<-COS(st(0))
FPTAN正切函数tanst(0)<-TAN(st(0))
FPATAN反正切函数arctanst(0)<-ATAN(st(0))
FSIN正弦函数sinst(0)<-SIN(st(0))
FSINCOSsincos函数st(0)<-SIN(st(0)),并且压入st(1)st(0)<-COS(st(0))
FYL2XP1计算Y*log2(X+1)st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0)*log2(st(1)+1)的值
处理器控制指令
FINIT初始化FPU
FSTSWAX保存状态字的值到AXAX<-MSW
FSTSWdest保存状态字的值到destdest<-MSW(mem16)
FLDCWsrc从src装入FPU的控制字FPUCW<-src(mem16)
FSTCWdest将FPU的控制字保存到destdest<-FPUCW
FCLEX清除异常
FSTENVdest保存环境到内存地址dest处保存状态字、控制字、标志字和异常指针的值
FLDENVsrc从内存地址src处装入保存的环境
FSAVEdest保存FPU的状态到dest处94字节
FRSTORsrc从src处装入由FSAVE保存的FPU状态
FINCSTP增加FPU的栈指针值st(6)<-st(5);st(5)<-st(4),…,st(0)<-
FDECSTP减少FPU的栈指针值st(0)<-st(1);st(1)<-st(2),…,st(7)<-
FFREEst(i)标志寄存器st(i)未被使用
FNOP空操作,等同CPU的nopst(0)<-st(0)
WAIT/FWAIT同步FPU与CPU:停止CPU的运行,直到FPU完成当前操作码
FXCH交换指令,交换st(0)和st(1)的值st(0)<-st(1)st(1)<-st(0)
第3章动态分析技术第一节SoftICE与TRW2000安装安装与配制SOFTICE有几个平台的版本,DOS,WINDOWS3.0,Windows95/98,WINDOWSNT,等。由于现在最普及的操作系统是Windows95/98、WindowsNT、WindowsMillennium、Windows2000因此就讲讲SOFTICE在这几个平台安装时的一些注意事项。一、SOFTICEforwin9x安装与配制1、显卡安装2、鼠标安装3、Autoexec.bat和config.sys配制4、SymbolLoader5、winice.dat配制二、SOFTICEforWindowsMillennium三、SOFTICEforNT/2K安装与配制四、TRW2000安装
SOFTICE的安装与配制一、SOFTICEforwin9x安装与配制㈠、SOFTICE安装1、SOFTICE目前最新版本是4.05,如你的系统是win9x,就请下载forwin9x版本的SOFTICE,建议下载SOFTICE的最新版本,这样稳定性好些。运行setup.exe开始安装通过配制启动菜单,启动时根据自己的需要选择是否装载SOFTICE。AUTOEXEC.BAT配制样例:@ECHOOFF
goto%config%:SICEC:/PROGRA1/NUMEGA/SOFTIC1/WINICE.EXEgotocommon:NORMgotocommon:common
CONFIG.SYS配制样例:[MENU]MENUITEMNORM,Windows9xMENUITEMSICE,Windows9xwithSoftICEMENUDEFAULTNORM,2[NORM][SICE][common]
AF8="^XTR;"AF11="^dddataaddr->0;"AF12="^dddataaddr->4;"CF1=“altscroff;lines60;wc32;wd8;”CF2=“wr;wd;^wc;”;<=以下是宏操作命令:MACROs7878="S30:0Lffffffff‘78787878’"MACROsname="S0LFFFFFFFF‘toye’"MACROswide="s0lFFFFFFFF‘7’,'8,‘7’,'8,‘7’,'8,‘7’,'8,‘7’,'8,‘7’,'8,‘7’,‘8’,‘7’,‘8’"MACROreg="bpxregqueryvalueexaif*(esp->8)>=‘Soft’do“d(esp->14)”"MACRObpxpe="bpxloadlibraryado“ddesp->4”"MACRObpxgeta=“bpxGetDlgItemTextA;bpxgetwindowtexta;bpxgetdlgitemint;bpxgetdlgitemtext;”
;*****ExamplesofsymfilesthatcanbeincludedifyouhavetheSDK*****;Changethepathtotheappropriatedriveanddirectory;LOAD=c:/windows/system/user.exe;LOAD=c:/windows/system/gdi.exe;LOAD=c:/windows/system/krnl386.exe;LOAD=c:/windows/system/mmsystem.dll;LOAD=c:/windows/system/win386.exe;Exports-changethepathtotheappropriatedriveanddirectoryEXP=c:/windows/system/advapi32.dll;<=这四行前不要加分号,否则不被装载,SOFTICE可能什么也拦不到:EXP=c:/windows/system/kernel32.dllEXP=c:/windows/system/user32.dllexp=c:/windows/system/gdi32.dllexp=c:/windows/system/comctl32.dll;
;如你要破解VB程序,下面的VB运行库将要装载,SOFTICE默认值是没有这几行,你需手动加上。;EXP=c:/windows/system/msvbvm60.dll;<=VisualBasic6具体参考第十五课VB破解EXP=c:/windows/system/msvbvm50.dll;<=VisualBasic5注意在这五个DLL中最好不要同时装载2个以上;EXP=c:/windows/system/vb40032.dll;<=VisualBasic4(32bit);EXP=c:/windows/system/vb40016.dll;<=VisualBasic4(16-bit)较少见;EXP=c:/windows/system/vbrun300.dll;<=VisualBasic3
四、TRW2000的安装与配制㈠、TRW2000安装
TRW安装简单多了,没SOFTICE那样复杂,但目前TRW2000不支持windowsNT。它发布版本是一个ZIP压缩包,才200多K。只要将其解压缩到一个目录下,然后运TRW2000.EXE即可激活方式同SOFTICE不一样: