千里冰封 发表于 2016-12-18 23:29

汇编小知识之【jmp+call】

本帖最后由 千里冰封 于 2016-12-19 09:58 编辑

大家都知道,在od里能看到很多,汇编指令,比如push 、mov、jmp、call 等等{:5_122:}评分甩甩,大步走来,前方高能,花见花开{:5_123:}

看具体代码如下:{:5_117:}

00401004/.55            push    ebp
00401005|.8BEC          mov   ebp,esp
00401007|.68 02000080   push    0x80000002
0040100C|.6A 00         push    0x0
0040100E|.68 01000000   push    0x1
00401013|.6A 00         push    0x0
00401015|.6A 00         push    0x0
00401017|.6A 00         push    0x0
00401019|.68 01000100   push    0x10001
0040101E|.68 05000106   push    0x6010005
00401023|.68 06000152   push    0x52010006
00401028|.68 03000000   push    0x3
0040102D|.BB D0104000   mov   ebx,004010D0
00401032|.E8 8E000000   call    004010C5
00401037|.83C4 28       add   esp,0x28
0040103A|.8BE5          mov   esp,ebp
0040103C|.5D            pop   ebp                                       
0040103D\.C3            retn
0040103E/.55            push    ebp
0040103F|.8BEC          mov   ebp,esp
00401041|.68 02000080   push    0x80000002
00401046|.6A 00         push    0x0
00401048|.68 01000000   push    0x1
0040104D|.6A 00         push    0x0
0040104F|.6A 00         push    0x0
00401051|.6A 00         push    0x0
00401053|.68 01000100   push    0x10001
00401058|.68 0A000106   push    0x601000A
0040105D|.68 0B000152   push    0x5201000B
00401062|.68 03000000   push    0x3
00401067|.BB D0104000   mov   ebx,004010D0
0040106C|.E8 54000000   call    004010C5
00401071|.83C4 28       add   esp,0x28
00401074|.8BE5          mov   esp,ebp
00401076|.5D            pop   ebp                                       
00401077\.C3            retn
00401078   $C3            retn
00401079   .C3            retn
0040107A/$B8 06000000   mov   eax,0x6
0040107F|.E8 3B000000   call   004010BF
00401084|.FC            cld
00401085|.DBE3          finit
00401087|.E8 ECFFFFFF   call    00401078
0040108C|.68 79104000   push    00401079
00401091|.B8 03000000   mov   eax,0x3
00401096|.E8 24000000   call    004010BF
0040109B|.83C4 04       add   esp,0x4
0040109E|.68 01000152   push    0x52010001
004010A3|.E8 11000000   call    004010B9
004010A8|.83C4 04       add   esp,0x4
004010AB|.E8 03000000   call    004010B3
004010B0|.33C0          xor   eax,eax                                    
004010B2\.C3            retn
004010B3   $FF25 EC784600 jmp   near dword ptr ds:            
004010B9   $FF25 F0784600 jmp   near dword ptr ds:               
004010BF   $FF25 F4784600 jmp   near dword ptr ds:               
004010C5   $FF25 D0784600 jmp   near dword ptr ds:            

我们知道,左边的是,内存地址,中间的是十六进制机器码,右边的是汇编代码
那么机器码和汇编代码之间的关系如何?{:5_121:}
00401004/.55            push    ebp
00401005|.8BEC          mov   ebp,esp

中间的机器码,55 就是汇编代码push   ebp, 8BEC 就是汇编代码 mov    ebp,esp 这些都是固定的,一 一对应的,大家可以去实际搜索一下。
0040108C|.68 79104000   push    00401079
这个代码 可以看出, 68 就是push的意思。68后面的 79104000 其实就是00401079。为什么看起来像倒着的呢?
这是因为,在计算机里面,数字是从低单元到   高单元   依次写入的。而一个的单元就是1个字节,1个字节就是8位,也就是2个十六进制位。
举个例子 十六进制 23 就是一个字节,08也是一个字节,4532 就是2个字节。那么4532在内存里是怎么存放呢?
遵从,低低高高原则{:6_210:}
比如有 10个单元,12345678910   。
4532这个十六进制数,低2位,是32,就放在1单元,高2位是45,就放在2单元。


所以十六进制数4532,在机器看来就是3245


注意看红色标记的代码

00401023|.68 06000152   push    0x52010006
00401028|.68 03000000   push    0x3
0040102D|.BB D0104000   mov   ebx,004010D0
00401032|.E8 8E000000   call    004010C5
00401037|.83C4 28       add   esp,0x28
***
***
**
00401067|.BB D0104000   mov   ebx,004010D0
0040106C|.E8 54000000   call    004010C5
00401071|.83C4 28       add   esp,0x28
***
***
***            
004010BF   $FF25 F4784600 jmp   near dword ptr ds:               
004010C5   $FF25 D0784600 jmp   near dword ptr ds:


00401032|.E8 8E000000   call    004010C5   这个代码 E8 就是call的意思,但是E8后面的数,为啥和call后面不同


大家仔细观察00401032|.E8 8E000000   call    004010C5和004010C5   $FF25 D0784600 jmp   near dword ptr ds:
这2个代码, call 后面的是地址,也就是jmp命令所在的地址。换句话说,call就是打电话给jmp,让jmp继续去做剩下的事。
可是电脑是怎么知道,call 打给了jmp呢,不是打给其他人了呢?
大家计算一下,从00401032 到004010C5之间的距离:004010C5- 00401032= 93
call    004010C5这句代码,占了多少个字节呢?


**** Hidden Message *****




补充内容 (2018-7-18 20:02):
有人想学汇编,可以看王爽老师写的“汇编语言第2版”,连接如下:
链接: https://pan.baidu.com/s/131bhqPemNI14D3Ae5xTuiA 密码: 6666

muzi12134 发表于 2016-12-19 00:31

辛苦了! 看看隐藏的啥!

雪花公子 发表于 2016-12-19 06:13

感谢分享,这个很有用,支持楼主继续,最好做一个系列,会帮助很多小白的

klamathrun 发表于 2016-12-19 09:13


感谢分享,这个很有用,支持楼主继续!!!

千里冰封 发表于 2016-12-19 09:59

雪花公子 发表于 2016-12-19 06:13
感谢分享,这个很有用,支持楼主继续,最好做一个系列,会帮助很多小白的

谢谢支持,你说的对,我努力把帖子都写成固定格式的,做系列{:6_215:}

千里冰封 发表于 2016-12-19 10:01

klamathrun 发表于 2016-12-19 09:13
感谢分享,这个很有用,支持楼主继续!!!

谢谢支持{:5_116:}有帮助就好{:5_121:}

和天下 发表于 2016-12-25 10:35

精彩部分要动动手

星宝 发表于 2017-1-9 20:05

感谢分享,这个很有用,支持楼主继续!!!

apqy 发表于 2017-1-11 00:23

学习了,挺详细。谢谢

李逍遥hlc 发表于 2017-1-28 22:28

万分感谢楼主,简直是我等新手菜鸟的福音啊!!!
页: [1] 2 3 4 5 6
查看完整版本: 汇编小知识之【jmp+call】