算数运算指令
加法指令:add
例:add esp,10 esp+10=esp
add esp,10 就是把esp的值+10 后面跟着的esp+10=esp意思是此时esp的值等于
esp+10
减法指令:sub
例:sub esp,10 esp-10=esp
跳转指令:
je :等于
jne:不等于
ja:大于
jna:不大于
jb:小于
jnb:不小于
JO 溢出跳转
JNO 不溢出跳转
JB 低于跳转
JB 低于跳转
JNB 不低于跳转
JE 相等跳转
JNE 不等跳转
JBE 不高于跳转
JA 高于跳转
JS 负号跳转
JNS 非负跳转
JP 奇偶跳转
JNP 非奇偶跳转
JL 小于跳转
JNL 不小于跳转
JNG 不大于跳转
JG 大于跳转
JO 溢出跳转
JNO 不溢出跳转
JB 低于跳转
JNB 不低于跳转
JE 相等跳转
JNE 不等跳转
JBE 不高于跳转
JA 高于跳转
JS 负号跳转
JNS 非负跳转
JP 奇偶跳转
JNP 非奇偶跳转
JL 小于跳转
JNL 不小于跳转
JNG 不大于跳转
JG 大于跳转
JO 溢出跳转
JNO 不溢出跳转
JB 低于跳转
JNB 不低于跳转
JE 相等跳转
JNE 不等跳转
JBE 不高于跳转
JA 高于跳转
JS 负号跳转
JNS 非负跳转
JP 奇偶跳转
JNP 非奇偶跳转
JL 小于跳转
JNL 不小于跳转
JNG 不大于跳转
JG 大于跳转
JCXZ 计数一六零跳转 位移8 $E3 无 无 无 无 10 无 无 8086 无 $67
JECXZ 计数三二零跳转 位移8 $E3 无 无 无 无 10 无 无 386 $67 无
转移条件:sf异或of=0
转移说明:大于等于转移
其他说明:有符号数,两个标志位sf和of
jae
转移条件:cf=0
转移说明:不低于,或者高于等于,或者进位标志转移清零时转移
其他说明:单个标志,无符号数
在转移指令之前有test、cmp等比较指令
mov [ebx+14],esi
意思是把esi这个寄存器里的值放到[ebx+14]这个地址里去
[ebx+14] 中的+14不要做任何修改 这代表的意思是在ebx的地址上偏移14个单位而已
dec [ecx+edi*4+48]
dec是减1指令 当[ecx+edi*4+48]这个指令执行时减1
参照游戏是枪战类的此命令为指令执行时,狙击枪子弹数量减1
要锁定子弹的数量,第一种方法是用nop指令
进入汇编模板后
把dec [ecx+edi*4+48] 这条指令删除
填充对应机器码个数的nop指令
如
字节 指令
ff 4c b9 48 dec [ecx+edi*4+48]
汇编中就这样写
nop
nop
nop
nop
pop edi (此处为未删除的指令)
方法二 指令用掉的子弹加0
add byte ptt [ecx+edi*4+48],0
方法三 指令用掉的子弹减0
sub byte ptt [ecx+edi*4+48],0
方法四 跳过这条指令达到未执行也就不会减少子弹数量
jmp exit
originalcode: //标号
dec [ecx+edi*4+48]
exit: //标号
pop edi
jmp returnhere
我们来分析一下:jmp exit,转到标号exit处执行指令,那么dec [ecx+edi*4+48]这条指令被跳过没有执行,那么子弹的数量就会保持不变,从
而达到与锁定子弹数量一样的效果,pop edi这条代码本来是和dec [ecx+edi*4+48]放在一起的,该代码不能被跳过,否则游戏会崩溃,所以要把它
放到标号exit下面。分析结束,任务完成
第二个情况是让子弹数量只加不减
要让子弹数量只增不减,可以把dec指令改为inc指令,inc是加1指令,与dec刚刚相反,要实现当子弹数量大于6时停止增加,可用条件转移指令jb,当然还需要与cmp指令配合使用
cmp [ecx+edi*4+48],6
jb originalcode
mov byte ptt [ecx+edi*4+48],6
jmp exit
originalcode:
inc [ecx+edi*4+48]
们来分析一下。首先把dec改为inc,子弹数量加1,然后用cmp指令,拿子弹数量即[ecx+edi*4+48]的数值与6比较,用jb指令如果低于6则转
移到标号originalcode处执行指令,子弹数量正常增加,如果不低于6,则不转移,mov byte ptr [ecx+edi*4+48],6 这条代码执行后,子弹数量写入
6,子弹数量就固定在6了,下面用jmp exit这条指令跳到exit处,跳过了inc [ecx+edi*4+48]这条代码不被执行,如果不跳过,子弹数量加1,子弹
数量就变成7而不是6了,分析完毕,任务完成
什么是栈
*寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用今天的程序中我们涉及到九个寄存器:
--EAX:扩展累加寄存器
--EBX:扩展基址寄存器
--ECX:扩展计数寄存器
--EDX:扩展数据寄存器
--ESI:扩展来源寄存器
--EDI:扩展目标寄存器
--EBP:扩展基址指针寄存器
--ESP:扩展堆栈指针寄存器
--EIP:扩展的命令指针寄存器
*这些寄存器的大小是32位(4个字节),他们可以容纳的数据从0-FFFFFFFF(无符号数),除了一下三个寄存器,其他的我们都可以随意使用:
--EBP:主要是用于栈和栈帧
--ESP:只想当前进程的栈空间地址.
--EIP:总是指向下一条要被执行的指令.
POP是把栈的最上面一位弹出栈空间
什么是CALL
*call xxx: 等于push eip;然后 jmp xxx;
先把eip地址放进栈执行完后再跳转返回 XXX这个地址的执行命令
call 有以下几种方式
--call 404000h ; 直接跳到函数或过程的地址
--call eax ; 函数或过程 地址存放在eax这个寄存器里 面
--call dword ptr [eax]
这个数值或者函数存放在eax这个地址里加了个方括号[]
就是取eax这个地址里面的值,要怎么取这个值,是以什么形式取这个值 就是 dword 这个宽度命令 取这个地址的四个字节的值
比如eax的值是400080h 取他的四个字节的值就是404000h
--call dword ptr [eax+5]
这个就是取 eax +5个位置的值
就是400080h 把80 +5再取他的值 取值的宽度是dword四个字节的宽度 40400085h====404000h
--call dword ptr [<&API>]
&(读and)的意思是取一个地址
意思是取一个API函数的地址
*mov指令的格式; mov dest,src
*mov指令将src的内容拷贝到dest里面去
mov指令共有一下几种扩展
--movs/movsb/movsw/movsd edi,esi
这些变体就按照
--按串/字节/字/双字
为单位将esi寄存器指向的数据复制到edi寄存器指向的空间里去.
复制是从右往左看 不要反了
--movsx 是符号位扩展的意思
byte =>word ,word=>dword (扩展后高位全用符号位填充),然后实现mov
--movzx 零扩展,byte=>word ,word=>dword
(扩展后高位全用0填充),然后实现mov
下面这个指令关乎破解是否成功
*CMP(读come on 佩儿)指令格式:cmp dest,src
*cmp指令的意思是 比较 dest和src两个操作数,并通过比较结果设置C/O/Z 三个值的标志位
* cmp指令大概有以下几种格式
-cmp eax,ebx ;如果相等,Z标志位置1(OK 行的意思),否则为置0(***的意思
)
-cmp eax,[404000] 将eax和404000地址处的dword型数据相比较,结果和上面一样处理方式
-cmp [404000],eax 顺序倒过来意思也是一样
标志位
这个概念要先懂这是起破解成功与否至关重要的一个概念
*事实上所有的标志位归并于一个32位的标志位寄存器
也就是说有32个不同的标志位
*每个标志位有两个属性:置1或置0 不懂是什么意思往回 看看
*在逆向反汇编中,你真正需要关心的标志位只有三个
也就是cmp指令能修改的那三个: Z/O/C 是欧不是零
Z===>零0标志位
这个标志位是最常用的,运算结果为0的时候,Z标志位置1,否则置0
0===>溢出标志位
在运行过程中,如操作数超出了机器能表示的范围则称为溢出(你懂的)$_$,此时OF位置1,否则置0.
C===>进位标志位
记录运算时从最高有效位产生的进位值.例如执行加法指令9+1 多了一位数了 此时就用到进位了 有进位时置1
,否则置0
逻辑运算
所谓的BUG其实就是逻辑上没想到的地方被你找到了
如果用0表示假 1表示真的时候就容易看懂了
operation src dest result
AND (与) 当两者均为真的时候 为真 1 1 1
1 0 0
0 1 0
0 0 0
一一一一一一一一一一一一一一一一一一一一一一一
OR (或)当 两者中至少有一个是真的 结果就是真的
1 1 1
1 0 1
0 1 1
0 0 0
一一一一一一一一一一一一一一一一一一一一一一
XOR (异或)存在相异的情况下结果为真
1 1 0
1 0 1
0 1 1
0 0 0
一一一一一一一一一一一一一一一一一一一一一一
NOT 0 N/A 1
(取相反值) 1 N/A 0
三刀整理
加法指令:add
例:add esp,10 esp+10=esp
add esp,10 就是把esp的值+10 后面跟着的esp+10=esp意思是此时esp的值等于
esp+10
减法指令:sub
例:sub esp,10 esp-10=esp
跳转指令:
je :等于
jne:不等于
ja:大于
jna:不大于
jb:小于
jnb:不小于
JO 溢出跳转
JNO 不溢出跳转
JB 低于跳转
JB 低于跳转
JNB 不低于跳转
JE 相等跳转
JNE 不等跳转
JBE 不高于跳转
JA 高于跳转
JS 负号跳转
JNS 非负跳转
JP 奇偶跳转
JNP 非奇偶跳转
JL 小于跳转
JNL 不小于跳转
JNG 不大于跳转
JG 大于跳转
JO 溢出跳转
JNO 不溢出跳转
JB 低于跳转
JNB 不低于跳转
JE 相等跳转
JNE 不等跳转
JBE 不高于跳转
JA 高于跳转
JS 负号跳转
JNS 非负跳转
JP 奇偶跳转
JNP 非奇偶跳转
JL 小于跳转
JNL 不小于跳转
JNG 不大于跳转
JG 大于跳转
JO 溢出跳转
JNO 不溢出跳转
JB 低于跳转
JNB 不低于跳转
JE 相等跳转
JNE 不等跳转
JBE 不高于跳转
JA 高于跳转
JS 负号跳转
JNS 非负跳转
JP 奇偶跳转
JNP 非奇偶跳转
JL 小于跳转
JNL 不小于跳转
JNG 不大于跳转
JG 大于跳转
JCXZ 计数一六零跳转 位移8 $E3 无 无 无 无 10 无 无 8086 无 $67
JECXZ 计数三二零跳转 位移8 $E3 无 无 无 无 10 无 无 386 $67 无
转移条件:sf异或of=0
转移说明:大于等于转移
其他说明:有符号数,两个标志位sf和of
jae
转移条件:cf=0
转移说明:不低于,或者高于等于,或者进位标志转移清零时转移
其他说明:单个标志,无符号数
在转移指令之前有test、cmp等比较指令
mov [ebx+14],esi
意思是把esi这个寄存器里的值放到[ebx+14]这个地址里去
[ebx+14] 中的+14不要做任何修改 这代表的意思是在ebx的地址上偏移14个单位而已
dec [ecx+edi*4+48]
dec是减1指令 当[ecx+edi*4+48]这个指令执行时减1
参照游戏是枪战类的此命令为指令执行时,狙击枪子弹数量减1
要锁定子弹的数量,第一种方法是用nop指令
进入汇编模板后
把dec [ecx+edi*4+48] 这条指令删除
填充对应机器码个数的nop指令
如
字节 指令
ff 4c b9 48 dec [ecx+edi*4+48]
汇编中就这样写
nop
nop
nop
nop
pop edi (此处为未删除的指令)
方法二 指令用掉的子弹加0
add byte ptt [ecx+edi*4+48],0
方法三 指令用掉的子弹减0
sub byte ptt [ecx+edi*4+48],0
方法四 跳过这条指令达到未执行也就不会减少子弹数量
jmp exit
originalcode: //标号
dec [ecx+edi*4+48]
exit: //标号
pop edi
jmp returnhere
我们来分析一下:jmp exit,转到标号exit处执行指令,那么dec [ecx+edi*4+48]这条指令被跳过没有执行,那么子弹的数量就会保持不变,从
而达到与锁定子弹数量一样的效果,pop edi这条代码本来是和dec [ecx+edi*4+48]放在一起的,该代码不能被跳过,否则游戏会崩溃,所以要把它
放到标号exit下面。分析结束,任务完成
第二个情况是让子弹数量只加不减
要让子弹数量只增不减,可以把dec指令改为inc指令,inc是加1指令,与dec刚刚相反,要实现当子弹数量大于6时停止增加,可用条件转移指令jb,当然还需要与cmp指令配合使用
cmp [ecx+edi*4+48],6
jb originalcode
mov byte ptt [ecx+edi*4+48],6
jmp exit
originalcode:
inc [ecx+edi*4+48]
们来分析一下。首先把dec改为inc,子弹数量加1,然后用cmp指令,拿子弹数量即[ecx+edi*4+48]的数值与6比较,用jb指令如果低于6则转
移到标号originalcode处执行指令,子弹数量正常增加,如果不低于6,则不转移,mov byte ptr [ecx+edi*4+48],6 这条代码执行后,子弹数量写入
6,子弹数量就固定在6了,下面用jmp exit这条指令跳到exit处,跳过了inc [ecx+edi*4+48]这条代码不被执行,如果不跳过,子弹数量加1,子弹
数量就变成7而不是6了,分析完毕,任务完成
什么是栈
*寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用今天的程序中我们涉及到九个寄存器:
--EAX:扩展累加寄存器
--EBX:扩展基址寄存器
--ECX:扩展计数寄存器
--EDX:扩展数据寄存器
--ESI:扩展来源寄存器
--EDI:扩展目标寄存器
--EBP:扩展基址指针寄存器
--ESP:扩展堆栈指针寄存器
--EIP:扩展的命令指针寄存器
*这些寄存器的大小是32位(4个字节),他们可以容纳的数据从0-FFFFFFFF(无符号数),除了一下三个寄存器,其他的我们都可以随意使用:
--EBP:主要是用于栈和栈帧
--ESP:只想当前进程的栈空间地址.
--EIP:总是指向下一条要被执行的指令.
POP是把栈的最上面一位弹出栈空间
什么是CALL
*call xxx: 等于push eip;然后 jmp xxx;
先把eip地址放进栈执行完后再跳转返回 XXX这个地址的执行命令
call 有以下几种方式
--call 404000h ; 直接跳到函数或过程的地址
--call eax ; 函数或过程 地址存放在eax这个寄存器里 面
--call dword ptr [eax]
这个数值或者函数存放在eax这个地址里加了个方括号[]
就是取eax这个地址里面的值,要怎么取这个值,是以什么形式取这个值 就是 dword 这个宽度命令 取这个地址的四个字节的值
比如eax的值是400080h 取他的四个字节的值就是404000h
--call dword ptr [eax+5]
这个就是取 eax +5个位置的值
就是400080h 把80 +5再取他的值 取值的宽度是dword四个字节的宽度 40400085h====404000h
--call dword ptr [<&API>]
&(读and)的意思是取一个地址
意思是取一个API函数的地址
*mov指令的格式; mov dest,src
*mov指令将src的内容拷贝到dest里面去
mov指令共有一下几种扩展
--movs/movsb/movsw/movsd edi,esi
这些变体就按照
--按串/字节/字/双字
为单位将esi寄存器指向的数据复制到edi寄存器指向的空间里去.
复制是从右往左看 不要反了
--movsx 是符号位扩展的意思
byte =>word ,word=>dword (扩展后高位全用符号位填充),然后实现mov
--movzx 零扩展,byte=>word ,word=>dword
(扩展后高位全用0填充),然后实现mov
下面这个指令关乎破解是否成功
*CMP(读come on 佩儿)指令格式:cmp dest,src
*cmp指令的意思是 比较 dest和src两个操作数,并通过比较结果设置C/O/Z 三个值的标志位
* cmp指令大概有以下几种格式
-cmp eax,ebx ;如果相等,Z标志位置1(OK 行的意思),否则为置0(***的意思
)
-cmp eax,[404000] 将eax和404000地址处的dword型数据相比较,结果和上面一样处理方式
-cmp [404000],eax 顺序倒过来意思也是一样
标志位
这个概念要先懂这是起破解成功与否至关重要的一个概念
*事实上所有的标志位归并于一个32位的标志位寄存器
也就是说有32个不同的标志位
*每个标志位有两个属性:置1或置0 不懂是什么意思往回 看看
*在逆向反汇编中,你真正需要关心的标志位只有三个
也就是cmp指令能修改的那三个: Z/O/C 是欧不是零
Z===>零0标志位
这个标志位是最常用的,运算结果为0的时候,Z标志位置1,否则置0
0===>溢出标志位
在运行过程中,如操作数超出了机器能表示的范围则称为溢出(你懂的)$_$,此时OF位置1,否则置0.
C===>进位标志位
记录运算时从最高有效位产生的进位值.例如执行加法指令9+1 多了一位数了 此时就用到进位了 有进位时置1
,否则置0
逻辑运算
所谓的BUG其实就是逻辑上没想到的地方被你找到了
如果用0表示假 1表示真的时候就容易看懂了
operation src dest result
AND (与) 当两者均为真的时候 为真 1 1 1
1 0 0
0 1 0
0 0 0
一一一一一一一一一一一一一一一一一一一一一一一
OR (或)当 两者中至少有一个是真的 结果就是真的
1 1 1
1 0 1
0 1 1
0 0 0
一一一一一一一一一一一一一一一一一一一一一一
XOR (异或)存在相异的情况下结果为真
1 1 0
1 0 1
0 1 1
0 0 0
一一一一一一一一一一一一一一一一一一一一一一
NOT 0 N/A 1
(取相反值) 1 N/A 0
三刀整理