2009-8-10 11:33
godtype
如何使用Ollydbg修改曹操传引擎
写在前面的不必要的废话:
作为一个过来人,从只会UE和WINHEX修改到现在可以使用Ollydbg来修改曹操传系列的引擎(Ekd5.exe),所以很明白新人和不懂汇编者的心情。所以现在写一篇教程,供新人和不懂汇编者学习如果使用Ollydbg修改曹操传的引擎。其他懂汇编者或者其他前辈高人看完后欢迎指出不足之处,勿扔砖头。
部分内容节选自以下有关Ollydbg的教程:
[url=http://www.xycq.online/forum/thread-140684-1-2.html]《MOD制作基本工具用途及其使用方法图文实例,入门教程》[/url]
[url=http://www.xycq.online/forum/thread-124674-1-1.html]《解读KOEI曹操传代码》[/url]
[url=http://www.xycq.online/forum/thread-116589-1-1.html]《乱侃Exe文件的修改》[/url]
[url=http://www.xycq.online/forum/thread-64023-1-1.html]《曹操传exe部分函数功能》[/url]
[url=http://www.xycq.online/forum/thread-18760-1-1.html]《曹操传修改的实用汇总》[/url]
另有阿斌所写的《OllyDBG基礎教程》两篇,因为权限问题,不提供链接。
[color=Red]特别声明:
1、教程中能够不采用汇编术语的地方我会尽量用易懂的文字来代替。
2、此教程只适合修改曹操传系列的引擎(Ekd5.exe),并不代表可以适用于其他游戏,也不代表看完本教程者就学会了汇编。
[b][size=5]3、谢绝转载。[/size][/b][/color]
[color=Silver][[i] 本帖最后由 godtype 于 2020-5-8 09:21 编辑 [/i]][/color]
2009-8-10 11:34
godtype
第一部分 Ollydbg的基本使用方法
一、打开Ollydbg,然后按“F3”或点击菜单中的文件(F)->打开(O),选择要修改的EXE文件,确定。
出来的界面如下图,其中分开四个区域:
[img]http://www.xycq.online/attachments/2011/05/111321_201105212013081.jpg[/img]
其中反汇编窗口是主要用的,显示程序中的反汇编代码,也是修改的主要工作窗口。
数据窗口是显示内存或文件中的内容,我比较少看,主要也只是看比如某个兵种的名称在哪个位置之类的。
寄存器窗口显示寄存器的内容,堆栈窗口是显示当前线程的堆栈,这两个窗口都是需要调试的时候才用到的。
在反汇编窗口中,从左往右数,第一列是反汇编地址,第二列是反汇编代码转成的机器码(即UE中看到的代码),第三列就是反汇编代码,第四列可以理解为注释,可以自己加上去方便以后查看。
二、一些经常用的快捷键:
F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。
F2:设置断点,只要在光标定位的位置按F2键即可,再按一次F2键则会删除断点,如果设置了大量的断点,可以按Alt+B打开断点窗口,点右键全部关闭。
F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。
F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。
Ctrl+G:转到输入的地址。
Ctrl+F:查找命令。
Ctrl+B:查找字符。
Ctrl+L:查找下一个,配合Ctrl+F或Ctrl+B使用。
Ctrl+F2:打开最后一次打开的EXE文件(当前打开的文件也算最后一次打开,即相当于重启文件)。
Ctrl+E:修改当前光标定位的机器码字符。
Alt+F2:关闭当前打开的EXE文件。
Alt+X:关闭Ollydbg。
小键盘“-”号:后退到上一次操作的地方。
小键盘“+”号:"-"号的逆操作。
三、修改代码的操作以及保存修改后的代码:(这里的操作暂不配图,如有需要另行后补)
先转到需要修改的代码所在地址,然后有以下几种方法进行修改操作:
1、用MOUSE双击选定的该行代码,然后粘帖之前复制好的代码;
2、或者单击空格键,然后粘帖之前复制好的代码;
3、如果是手动输入的可以直接打字上去,无需双击MOUSE或单击空格。
修改完毕后,点MOUSE的右键,选择“复制到可执行文件”->点击“*选择部分”或“全部修正”。其中“*选择部分”只保存选定好的部分,而“全部修正”只限在第一个区段中使用,可以将第一个区段中所有已修改的内容全部保存,而且保存的时候,只能保存同一个区段内的内容,不能跨区段保存,所以修改的时候要分开每一个区段来修改,每次保存之后要重新打开EXE再来修改其他内容。
(有关区段的知识,请参考:[url=http://www.xycq.online/forum/thread-193425-1-2.html]http://www.xycq.online/forum/thread-193425-1-2.html[/url])
[color=Silver][[i] 本帖最后由 godtype 于 2020-5-8 09:29 编辑 [/i]][/color]
2009-8-10 11:35
godtype
第二部分 与曹操传修改有关的简单汇编知识
一、寄存器
在寄存器窗口中,最上方显示了数个寄存器的名称,以及在调试的时候可以看到它们运行过程中存放的数据。
其中EAX,ECX,EDX和EBX是通用寄存器,也是经常用到的,用于各种计算的寄存器。
EBP和ESP一般用在子程序(或者称为函数)的开始和结束部分,这两个不能乱用,以后会讲解具体用法。
EDI和ESI也不能乱用,除非原来的代码中用到,否则不要使用。
实际上用得最多就只是EAX、ECX、EDX、EBX,他们具体又会分成AX、AH、AL、CX、CH、CL、DX、DH、DL、BX、BH、BL,看图:
[img]http://home.procivi.net/attachment/200908/9/419_124979995662ew.gif[/img]
图中以EAX为例,其中橙色为EAX,占用4个字节,红色是AX,占用2个字节,绿色是AH,占用1个字节,蓝色是AL,占用1个字节。图的下面部分就是用数据进行举例,不多说了。
二、子程序(函数)
[quote]
PUSH EBP ——将EBP压入堆栈,属于固定格式
MOV EBP,ESP ——将ESP的值移入EBP,属于固定格式
SUB ESP,X 或 PUSH ECX ——空出暂存空间
============
==正式内容==
============
MOV ESP,EBP ——将EBP的值移入ESP,属于固定格式
POP EBP ——将EBP从堆栈中取出,属于固定格式
RETN 或 RETN X ——结束返回原来调用此子程序的地方
[/quote]
子程序使用CALL指令进行调用,当光标停在CALL ****这一行的时候,可以按回车键进入该子程序进行查看,而大部分子程序都采用上面的格式。
1、标明“属于固定格式”的指令不需要太明白它的实际意义,
2、“空出暂存空间”是必须的,因为只靠几个通用寄存器,是完成不了大量的计算,所以就要空出一定量的空间,将暂时不需要计算的数据保存起来,换句话就是新引擎剧本指令中有到的整形变量。
SUB ESP,X表示空出(X÷4)个空间,每4个字节一个空间,[EBP-X]就是表示第(X÷4)个空间,比如SUB ESP,0C就表示空出三个空间,[EBP-C]就是其中第三个空间。
PUSH ECX相当于SUB ESP,4,只空出一个空间(其实就是一种偷懒省字节的表现。)
也可以跳过这一步,有此子程序中只用到一两个通用寄存器,计算量少,不需要暂时性的保存数据,就可以不用这一步。
3、RETN 或 RETN X的具体用法。
寄存器中的数据不会因为调用了子程序就改变,所以可以用作子程序的输入数据,但是如果有大量的输入数据,只靠几个通用寄存器,也是完成不了输入的,所以就要在调用子程序之前,通过PUSH指令,对其它输入数据进行压入堆栈的操作,例如:
PUSH EDX(参数3)
PUSH ECX(参数2)
PUSH EAX(参数1)
CALL 4001
ADD ESP,0C
这个时候就有3个数据输入进子程序4001里面,调用4001之后,参数1是[EBP+8],参数2是[EBP+C],参数3是[EBP+10],注意是从+8开始,而不是从+4开始,而且最后一个PUSH的才是第一个参数。
当没有参数输入到子程序的时候,结束返回用RETN就可以了,但是如果有数量不等的参数输入到子程序的时候,结束返回就不能只用RETN,要用RETN X了。这是由于输入参数是用PUSH的,相当于在前一个程序中增加了X个暂存空间,所以返回的时候就要将增加了的空间删去,在一般情况下,输入了3个参数,就要用RETN 0C,这样就可以了,但是有些子程序是用RETN的,所以回到原来的程序,就要加上一条ADD ESP,X了。
4、可以自行新写一些内容作为自定义函数,尤其是一些大量运用的组合指令,这样可以方便以后的修改,还能够在原来的程序中节省一定量的空间写新的代码。这个做法就是参考了STAR175的新引擎之后大量运用。
三、常用指令
1、MOV
格式为 MOV 参数1,参数2 ;表示将参数2的数据移入参数1中,也可以理解为参数1=参数2。
具体有以下几种用法:
1)MOV EAX,1 或 MOV AL,1
最简单的,EAX=00 00 00 01;如果是MOV AL,1,则只是AL部分等于1,假如原来EAX=12345678,MOV AL,1之后,EAX=12345601。
2)MOV EAX,ECX
即EAX=ECX
3)
MOV EAX,DWORD PTR SS:[EBP-4]
MOV DWORD PTR SS:[EBP-4],EAX
MOV EAX,DWORD PTR DS:[EBP-4]
MOV DWORD PTR DS:[EBP-4],EAX
第一条,表示EAX等于[EBP-4](即第一个暂存空间)的数值,假如[EBP-4]里面是12345678,则EAX=12345678;而第二条就是第一条的相反操作,不作解释。
第三条,表示EAX等于以[EBP-4]的数值为所在地址中的数值,假如[EBP-4]里面是00410000,而地址00410000的数据是00 00 00 01,则EAX=00 00 00 01;同样第四条是第三的相反操作,不作解释。
这四条都是DWORD型,即4字节数据的移动,但不是所有数据都是4 字节的,还有很多都是2字节和1字节,这时就要改用其他类型,例如MOV AL,BYTE PTR SS:[EBP-4]是1字节用的,MOV AX,WORD PTR SS:[EBP-4]就是2字节用的。
2、逻辑运算类
1)AND
术语是与操作指令,实际应用是将4字节寄存器中不需要的字节进行“00”操作,例如
AND EAX,0FF 表示将EAX中的数据,除了AL保留起来,其他全部置为00,假如EAX=12345678,则操作后EAX=00000078,且最大不会超过000000FF;
这里顺便说明一下,包括其他的指令修改在内,对于超过7F的数值,在实际输入的时候,要在前面加一个“零”,比如想输入200,不能只输入C8,要输入0C8
2)XOR
术语是异或操作指令,实际应用是清空某寄存器,例如XOR EAX,EAX,相当于MOV EAX,0,即EAX=00000000
3)TEST
测试指令,一般用于CALL 407A09(测试某武将是否带有指定特效的装备)、概率测试、随机数测试等函数之后,表达式为TEST EAX,EAX ,后面必定跟着JE或JNZ的跳转指令,JE表示EAX=0(没有装备或发生)时跳转,JNZ则相反。
4)OR、NOT
分别是或操作指令和取反指令,因为我没有用过,所以不作解释。
3、CMP和条件转移(即跳转)
格式为CMP 参数1,参数2,以参数1为目标物对参数2进行相互比较,比较的结果根据后面的各种条件转移来转移跳转。具体常用的条件转移如下:
JE 或 JZ:两参数相同就跳转,否则接下一行指令
JNZ 或 JNE:不相同才跳转
JA 或 JNBE:大于跳转
JAE 或 JNB:大于等于跳转
JB 或 JNAE:小于跳转
JBE 或 JNA:小于等于跳转
以上四条,测试无符号整数运算的结果
JG 或 JNLE:大于跳转
JGE 或 JNL:大于等于跳转
JL 或 JNGE:小于跳转
JLE 或 JNG:小于等于跳转
以上四条,测试带符号整数运算的结果
除了条件转移还有最重要的一条是JMP:无条件跳转。
所有的转移指令跟CALL指令一样可以按回车来跳到目标位置进行查看。
4、计算类指令
1)INC、DEC
前者是加1指令,后者是减1指令,不多加不多减,只有1。
2)ADD
加法指令,例如ADD EAX,1就是EAX的数值+00000001,ADD EAX,ECX就是EAX = EAX的数值 + ECX的数值
3)SUB
减法指令,使用方法跟ADD一样
4)MUL、IMUL
都是乘法指令,具体用法不同。
前者是以EAX的值直接乘以参数,比如MUL ECX表示EAX = EAX的数值 * ECX的数值
后者是将所有参数进行相乘,比如IMUL ECX,ECX,19表示 ECX = ECX的数值 * 19H
5)DIV、IDIV
前者是无符号除法,后者是整数除法。
前者跟MUL相似,拿EAX的数值除以参数,但是得出来的商存放在EAX,余数存放在EDX里面,所以使用前通常用XOR EDX,EDX先清空EDX,举例:
MOV EAX,96
MOV ECX,64
XOR EDX,EDX
DIV ECX
得出的结果是,EAX=00000001,EDX=00000032
后者没有经常用,所以不作解释。
6)SHL、SAL
逻辑左移和算术左移指令,这两条不用术语解释,用实际应用来说明,以SHL EAX,1为例,实际效果就是EAX * 2,所以可以将SHL EAX,X理解为EAX乘以2的X次方。
7)SHR、SAR
逻辑右移和算术右移指令,与上面的左移同理。
5、NOP
无作用或称为自动跳过这一行代码 (用UE打开编辑exe文件时你看到90,等同于汇编语言语句nop)
最后,其他指令由于较少接触,所以都不作解释。
2009-8-10 11:36
godtype
第三部分 曹操传修改相关知识
一、内存
内存是非常重要的,在运行过程中程序对数据的读取都是从内存中读出并加以计算、修改,好借data.e5里面的数据就是在程序运行的时候就按一定的格式首先存入到内存的指定位置中。
在岱瀛的[url=http://www.xycq.net/forum/thread-124674-1-1.html]《解读KOEI曹操传代码》[/url]的最后面就有提到常用的一些内存地址,还有ssbye的[url=http://www.xycq.net/forum/thread-18760-1-1.html]《曹操传修改的实用汇总》[/url]里面有更多的内存资料,请详细阅读。我在这里只解释几个常用的。
=====================
1、4927F0
从4927F0开始存放了相当多的物理攻击的战斗信息,在程序中常有这样一句:MOV ECX,4927F0,而它的后面就有很多[ECX+1]、[ECX+4]……,具体的内容是:
4927F0[color=Red]+0[/color] 发动攻击的武将的战场编号(战场编号00-0E是我军,0F-22是友军,23-72是敌军)(BYTE)
4927F0[color=Red]+1[/color] 当前被攻击武将的战场编号(BYTE)
4927F0[color=Red]+4[/color] 发动攻击的武将的Data编号(512人的data就是000-1FF,1024人的data就是000-3FF)(DWORD)
4927F0[color=Red]+8[/color] 发动攻击的武将Data内存地址(DWORD)
4927F0[color=Red]+C[/color] 发动攻击的武将战场内存地址(DWORD)
4927F0[color=Red]+10[/color] 开始存放所有被攻击武将的战场编号,一共是73H*1(所有被攻击武将,指的就是穿透攻击中其他受影响的武将)(BYTE)
4927F0[color=Red]+84[/color] 开始是全体被攻击武将按被攻击顺序存放HP伤害值,一共是73H*4(DWORD)
4927F0[color=Red]+254[/color] 开始是全体被攻击武将按被攻击顺序存放MP伤害值,一共是73H*4(DWORD)
4927F0[color=Red]+424[/color] 穿透范围(BYTE)
4927F0[color=Red]+425和426[/color] 当前被攻击武将的坐标(BYTE)
4927F0[color=Red]+428[/color] 发动攻击的武将所得到的个人经验(DWORD)
4927F0[color=Red]+42C[/color] 发动攻击的武将所得到的武器经验(DWORD)
4927F0[color=Red]+430[/color] 开始是全体被攻击武将所得到的防具经验,一共是73H*4(DWORD)
4927F0[color=Red]+600[/color] 是否AI攻击
4927F0[color=Red]+604[/color] 是否发生爆击(DWORD)
4927F0[color=Red]+608[/color] 是否连击(BYTE)
4927F0[color=Red]+60C[/color] 是人物挨打动作播放时位移抖动的横坐标(DWORD)
4927F0[color=Red]+610[/color] 是人物挨打动作播放时位移抖动的纵坐标(DWORD)
4927F0[color=Red]+614[/color] 通常直接用492E04使用,是反击以及反击后反击的标志(DWORD)
=====================
2、497AF8
跟4927F0相类似,497AF8是存放使用策略的信息,具体的内容是:
497AF8[color=Red]+0[/color] 是策略编号(BYTE)
497AF8[color=Red]+1[/color] 是使用策略的武将的战场序号(BYTE)
497AF8[color=Red]+4[/color] 是使用策略的武将的DATA内存地址(DWORD)
497AF8[color=Red]+8[/color] 是使用策略的武将的战场内存地址(DWORD)
497AF8[color=Red]+C[/color] 是当前被策略攻击或被策略恢复、提升武将的战场序号(BYTE)
497AF8[color=Red]+D[/color] 开始是全体被策略攻击或被策略恢复、提升武将的战场序号,一共是73H*1(BYTE)
497AF8[color=Red]+84[/color] 开始是全体被策略攻击武将按被攻击顺序存放伤害值,一共是73H*4(DWORD)
497AF8[color=Red]+254[/color] 是策略效果标识(BYTE)
497AF8[color=Red]+255[/color] 开始是全体被策略攻击武将按被攻击顺序存放实际策略效果标识,一共是73H*1(这个在一般情况下是统一跟+254的标识值一样,但是特殊的多组合效果策略就会用到不同的效果标识,例如八阵和玄武)
497AF8[color=Red]+2C9和+2CA[/color] 分别是使用的策略的攻击范围和穿透范围(BYTE)
497AF8[color=Red]+2D0[/color] 是使用策略的武将所得到的个人经验(DWORD)
497AF8[color=Red]+2D4[/color] 是使用策略的武将所得到的武器经验(DWORD)
497AF8[color=Red]+2D8[/color] 开始是全体被策略攻击武将所得到的防具经验,一共是73H*4(DWORD)
497AF8[color=Red]+4A8[/color] (暂未详细分析,只有0和1两个值,对应的是使用策略的武将是否可以控制。BYTE)
497AF8[color=Red]+4AC[/color] 最终输出用,表示是否成功使用策略,0不成功并返回选择策略界面,1成功并结束武将行动(DWORD)
497AF8[color=Red]+4B0[/color] 策略动画相关
因为与4927F0相类似,所以不多写了,注意如果是使用对已方的策略,攻击武将就是使用策略的武将,被攻击武将就是目标武将。
=====================
3、4B2C50
战场内存地址,按每个战场编号24H个字节排列。
在程序中常见这样的两条指令:
IMUL ECX,ECX,24
ADD ECX,004B2C50
就是根据4927F0中攻防双方的战场编号,得出战场内存地址。攻击方可以直接从[4927F0+C]中读出,而被攻击方就要从[4927F0+1]中读出战场编号再加上上面这两条指令才能读出战场内存地址。
而24H个字节具体的内容如下(没有标出为未知):
00-03:武将的Data序号
04:是战场形象编号
05:属于哪一方,00代表我军,01是友军,大于等于02是敌军
06:战场横坐标
07:战场纵坐标
0B:AI的行动顺序
0C:判断武将是否可见,01不可见,02可见,03撤退
0D:叠加数值。00是未行动,02与04同时存在就是已行动,08表示S形象的左右翻转
0E:是否能被玩家直接控制,07表示可控
0F:表示人物朝向,数值是0(上),1(右),2(下),3(左)
10-13:HPcur
14:MPcur
18:攻击状态,03为正常状态,大于03为提升,小于03为衰弱
19:防御状态
1A:精神状态
1B:爆发状态
1C:士气状态
1D:移动状态
1E:表示人物健康状态:00和01代表正常,02和03是麻痹,04和05是禁咒,06和07是麻痹加禁咒,08和09是混乱,0a和0b是麻痹加混乱,0c和0d是禁咒加混乱,0e和0f是混乱加麻痹加禁咒.10和11是中毒,12和13是麻痹加中毒,14和15是禁咒加中毒,16和17是麻痹加禁咒加中毒,18和19是混乱加中毒,1a和1b是麻痹加混乱加中毒,1c和1d是禁咒加混乱加中毒,1e和1f是禁咒加麻痹加混乱加中毒
08-0A与AI行动有关:
[quote]原帖由 [i]star175[/i] 于 2009-8-10 12:07 发表
4B2C50 +8 和AI行动方针有关
+8 +9 +A +E(如果为7就是可控)
被动出击 FF 3
主动出击 FF 1
坚守原地 FF 2
攻击我将 要攻击武将的战场编号 0
到指定点 FF X Y 0
跟随武将 要跟随武将的战场编号 4
逃到指定点 FF X Y 4 [/quote]
=====================
4、4A1B68 或 0D60000
武将DATA内存。按每个武将的data编号48H个字节排列。其中512人data是从4A1B68开始,而1024人data就从0D60000开始,而STAR175的5.2版引擎开始采用了一种新方法,由系统自动安排DATA内存的起始位置。
在程序中常见这样的两条指令:
IMUL ECX,ECX,48
ADD ECX,004A1B68 或 ADD ECX,0D60000
就是根据武将的DATA编号(大部分情况下都是从战场内存地址的00-03中取出来)得出DATA内存地址。
而48H个字节具体的内容如下(没有标出为未知):
00-01:表示武将DATA编号,其中01位置为1X。比如0号武将就是00 10 ,1号武将就是01 10
02-03:R剧本形象代号
04-05:武将头像地址
08-0F:武将姓名(8字节,4个中文)
10:保留给武将姓名的结束符?
11-12:攻击力
13-14:防御力
15-16:精神力
17-18:爆发力
19-1A:士气
1C-1F:HP
20:MP
21-25:武统智敏运
26:致命一击台词类型
27:出阵场数
29:撤退场数
2A:是否我军,00是我军,FF不是我军
2B:兵种
2C:武将等级
2D:经验值
2E-30:武器编号、等级、经验
31-33:防具编号、等级、经验
34:辅助品
37-48:R剧本点击该人物是显示的名字
上面的是将五围从单字节扩展到双字节后(即突破255上限)的内容,如果是原版未突破255的,攻防精爆士的位置是15-19。
=====================
5、4B0770
也是常见的:MOV ECX,4B0770,从这里开始存放的内容也很重要,基本上都是存档中内容。
挑选几个简单说一下:
+6,即4B0776是章编号,0号武将的头像从第3章(章编号2)开始会从face.e5的第1-4张图片转用第5-8张图片,就是从这里判断的,当然具体的程序代码在其他地方。
C-F,即4B077C—4B077F是金钱的地址
+12,即4B0782是忠奸度
+13开始,即4B0783开始,每三位是一种武器或者防具或者辅助,一直到004B09DA为止。
其他的可以看岱瀛的帖,不多说了。
=====================
6、其他一些从DATA中导入的内存地址
1)物品属性(68H个)
IMUL ECX,ECX,19
ADD ECX,004A1140
2)部队属性(35H个)
IMUL ECX,ECX,1B
ADD ECX,004ABFA0
3)地形资料(1BH个)
IMUL ECX,ECX,3C
ADD ECX,004AE4E0
4)商店资料(3AH个 或 7FH个)
IMUL ECX,ECX,28
ADD ECX,004AEB68 或 ADD ECX,0D72000
商店有两种,同样是因为1024DATA的原因
5)策略属性(44H个)
IMUL ECX,ECX,46
ADD ECX,004AF4C0
以上的具体内容请参阅ssbye的[url=http://www.xycq.net/forum/thread-18760-1-1.html]《曹操传修改的实用汇总》[/url]。
=====================
7、497750
这个比较冷门,但是假如要修改消耗品,就要用到。基本用法与4927F0相似。MOV ECX,497750
[ECX]消耗品编号
[ECX+1]消耗品效果(3F-4C,HP恢复、MP恢复……)
[ECX+2]使用者战场编号(使用者就是点击道具的那个人)
[ECX+3]受用者战场编号(受用者就是道具用在谁的身上)
[ECX+4]使用者战场内存地址
[ECX+8]受用者战场内存地址
[ECX+C]使用者DATA内存地址
[ECX+10]受用者DATA内存地址
[ECX+14]道具DATA内存地址(4A1140+57*68开始,57就是第一个消耗品的编号)
[ECX+18]道具使用范围
[ECX+1C]结束使用用,表示是否成功使用道具,0不成功并返回选择界面,1成功并扣除道具数量后结束武将行动
想开发新类型的消耗品,就必须明白以上的几个关系。
=====================
=====================
二、常用到的指令以及组合
1、武将身上是否有某特效的装备
新人最喜欢改的东西。用到的子程序就是407A09,如果该特效还要从DATA中设置效果值,后面还需要一条407AF2读取效果值。这两条子程序都需要一个ECX值和一个参数输入,这个参数就是特效号,未扩展过的就是12-3E,而ECX的值是该武将的DATA内存地址,注意如果该特效是攻击方用的,就要先从攻击武将的战场内存中取出攻击武将的DATA编号,然后再转成攻击武将的DATA内存地址输入到ECX中,最后才能接相关的子程序。具体的格式如下:
MOV ECX,DWORD PTR SS:[EBP-4] [color=DarkOrange]——这里假设[EBP-4]中已经存放了武将的DATA内存地址[/color]
PUSH 12 [color=DarkOrange]——12就是特效号[/color]
CALL 407A09 [color=DarkOrange]——执行判断是否带有12特效号的装备[/color]
TEST EAX,EAX
JE **** [color=DarkOrange]——根据上一条TEST,这里表示没有12特效号的装备就跳到下一项内容中,如果用JNZ就表示带有12特效号的装备就跳到下一项内容中。后面接着的者是否则的内容。[/color]
这个时候如果是不需要在DATA中设置效果值的特效,就从这里开始写效果代码;如果需要在DATA中设置效果值,就加上以下指令:
MOV ECX,DWORD PTR SS:[EBP-4] [color=DarkOrange]——同样需要将武将的DATA内存地址放进ECX中[/color]
PUSH 12 [color=DarkOrange]——特效号必须作为输入参数1输入进去[/color]
CALL 407AF2 [color=DarkOrange]——读取DATA效果值(当然这个值其实一早已经存进从4A1140开始的内存中,程序只是从内存中通过计算后,取出来而已)[/color]
AND EAX,0FF [color=DarkOrange]——这个可用可不用,因为407AF2出来的值只是AL的值,所以有的时候需要零扩展一下,将EAX中除了AL,其他位置全清零。[/color]
后面同样是开始写效果代码。
2、获取武将的兵种
主要有406610、41DF70、4077D0、43B470,前两个是获取武将的兵种,后两个是获取武将的大兵种类。
406610与41DF70的区别是,406610直接从输入的ECX(武将的DATA内存地址)中取出对应+2B位置里面的代码,而41DF70是从输入的ECX(武将的战场内存地址)中取出武将的DATA编号,然后再转成武将的DATA内存地址,最后调用一次406610取出兵种代码。两者具体的原版代码如下:
00406610 /$ 55 PUSH EBP
00406611 |. 8BEC MOV EBP,ESP
00406613 |. 51 PUSH ECX
00406614 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00406617 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040661A |. 8A40 2B MOV AL,BYTE PTR DS:[EAX+2B]
0040661D |. 8BE5 MOV ESP,EBP
0040661F |. 5D POP EBP
00406620 \. C3 RETN
0041DF70 /$ 55 PUSH EBP
0041DF71 |. 8BEC MOV EBP,ESP
0041DF73 |. 51 PUSH ECX
0041DF74 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
0041DF77 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0041DF7A |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
0041DF7C |. 6BC9 48 IMUL ECX,ECX,48
0041DF7F |. 81C1 681B4A00 ADD ECX,004A1B68
0041DF85 |. E8 8686FEFF CALL 00406610
0041DF8A |. 8BE5 MOV ESP,EBP
0041DF8C |. 5D POP EBP
0041DF8D \. C3 RETN
4077D0和43B470之间的关系也同样道理。
3、异常类攻击与概率测试
先看一段代码:
00405953 |. 6A 3C |PUSH 3C
00405955 |. E8 D8A10700 |CALL 0047FB32
0040595A |. 83C4 04 |ADD ESP,4
0040595D |. 85C0 |TEST EAX,EAX
0040595F |. 74 18 |JE SHORT 00405979
00405961 |. 6A 08 |PUSH 8
00405963 |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C]
00405966 |. 33C9 |XOR ECX,ECX
00405968 |. 8A48 01 |MOV CL,BYTE PTR DS:[EAX+1]
0040596B |. 6BC9 24 |IMUL ECX,ECX,24
0040596E |. 81C1 502C4B00 |ADD ECX,004B2C50
00405974 |. E8 470D0000 |CALL 004066C0
以上是原版中,混乱攻击兵种的效果代码。其中47FB32是概率测试函数,需要输入一个参数作为需要测试概率,即是否有60%的机率发生(复习一下以前的知识,这里要用ADD ESP,4是因为47FB32的结尾是用RETN)。TEST是看这60%机率是否发生了,JE是没有发生就跳到下一项代码。这样概率测试就完成了,接下来这60%机率发生了,所以就要让被攻击的武将混乱,所以PUSH 8是4066C0的输入参数1,至于为什么是8?看前面内存部分4B2C50有关内容。这里的[EBP-C]存放的就是4927F0,所以[EAX+1]就是被攻击武将的战场编号,然后转成战场内存地址,调用4066C0,让被攻击武将添加上混乱的状态,完成。
4、其他主要的函数的用途,请看周大的[url=http://www.xycq.net/forum/thread-64023-1-1.html]《曹操传exe部分函数功能》[/url]
5、暂时想不到还有什么常用的,就先到此为止。
==============================
[b][size=3]追加几条战场内存与DATA内存的算法[/size][/b]
[b]从战场内存地址计算DATA内存地址[/b]
MOV ECX,[color=Blue]<战场内存地址>[/color]
MOV ECX,[ECX]
IMUL ECX,ECX,48
ADD ECX,4A1B68[color=DarkOrange] <==要根据不同的引擎来实际改变[/color]
[b]从DATA内存地址计算战场内存地址[/b]
1
MOV ECX,[color=Blue]<DATA内存地址>[/color]
CALL 00477ADC
MOV CL,AL[color=DarkOrange] <==必须先加测试AL是否等于0FF,0FF表示不在战场必须跳过[/color]
AND ECX,0FF
IMUL ECX,ECX,24
ADD ECX,004B2C50
2
PUSH [color=Blue]<DATA编号>[/color]
CALL 0043E4D6
ADD ESP,4
MOV CL,AL[color=DarkOrange] <==必须先加测试AL是否等于0FF,0FF表示不在战场必须跳过[/color]
AND ECX,0FF
IMUL ECX,ECX,24
ADD ECX,004B2C50
3
PUSH [color=Blue]<DATA编号>[/color]
CALL 4796DC
ADD ESP,4
MOV ECX,EAX[color=DarkOrange] <==必须先加测试EAX是否等于0FFFF,0FFFF表示不在战场必须跳过[/color]
IMUL ECX,ECX,24
ADD ECX,004B2C50
[color=Silver][[i] 本帖最后由 godtype 于 2014-3-18 15:00 编辑 [/i]][/color]
2009-8-10 11:38
godtype
第四部分 曹操传修改实例
一、根据已有的条件添加宝物或兵种特效
1、举一个最经典的例子:“主动连击”。
思路:因为原版是没有连击特效的,只有普通的连击率计算,所以就要从连击率这里入手修改,添加一个攻击方武将是否带有此特效的宝物(407A09),如果有连击率为100,没有就按连击率计算连击率。
先分析连击率计算的代码
00405CE6 /$ 55 PUSH EBP
00405CE7 |. 8BEC MOV EBP,ESP
00405CE9 |. 83EC 0C SUB ESP,0C [color=orange]——空出三个暂存空间[/color]
00405CEC |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX [color=orange]——输入的ECX==4927F0,并保存在[EBP-C]即第三个暂存空间里面[/color]
00405CEF |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] [color=orange]——将保存在[EBP-C]的4927F0存放在EAX里面[/color]
00405CF2 |. 8B48 0C MOV ECX,DWORD PTR DS:[EAX+C] [color=orange]——再将4927F0+C这个内存地址里面的数据,即攻击方武将的战场内存地址存放在ECX里面[/color]
00405CF5 |. E8 37990300 CALL 0043F631 [color=orange]——这条是取出武将爆发力的函数,输入的ECX必须是武将的战场内存地址,输出的EAX的数值包含了武将本身的数值 + 装备的数值 + 上升下降量[/color]
00405CFA |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX [color=orange]——将攻击方的总爆发力保存在[EBP-8]里面[/color]
00405CFD |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
00405D00 |. 33D2 XOR EDX,EDX
00405D02 |. 8A51 01 MOV DL,BYTE PTR DS:[ECX+1]
00405D05 |. 8BCA MOV ECX,EDX
00405D07 |. 6BC9 24 IMUL ECX,ECX,24
00405D0A |. 81C1 502C4B00 ADD ECX,004B2C50
00405D10 |. E8 1C990300 CALL 0043F631
00405D15 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX [color=orange]——将被攻击方的总爆发力保存在[EBP-4]里面[/color]
00405D18 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] [color=orange]——将被攻击方的总爆发力从[EBP-4]里面取出,存放在EAX里面,并开始准备计算普通的连击率[/color]
00405D1B |. 6BC0 03 IMUL EAX,EAX,3
00405D1E |. 3945 F8 CMP DWORD PTR SS:[EBP-8],EAX
00405D21 |. 72 04 JB SHORT 00405D27
00405D23 |. B0 64 MOV AL,64
00405D25 |. EB 3E JMP SHORT 00405D65
00405D27 |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
00405D2A |. D1E1 SHL ECX,1
00405D2C |. 394D F8 CMP DWORD PTR SS:[EBP-8],ECX
00405D2F |. 72 17 JB SHORT 00405D48
00405D31 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00405D34 |. D1E2 SHL EDX,1
00405D36 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00405D39 |. 2BC2 SUB EAX,EDX
00405D3B |. 6BC0 50 IMUL EAX,EAX,50
00405D3E |. 33D2 XOR EDX,EDX
00405D40 |. F775 FC DIV DWORD PTR SS:[EBP-4]
00405D43 |. 83C0 14 ADD EAX,14
00405D46 |. EB 1D JMP SHORT 00405D65
00405D48 |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00405D4B |. 3B45 FC CMP EAX,DWORD PTR SS:[EBP-4]
00405D4E |. 72 13 JB SHORT 00405D63
00405D50 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00405D53 |. 2B45 FC SUB EAX,DWORD PTR SS:[EBP-4]
00405D56 |. 6BC0 12 IMUL EAX,EAX,12
00405D59 |. 33D2 XOR EDX,EDX
00405D5B |. F775 FC DIV DWORD PTR SS:[EBP-4]
00405D5E |. 83C0 02 ADD EAX,2
00405D61 |. EB 02 JMP SHORT 00405D65
00405D63 |> B0 01 MOV AL,1
00405D65 |> 8BE5 MOV ESP,EBP
00405D67 |. 5D POP EBP
00405D68 \. C3 RETN
上面只写出部分的分析,关于连击率的计算就不写出来了。
连击特效放在哪个位置都没有所谓,根据前辈们已写的代码,就决定在开始计算连击率之前加入新代码,用无条件跳转到空白位置来改写。由于指令JMP *** 占用五个字节,所以就要占用了00405D15 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX和00405D18 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]这两条指令的位置。以下是代码:
[quote] [url=http://www.xycq.net/forum/thread-82183-1-1.html]《曹操传EXE修改详解》[/url]
原帖由 [i]慕容雪芸[/i] 于 2006-1-10 10:16 发表
00405D15 E9 B9000800 JMP 00485DD3 [color=orange]——跳到空白位置[/color]
00405D1A 90 NOP
00485DD3 8945 FC MOV DWORD PTR SS:[EBP-4],EAX [color=orange]——因为占用了405D15,所以先将原来405D15的代码写回这里[/color]
00485DD6 6A 3A PUSH 3A [color=orange]——特效号[/color]
00485DD8 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] [color=orange]——将保存在[EBP-C]的4927F0存放在EAX里面[/color]
00485DDB 8B48 08 MOV ECX,DWORD PTR DS:[EAX+8] [color=orange]——再将4927F0+8这个内存地址里面的数据,即攻击方武将的DATA内存地址存放在ECX里面[/color]
00485DDE E8 261CF8FF CALL 00407A09 [color=orange]——调用407A09[/color]
00485DE3 85C0 TEST EAX,EAX [color=orange]——EAX是否为0[/color]
00485DE5 74 07 JE SHORT 00485DEE [color=orange]——为0,即没有带上此特效的宝物,就要跳到后面的代码去计算普通的连击率[/color]
00485DE7 B0 64 MOV AL,64 [color=orange]——前面的EAX不为0,即有带上此特效的宝物,所以连击率为100[/color]
00485DE9 E9 77FFF7FF JMP 00405D65 [color=orange]——直接跳到连击率函数的最后输出到原来调用连击率函数的位置[/color]
00485DEE 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] [color=orange]——没有带上主动连击特效的宝物,就要计算普通的连击率,因为405D18同样被占用了,所以原来的405D18要写回在这里[/color]
00485DF1 E9 25FFF7FF JMP 00405D1B [color=orange]——最后跳回到之前跳出来的后一条代码[/color]
[/quote]
这样子,主动连击的宝物特效就添加完成了。兵种特效可以参考下面的:
兵种双击属性改法:
[quote]
[url]http://www.xycq.net/forum/thread-140085-1-1.html[/url]
00405D15 . /E9 E8330000 JMP Ekd5.00409102
00405D1A |90 NOP
00409102 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00409105 . 6A 3A PUSH 3A ;宝物特征
00409107 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
0040910A . 8B48 08 MOV ECX,DWORD PTR DS:[EAX+8]
0040910D . E8 F7E8FFFF CALL Ekd5.00407A09
00409112 . 85C0 TEST EAX,EAX
00409114 . 74 07 JE SHORT Ekd5.0040911D
00409116 . B0 64 MOV AL,64 ;双击几率
00409118 .^ E9 48CCFFFF JMP Ekd5.00405D65
0040911D . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00409120 . 8B4A 08 MOV ECX,DWORD PTR DS:[EDX+8]
00409123 . E8 E8D4FFFF CALL Ekd5.00406610
00409128 . 25 FF000000 AND EAX,0FF
0040912D . 83F8 31 CMP EAX,31 ;兵种
00409130 . 75 02 JNZ SHORT Ekd5.00409134
00409132 .^ EB E2 JMP SHORT Ekd5.00409116
00409134 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00409137 .^ E9 DFCBFFFF JMP Ekd5.00405D1B
以上设置3A(防御两次攻击)的特殊效果为主动双击,设置兵种31(原木人、偶EXE中的大将军)主动必双击,宝物优先于兵种。
[/quote]
2、减轻物理攻击伤害
继续占坑待填中。
[color=Silver][[i] 本帖最后由 godtype 于 2009-10-6 13:26 编辑 [/i]][/color]
2009-8-10 11:39
godtype
留坑备填
2009-8-10 11:40
godtype
留坑备填
2009-8-10 12:07
star175
回复 #1 godtype 的帖子
好贴,希望能对新手有帮助
再补充一个和4B2C50有关的
4B2C50 +8 和AI行动方针有关
+8 +9 +A +E(如果为7就是可控)
被动出击 FF 3
主动出击 FF 1
坚守原地 FF 2
攻击我将 要攻击武将的战场编号 0
到指定点 FF X Y 0
跟随武将 要跟随武将的战场编号 4
逃到指定点 FF X Y 4
[color=Silver][[i] 本帖最后由 star175 于 2009-8-10 13:55 编辑 [/i]][/color]
2009-8-10 12:15
godtype
回复 #8 star175 的帖子
原来如此,因为八岁的帖里面没有,所以我也不知道,谢了。
等一下我再补上去,如果看到有其他问题,帮忙指出一下。
2009-8-10 12:49
《苍狼白鹿传》
以前把AND和ADD搞混了
NOP
无作用或称为自动跳过这一行代码 (用UE打开编辑exe文件时你看到90,等同于汇编语言语句nop)
nop的应用对于保密有帮助
[color=Silver][[i] 本帖最后由 《苍狼白鹿传》 于 2009-8-10 12:54 编辑 [/i]][/color]
2009-8-10 13:54
star175
回复 #9 godtype 的帖子
有点错误,不Data号,而是战场编号
2009-8-10 14:27
godtype
回复 #11 star175 的帖子
哪个地方?
2009-8-10 16:19
star175
回复 #12 godtype 的帖子
8楼的帖子
攻击我将 要攻击武将的[color=red]战场编号[/color]
跟随武将 要跟随武将的[color=red]战场编号[/color]
2009-8-10 17:06
godtype
回复 #13 star175 的帖子
已修正了。
2009-8-10 18:31
主席
诚心学习中,毅兄应该多占几个坑备用
2009-8-10 20:08
jijyo
渔之教程,远胜于鱼
学习中..0......
2009-8-10 21:05
morningboo
受益匪浅,受教了~:!*
2009-8-12 09:01
morningboo
这个帖子不能沉!!!顶上去!
2009-8-12 17:23
小小KS
好乱...好多....看不懂= =
还是UE来得简洁(其实UE也不简洁....)
2009-8-14 09:45
闻鸡起舞
我有一个问题:
新引擎很好用,但是不太喜欢里面的围攻和必杀.
我想取消里的围攻和必杀,请问如何修改???
2009-8-15 15:34
sddciwei
好贴,刚接触OB,对我来说还有些深奥,留下慢慢学习!!
2009-8-29 16:59
智才將帥
为什么我打开data.e5的时候
ob说不能打开
因为不是32bit
那到底如何解决呢?
2009-9-25 10:03
z6482
这帖可被我找到了!汇编的那些助记符毕竟比十六进制的数据看起来舒坦些呀!我在想要是有一天能出一款将汇编再反编译成C一样的高级语言的软件就好了,毕竟汇编那么多指令,那么多的地址还是让人看起来不爽啊!好的工具才能提高生产力和工作效率!呵呵!现在最迫切需要的就是介绍OLLDBG的最基本用法的东西了,最好是包括简单的CCZ修改的。建议尽快来一个实例制作的,实例可以不要恨强大的功能修改、宝物打造,只要能够包括修改所必要的一些操作和技巧就可以了,这样既可以学习OB又可以学习CCZ修改的一些技巧。LZ加油!!:qcool+:qcool+
2009-10-6 13:29
godtype
更新第四部分的第一点
2009-10-7 22:08
ducksuper
黄色解说真是太详细了:qP+
2009-10-7 22:22
时间轴空转
这么好的东西一定要顶!
2009-10-16 04:34
ryanley
小弟在修改06的时候碰到了点问题……
在arg1 = 00000038的时候他提示说“未认可操作数”
请问是什么意思?
要怎样做出调整?
2009-10-16 07:38
godtype
回复 #27 ryanley 的帖子
直接从OB中复制出来是会这样显示的:
0043B59E |. 6A 38 PUSH 38 ; /Arg1 = 00000038
以上面这条为例,修改的时候,只要输入 PUSH 38 就可以了,后面从 “;”开始的部分都不要输入。
2009-10-18 11:42
ryanley
多谢,我现在会写了。:Th
还想问一下那个连续三个出场设定的要怎么写?我查过过去的帖子,但是改写之后有问题,一进去没有R形象或者弹错……
我现在这个版本的是不出场也等于出场,就是每次可决定十个人出场
然而一旦遇到那些需要禁止某人出场的环节就很头痛,唯一的办法就是离队……
而且我这个离队还是带走装备……
所以您告诉我那个连续三个出场的要怎么写,或者怎样改出离开时也有留下装备的办法都行……比如离开时等级+1之类的,我在老帖子里看到的方法……
2009-10-18 12:17
godtype
回复 #29 ryanley 的帖子
东方教主的帖里面已经有了,不过我用岱瀛版改过一次也有很多问题出来,以后没有再研究了。至于离队带走装备的问题,我在其他人的发问帖也提过,只能参考其他引擎来改。
2009-11-22 23:13
嗜血的妖戟
能否举个例子详细说一下,如何将多个宝物属性叠加成某一个宝物上
能否举个例子详细说一下,如何将多个宝物属性叠加成某一个宝物上
我想做一个能连续主动攻击两次+致命一击的属性,就是连续两次暴击
哪位高人能指点一下
2009-11-28 19:16
狂煞∑小星
强帖啊,顶起,不能沉了。
2010-1-30 23:55
112311
請問一下, 有個修改要改00410FFF, 但是開了ob後沒有00410FFF等一行指令,
反而有00410FFE, 00411002, 00411004等行, 為什麼會這樣?:doubt:
2010-2-1 15:33
godtype
回复 #33 112311 的帖子
不同的引擎位置不一定准确的,前后会有偏移的,最好将你想改的代码帖上来,并说明是哪个引擎,如果已经大量调整,最好连EXE也上传。
2010-2-3 13:16
112311
[quote]原帖由 [i]godtype[/i] 于 2010-2-1 15:33 发表
不同的引擎位置不一定准确的,前后会有偏移的,最好将你想改的代码帖上来,并说明是哪个引擎,如果已经大量调整,最好连EXE也上传。 [/quote]
是ster的exe
Q:如何修改集气比率
A:代码如下
00410FFF |. D1EA SHR EDX,1 '敌方集气50%
00411001 |. EB 03 JMP SHORT Ekd5.00411006
00411003 |> C1EA 02 SHR EDX,2 '我 友 方集气25%
如果要禁止必杀,可以通过不能集气来实现
以上代码改为
00410FFF 33D2 XOR EDX,EDX
00411001 |. EB 03 JMP SHORT Ekd5.00411006
00411003 33D2 XOR EDX,EDX
00411005 90 NOP
00411006 |> 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
0041100A EB 05 JMP SHORT Ekd5.00411011
这样就不会集气了,但Sp槽还是会显示
2010-2-4 07:57
godtype
回复 #35 112311 的帖子
相关代码向后移一个字节就可以了,旧的410FFF在新的就是411000
2010-2-12 14:01
tps520
楼主能帮我改个突击移动和无反击兵种么??我找yanguodong的帖子改了N次,都出错。。。原版的EXE,万分感激~~~~
2010-2-13 16:12
sznsy35
回复 #29 ryanley 的帖子
连续三条出场这个在东方教主的帖子的回复中似乎有修正过了,好像是雪芸,指出其中有一行有问题,去看看那个帖子就知道了。
2010-5-12 22:40
513633522
回复下上去,以后好找到看:hz1001:
太深熬了:hz1026:
2010-8-9 10:01
long128
看不懂
2010-8-10 18:14
northwind_x
强大的工具,感谢楼主,对于那些光有兴趣,却没编程经验的同学来说还是复杂呵
2010-11-28 12:53
513633522
[quote]2、减轻物理攻击伤害
继续占坑待填中。
[/quote]
这坑挖了一年了,毅大什么时候填一点哈:hz1024:
2010-12-1 09:19
godtype
[quote]原帖由 [i]513633522[/i] 于 2010-11-28 12:53 发表
这坑挖了一年了,毅大什么时候填一点哈:hz1024: [/quote]
不会再填坑了,我很笨,免得某些高手又跳出来。
2011-2-24 13:02
jiangweia
学习了 谢谢
2011-3-1 05:09
cswaccz
EAX?
我记得8086的寄存器就是AX,BX……,为什么写成EAX.EBX,前面那个E是啥意思?
2011-3-1 08:57
godtype
[quote]原帖由 [i]cswaccz[/i] 于 2011-3-1 05:09 发表
我记得8086的寄存器就是AX,BX……,为什么写成EAX.EBX,前面那个E是啥意思? [/quote]
“expand”扩展,32位通用寄存器,用来区别8086时代的16位。
2011-3-2 21:49
cswaccz
回复 #46 godtype 的帖子
谢谢!
另外能不能简略指教一下指令系统跟8086的有什么区别?
[color=Silver][[i] 本帖最后由 cswaccz 于 2011-3-2 21:52 编辑 [/i]][/color]
2011-3-2 21:56
godtype
回复 #47 cswaccz 的帖子
这些我就不会了,我只会改游戏。
2011-3-17 18:48
ioriyagami98
太复杂了,还是放弃了
2011-3-17 18:54
气态水银
此教程对新人来说可能有些复杂,但对大多数MOD制作者来说是很有帮助的。
多谢楼主发此教程,有些代码我以前不懂的,看了您的教程如拨云见日,茅塞顿开!
[color=Silver][[i] 本帖最后由 气态水银 于 2011-3-17 19:01 编辑 [/i]][/color]
2011-5-21 20:08
灬棉崽灬
毅大解决下红叉……
2011-8-14 23:13
灬棉崽灬
毅大快把减轻物理伤害写出来呀:hz1018:
这里面把主动双击写得十分详细~我十分受益啊!:hz1018:
然后弱弱的问一下,这些什么连击率的代码是如何找出来的:hz1024:
2011-8-19 22:21
godtype
回复 #53 灬棉崽灬 的帖子
等下次MOD更新后会[u]考虑[/u]写些东西。
至于找代码,一般先看资料,再根据实际情况推理出需要的内容。
2011-8-20 08:59
513633522
坐等MOD更新,看新东西:hz1016:
等教程更新:hz1016:
2011-11-10 19:11
冰麒麟
受益非浅,多谢毅哥教程及众前辈的贡献。
继续研究。
2011-11-11 14:58
冰麒麟
0046E8C7 |. A3 C0684B00 mov dword ptr [4B68C0], eax
0046E8CC |. 8B45 10 mov eax, dword ptr [ebp+10]
0046E8CF |. 25 FFFF0000 and eax, 0FFFF
0046E8D4 |. A3 F0684B00 mov dword ptr [4B68F0], eax
0046E8D9 |. 8B4D 10 mov ecx, dword ptr [ebp+10]
毅哥,为什么我用的引擎里,全是dword ptr ??而没有dword ptr DS/SS ??这个会有什么影响么?
话说我的引擎又突然变大了,现在都1.68M了,会不会跟这个有关?
2011-11-11 15:17
godtype
回复 #57 冰麒麟 的帖子
你用的应该是叫Ollyice的版本。
EXE变得太大了,是不是又给其他人改过。
[color=Silver][[i] 本帖最后由 godtype 于 2011-11-11 15:24 编辑 [/i]][/color]
2011-11-11 16:06
冰麒麟
回复 #58 godtype 的帖子
原来是版本问题。
是前几天才变大了,这段时间都没让别人帮忙改过。只做了一些最基本的形象修改等等。
之前从900多K,变成了1M,star说有可能因为中毒了。
这次变成1.68M,变大了一半,我还是赶紧换回前些天备份的引擎好了。:hz1010:
2014-3-18 14:47
WHITESHIP
补充
4927F0+60C 是人物挨打动作播放时位移抖动的横坐标
4927F0+610 是纵坐标
只在调用unit_spc时才用到。
页:
[1]
2
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.