首页
社区
课程
招聘
[旧帖] call $+5是啥意思? 0.00雪花
发表于: 2011-1-12 10:24 12384

[旧帖] call $+5是啥意思? 0.00雪花

2011-1-12 10:24
12384
遇到一个汇编的基本问题, 基本功不太扎实, 网上一时又没找到答案, 请教一下坛子里的高人.
下面的call $+5 是啥意思?

.text:10062440 sub_10062440    proc near
.text:10062440
.text:10062440 var_14          = dword ptr -14h
.text:10062440 arg_0           = dword ptr  4
.text:10062440 arg_4           = dword ptr  8
.text:10062440 arg_8           = dword ptr  0Ch
.text:10062440
.text:10062440                 push    ebp
.text:10062441                 push    ebx
.text:10062442                 push    esi
.text:10062443                 push    edi
.text:10062444                 mov     esi, [esp+10h+arg_0]
.text:10062448                 mov     edi, [esp+10h+arg_8]
.text:1006244C                 mov     eax, esp
.text:1006244E                 sub     esp, 18h
.text:10062454                 and     esp, 0FFFFFFC0h
.text:1006245A                 add     esp, 4
.text:10062460                 mov     [esp+24h+var_14], eax
.text:10062464                 call    $+5
.text:10062469                 pop     ebp
.text:1006246A                 lea     ebp, [ebp-869h]
.text:10062470                 mov     eax, [esi]
.text:10062472                 mov     ebx, [esi+4]
.text:10062475                 mov     ecx, [esi+8]
.text:10062478                 mov     edx, [esi+0Ch]
.text:1006247B                 call    sub_10061980
.text:10062480                 mov     esp, [esp+24h+var_14]
.text:10062484                 mov     esi, [esp+10h+arg_4]
.text:10062488                 mov     [esi], eax
.text:1006248A                 mov     [esi+4], ebx
.text:1006248D                 mov     [esi+8], ecx
.text:10062490                 mov     [esi+0Ch], edx
.text:10062493                 pop     edi
.text:10062494                 pop     esi
.text:10062495                 pop     ebx
.text:10062496                 pop     ebp
.text:10062497                 retn
.text:10062497 sub_10062440    endp

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (28)
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
$+5  代表本行汇编代码地址偏移5的位置

.text:10062464                 call    $+5
.text:10062469                 pop     ebp

其实就是 call 10062469
2011-1-12 10:26
0
雪    币: 64
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
$+5当然是一个函数名或者是一个地址,或是一个功能模块的代号!
2011-1-12 10:28
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不要误人子弟。
2011-1-12 10:45
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
5
1 楼正解。。
2011-1-12 10:58
0
雪    币: 92
活跃值: (154)
能力值: ( LV8,RANK:135 )
在线值:
发帖
回帖
粉丝
6
这个是一个地址,
2011-1-12 11:00
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
刚好5字节 一楼正解
2011-1-12 11:19
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个还真不知道啥意思~
2011-1-12 11:24
0
雪    币: 148
活跃值: (25)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
那这种call也是会正常返回的吧. 是不是call完了会回到 .text:10062469                 pop     ebp 继续执行呢?  这么说是不是意味着 .text:10062469                 pop     ebp后面的代码在这个例子中就会执行到两次?

为啥要这么弄呢, 直接把 .text:10062469                 pop     ebp后的东西弄个函数不好吗?
2011-1-12 13:49
0
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10

.text:10062460 mov [esp+24h+var_14], eax
.text:10062464 call $+5
.text:10062469 pop ebp
.text:1006246A lea ebp, [ebp-869h]

结合这段代码,LZ可以把.text:10062464    call    $+5     .text:10062469   pop     ebp 这两句连起来看做一句这样的代码mov ebp,0x10062469,就当call不存在

为什么是这样的呢? 我们来分析一下就知道了
call $+5 即 call .text:10062469
那么这时候call .text:10062469  做了什么呢? call指令做了两个操作,把下一条指令地址压入栈,即保存返回地址,此时栈顶为10062469,第二操作跳转到目标地址,即跳转到 .text:10062469   pop     ebp
这样一来不就是把10062469这些值传给了ebp吗?
什么Call了函数,返回都是通过栈的实现的,这时候把栈搞清楚了就好,不要认为call就一定要是一个子函数

这样做一般是一些花指令什么的用的比较多吧

其实我们自己写可以写这样的程序调试一下,可能有些朋友内联汇编用的比较少,或者 $ 符号没怎么用,不太熟悉,看看花指令方面的资料,这个 $ 出现的很多的
#include<Windows.h>
#include<tchar.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd)
{
	int iValue=1;
	char buf[256]={0};
	__asm
	{
		call $+5
		pop eax
		mov eax,1
		add iValue,eax
	}
	
	wsprintfA(buf,"iValue:%d",iValue);
	MessageBoxA(NULL,buf,"Demo",MB_OK);

	return 0;
}

