鱼C论坛

 找回密码
 立即注册

解密系列 汇编预备知识(一)

热度 51已有 4468 次阅读2011-4-4 19:03 |个人分类:破解知识|

解密系列 汇编预备知识(一)



一,认识机器码和编程语言


用 UltraEdit 等编辑器打开任何一个可执行文件时你会看到许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(十六进制)组成的数字这些数字就是传说中的机器码。


那么,什么是机器码呢?小甲鱼在此啰嗦一下哈,机器码就是我们的 CPU 唯一能够读懂的东西,没错,也就是数字,在小甲鱼的课程中曾经说过,我们的 CPU 事实上相当“愚蠢”只认识 0 和 1,我们无论看到什么华丽的画面,复杂的声音,甚至是在感悟自小日本帝国的爱情拍得如此之绝美的同时,我们都应该深刻的理解到:这一切一切都是 0 和 1 的组合而已,仅此而已!无论是数据还是指令,放到内存中都是一样的形式:0 和 1。(内存中是以二进制的形式存放的,由于二进制和十六进制的转换相对来说比较方便,我们也不远看到一堆非1 则 0 的数字,因此,我们的编辑器基本上都默认以十六进制的形式显示给我们阅读和编辑)。


其实我们都很清楚,任何复杂的游戏或者是操作,CPU 做的事情就只是读取指令和处理数据。所以我们需要编程序,通过程序,告诉 CPU 去哪里处理以哪些方法处理哪些指令,这就是编程!


但这是最原始的编程语言,也就是机器码时代,一切的操作都源于程序员输入的0 和 1,这样我们非常不方便阅读和修改,所以聪明的科学家发明了汇编语言取代机器语言。怎么取代呢?其实语言就是一种约定,科学家们做了一个“转换器”,这个“转换器”的功能相当简单,就是将一些经常用到的1 和 0 的组合替换成mov ,add ,div等比较有意义的单词,这样我们想做任何操作我们就不用辛辛苦苦的写“1000100111011000”而可以直接写上“mov ax, bx”。这样,“转换器”一但接收到我们输入“mov ax, bx”的信息,就自动转化为“1000100111011000”给 CPU 这个小白痴看……而这个“转换器”就是我们现在编译器的祖先。mov, add,div这些称之为操作指令,属于汇编语言范畴,ax, bx这些是寄存器,寄存器说白了就是 CPU 临时操作放点东西的地方。具体的小甲鱼这里不再赘述,大家可以看下我的零基础入门学习汇编语言系列视频教程,里边小甲鱼已经相当详细地做了讲解。这里我们就此带过。


C,C++,pascal,.net 等这些我们耳熟能详的语言我们称之为“高级语言”,而汇编语言何谓高级?

所谓高级,不过是把一句句烦人的代码给封装起来,于是乎就有了函数的概念,此后有了类,组件等等,都是一层层的封装!


************ 以下未做补充修改 ************************************************


那么我们在做修改程序的时候,就必须通过修改机器码来修改文件,达到目的。

.需要熟练掌握的全部汇编知识(只有这么多)

不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了

cmp a,b 比较ab

mov a,b b的值送给a

ret 返回主程序

nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面

(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)

call 调用子程序

je jz 若相等则跳(机器码74 0F84)

jnejnz 若不相等则跳(机器码750F85)

jmp 无条件跳(机器码EB)

jb 若小于则跳

ja 若大于则跳

jg 若大于则跳

jge 若大于等于则跳

jl 若小于则跳

jle 若小于等于则跳

pop 出栈

push 压栈

.常见修改(机器码)

74=>75 74=>90 74=>EB

75=>74 75=>90 75=>EB

jnz->nop

75->90(相应的机器码修改)

jnz -> jmp

75 -> EB(相应的机器码修改)

jnz -> jz

75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)

.两种不同情况的不同修改方法

1.修改为jmp

je(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息

xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能..."Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)

。。。

。。。

xxxxxxxxxxxx 正确路线所在

2.修改为nop

je(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处

xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里)

。。。

。。。

xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)

。。。

。。。

.爆破无敌口诀 背会此口诀,天下无敌,以后慢慢琢磨,仔细体会,收益多多。如此好的口诀,不要错过

一条(跳)就死,九筒(90)就胡   (对应上面的2.修改为nop

一条(跳)就胡,一饼(EB)伺候   (对应上面的1.修改为jmp

妻死(74)便妻无(75) 

爸死(84)便爸无(85


路过
1

雷人
7

握手
41

鲜花
1

鸡蛋

刚表态过的朋友 (50 人)

发表评论 评论 (7 个评论)

回复 花落ぃ红颜醉 2012-10-4 22:16
后面的 太搞笑了
回复 怡静 2013-6-25 19:55
不错!学习啦!谢谢!
回复 yu457001 2014-1-26 10:50
   谢谢归纳总结的这些知识
回复 tzblue 2014-11-22 07:20
小甲鱼老师太幽默了!
回复 !@R键! 2015-1-25 17:41
。。
回复 织梦~ 2015-9-19 20:35
真逗
回复 zyzhen 2018-5-24 10:53
six six six

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-30 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部