text:004113C0 000                 push    ebp
.text:004113C1 004                 mov     ebp, esp
.text:004113C3 004                 sub     esp, 1D8h
.text:004113C9 1DC                 push    ebx
.text:004113CA 1E0                 push    esi
.text:004113CB 1E4                 push    edi
.text:004113CC 1E8                 lea     edi, [ebp+var_1D8]
.text:004113D2 1E8                 mov     ecx, 76h
.text:004113D7 1E8                 mov     eax, 0CCCCCCCCh
.text:004113DC 1E8                 rep stosd
.text:004113DE 1E8                 mov     eax, dword_417000
.text:004113E3 1E8                 xor     eax, ebp
.text:004113E5 1E8                 mov     [ebp+var_4], eax
.text:004113E8 1E8                 mov     [ebp+var_C], 1
.text:004113EF 1E8                 mov     [ebp+Text], 0
.text:004113F6 1E8                 push    0FFh            ; Size
.text:004113FB 1EC                 push    0               ; Val
.text:004113FD 1F0                 lea     eax, [ebp+Dst]
.text:00411403 1F0                 push    eax             ; Dst
.text:00411404 1F4                 call    j_memset
[COLOR="Red"].text:00411409 1F4                 add     esp, 0Ch
.text:0041140C 1E8                 call    $+5
.text:00411411 1EC                 pop     eax
.text:00411412 1E8                 mov     eax, 1
.text:00411417 1E8                 add     [ebp+var_C], eax
.text:0041141A 1E8                 mov     esi, esp
.text:0041141C 1E8                 mov     eax, [ebp+var_C]
.text:0041141F 1E8                 push    eax
.text:00411420 1EC                 push    offset lpStrIvalueD ; LPCSTR
.text:00411425 1F0                 lea     ecx, [ebp+Text]
.text:0041142B 1F0                 push    ecx             ; LPSTR
.text:0041142C 1F4                 call    ds:wsprintfA
.text:00411432 1F4                 add     esp, 0Ch
.text:00411435 1E8                 cmp     esi, esp
.text:00411437 1E8                 call    sub_41114A
.text:0041143C 1E8                 mov     esi, esp
.text:0041143E 1E8                 push    0               ; uType
.text:00411440 1EC                 push    offset Caption  ; lpCaption
.text:00411445 1F0                 lea     eax, [ebp+Text]
.text:0041144B 1F0                 push    eax             ; lpText
.text:0041144C 1F4                 push    0               ; hWnd
.text:0041144E 1F8                 call    ds:MessageBoxA
.text:00411454 1E8                 cmp     esi, esp
.text:00411456 1E8                 call    sub_41114A
.text:0041145B 1E8                 xor     eax, eax
.text:0041145D 1E8                 push    edx
.text:0041145E 1EC                 mov     ecx, ebp
.text:00411460 1EC                 push    eax
.text:00411461 1F0                 lea     edx, dword_411490
.text:00411467 1F0                 call    sub_41108C
.text:0041146C 1F0                 pop     eax
.text:0041146D 1EC                 pop     edx
.text:0041146E 1E8                 pop     edi
.text:0041146F 1E4                 pop     esi
.text:00411470 1E0                 pop     ebx
.text:00411471 1DC                 mov     ecx, [ebp+var_4]
.text:00411474 1DC                 xor     ecx, ebp
.text:00411476 1DC                 call    sub_411019
.text:0041147B 1DC                 add     esp, 1D8h
.text:00411481 004                 cmp     ebp, esp
.text:00411483 004                 call    sub_41114A
.text:00411488 004                 mov     esp, ebp
.text:0041148A 004                 pop     ebp
.text:0041148B 000                 retn    10h
.text:0041148B     sub_4113C0      endp
2011-1-12 15:46
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
$代表当前地址
汇编器在编译时维护了一个地址计数器,$可以看成是这个计数器得值
2011-1-12 16:06
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个只是利用call指令的本质,并不是说这就是一个函数调用。这个是动态获取指令地址的方法,楼主可以找一下病毒重定位的介绍,通常就是用这种方法。
2011-1-12 16:16
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
讲的比较明白
2011-1-12 16:59
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
一句话,$在汇编里面代表本行的地址,$+5就是下条指令的地址(本行CALL指令占5个字节)!
2011-1-12 17:48
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
总结一下:
1)call 的本质作用是将ip压栈,然后jmp  ,ret的本质作用是pop栈到ip;call和ret是为函数准备的命令,但它们的功能是分离的,都可以单独使用。
2)$代表当前的地址,而IP寄存器又不能直接操作,所以使用 call $+5   pop eax这样的指令将当前地址传给eax。
2011-1-13 10:14
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
我记得Themida里面这样的代码很多
2011-1-13 16:03
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
说它是花没什么问题,但是我更倾向这是一种编程技巧 如同前面网友说的,获得eip值的途径。当然目的通常不是想获得eip,而是以这个eip为索引来找一个delta值处的东西
2011-1-13 16:08
0
雪    币: 64
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我告诉他的是call的本质,我并不是告诉他$+5具体是什么!

我文告诉他的是解题方法,而不是具体答案!

难不成你们所所有人回答的都超出了我回答的范围吗!

授人以渔,而非授人以鱼。

好了我们不要讨论这个,我们不是一个级别。

不明白的话好好学,找个顶级高手去拜师!
2011-2-1 10:30
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
19
call的本质是什么?
2011-2-3 23:04
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
call $+5
pop eax


是个常见的stub,等价于 eax = eip;
一般封装为 inline函数,用于取得当前eip
2011-2-5 12:36
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
当前地址加5
2011-2-5 13:37
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
22
上传的附件:
  • 1.jpg (19.28kb,73次下载)
2011-2-5 13:44
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
23
囧rz
....
2011-2-5 22:14
0
雪    币: 277
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
囧rz
....
2011-2-5 23:08
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
对,下一条指令的地址
2011-2-6 08:45
0
游客
登录 | 注册 方可回帖
返回
//