首页
社区
课程
招聘
求助一个call,如何调用。
发表于: 2013-4-11 16:03 5986

求助一个call,如何调用。

2013-4-11 16:03
5986
汇编代码如下:
00401CD0 >/> \55            push    ebp
00401CD1  |.  8BEC          mov     ebp, esp
00401CD3  |.  83EC 44       sub     esp, 44
00401CD6  |.  53            push    ebx
00401CD7  |.  56            push    esi
00401CD8  |.  57            push    edi
00401CD9  |.  51            push    ecx
00401CDA  |.  8D7D BC       lea     edi, dword ptr [ebp-44]
00401CDD  |.  B9 11000000   mov     ecx, 11
00401CE2  |.  B8 CCCCCCCC   mov     eax, CCCCCCCC
00401CE7  |.  F3:AB         rep     stos dword ptr es:[edi]
00401CE9  |.  59            pop     ecx
00401CEA  |.  894D FC       mov     dword ptr [ebp-4], ecx
00401CED  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
00401CF0  |.  E8 5BF3FFFF   call    00401050
00401CF5  |.  5F            pop     edi
00401CF6  |.  5E            pop     esi
00401CF7  |.  5B            pop     ebx
00401CF8  |.  83C4 44       add     esp, 44
00401CFB  |.  3BEC          cmp     ebp, esp
00401CFD  |.  E8 62030000   call    _chkesp                          ;  jmp to MSVCRTD._chkesp
00401D02  |.  8BE5          mov     esp, ebp
00401D04  |.  5D            pop     ebp
00401D05  \.  C3            retn




调用的是这个call:  00401CF0  |.  E8 5BF3FFFF   call    00401050

我是用VC6.0,想练练手,谢谢各位了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 24
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
call 指令与jmp 相似,区别是调用call指令会将当前的IP或 cs和IP压入栈。之后转移。
call一般会与ret*  指令一起使用。
此代码执行到call    00401050  时,(未考虑cs)将当前的IP (00401CF0)压入栈,   另IP=00401050执行其后面的代码。  一般遇到ret* (retf,retn......)指令再跳转回来,将栈顶的值(00401CF0) 取出赋值给IP。
call 类似于c语言中的({})大括号,在程序里一般会与ret*成对出现。可嵌套。

对于两个文件地址应该变为    基地址:偏移地址  
但我用的都是jmp  基地址:偏移地址  call还没用过。  不妨试试
2013-4-11 16:41
0
雪    币: 496
活跃值: (301)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
3
这是一个this调用
只需要传入一个对象的指针

但是你要分析这个对象的内存结构布局。

00401CEA  |.  894D FC       mov     dword ptr [ebp-4], ecx
00401CED  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
00401CF0  |.  E8 5BF3FFFF   call    00401050


对应C
local_var = pObject;
sub_00401050(pObject)
2013-4-11 16:46
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的回复,但是我是新手,看的懂一半你所说的。
这是我的调用,请问哪里错了?

DWORD dBaseAddr = 0x00401050;
__asm
{
pushad
mov edi, dBaseAddr
mov edi, [edi]
call edi
popad
}
2013-4-11 16:47
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

00401D20 >/> \55 push ebp
00401D21 |. 8BEC mov ebp, esp
00401D23 |. 83EC 44 sub esp, 44
00401D26 |. 53 push ebx
00401D27 |. 56 push esi
00401D28 |. 57 push edi
00401D29 |. 51 push ecx
00401D2A |. 8D7D BC lea edi, dword ptr [ebp-44]
00401D2D |. B9 11000000 mov ecx, 11
00401D32 |. B8 CCCCCCCC mov eax, CCCCCCCC
00401D37 |. F3:AB rep stos dword ptr es:[edi]
00401D39 |. 59 pop ecx
00401D3A |. 894D FC mov dword ptr [ebp-4], ecx
00401D3D |. 6A 02 push 2
00401D3F |. 8B4D FC mov ecx, dword ptr [ebp-4]
00401D42 |. E8 4FF3FFFF call 00401096
00401D47 |. 5F pop edi
00401D48 |. 5E pop esi
00401D49 |. 5B pop ebx
00401D4A |. 83C4 44 add esp, 44
00401D4D |. 3BEC cmp ebp, esp
00401D4F |. E8 10030000 call _chkesp ; jmp to MSVCRTD._chkesp
00401D54 |. 8BE5 mov esp, ebp
00401D56 |. 5D pop ebp
00401D57 \. C3 retn




----------------------
00401CF0  |.  E8 5BF3FFFF   call    00401050  里面的内容如上面的代码, 先说一下,这个东西是我写的,主要是想学习下怎么找call和调call.

用VC写的对话框 A.exe,点一下按按,调用一个函数,传了个 int型值为 2的 参数,然后就赋值 给对话框上面的编辑框。

我用另一个对话框 b.exe,调用远程c.dll,注入到a.ese里面。然后想调用这个call.

b.exe,和c.dll已经写完了,可以注入a.exe,但不知如何调用这个call.
2013-4-11 16:53
0
雪    币: 24
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
对于两个文件地址应该变为    基地址:偏移地址  
但我用的都是jmp  基地址:偏移地址  call还没用过。  不妨试试
2013-4-11 17:33
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
1. 调用代码在DLL内,但DLL的加载地址可变,所以不要用CALL (E8)指令,用类似:
_asm {
  mov eax, 0x00401050
  jmp eax
}

或者
_asm {
    push 0x00401050
    ret
}
的方式.

如果非要用CALL,应根据DLL加载基址动态计算E8指令的操作数

2. 3楼说的对,这看起来象是OOP的,ECX= this指针, 既然是你自己的代码,
    你可以定义一个正确的对象并将其地址赋给ECX,否则要自己处理对象构造,
   分配足够的空间, 初始化成员(可用同样的办法直接调用其构造函数)
2013-4-11 18:40
0
雪    币: 496
活跃值: (301)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
8
this调用必须要ecx传参的

把this指针的值放在ecx中然后去call
2013-4-11 19:38
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还是不懂,看来是我悟性不高或基础太差, 这个this指针怎么找?
2013-4-12 09:15
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢您的回复,我的dll已经注入到a.exe中了,调用a.exe中的函数还要计算吗?
2013-4-12 09:31
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
00401D20 push ebp
00401D21 mov ebp,esp
00401D23 sub esp,44h
00401D26 push ebx
00401D27 push esi
00401D28 push edi
00401D29 push ecx
00401D2A lea edi,[ebp-44h]
00401D2D mov ecx,11h
00401D32 mov eax,0CCCCCCCCh
00401D37 rep stos dword ptr [edi]
00401D39 pop ecx
00401D3A mov dword ptr [ebp-4],ecx
191: onCall(2);
00401D3D push 2
00401D3F mov ecx,dword ptr [ebp-4]
00401D42 call @ILT+145(CCTestDlgDlg::onCall) (00401096)
192: }
00401D47 pop edi
00401D48 pop esi
00401D49 pop ebx
00401D4A add esp,44h
00401D4D cmp ebp,esp
00401D4F call _chkesp (00402064)
00401D54 mov esp,ebp
00401D56 pop ebp
00401D57 ret


针对上面这段代码,我使用如下代码进行调用, 发现程序不会崩溃,但也没任何反应,不解。

DWORD dBaseAddr = 0x00401096;
//DWORD dStr = 0x00401d20;

__asm
{
push ebp
mov ebp,esp
pop ecx
mov [ebp-4], ecx
push 2
mov ecx, [ebp-4]
call dBaseAddr
}
2013-4-12 11:17
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
1) 若用MOV REG/JMP REG 或 PUSH IMM32/RET的方式, 不需要计算
   你写成CALL,就需要处理, CALL指令(E8)真正调用到的地址= CALL的下一条指令地址 + 操作数
   你那几句用CALL指令的代码,  只有在你注入的DLL加载到PE头里ImageBase的情况下,才能调用到正确地址

2) 那几句汇编写得纠结:

    this = ECX = EBP, 根本就是个无效值
  进入401D20时, ECX就是正确的this指针,  原代码PUSH/POP ECX,是要用ECX作计数器写那些CC,
   你把ECX弄坏了, 至于没崩溃是你人品好.

  你可以跟下原程序.看看ECX哪里来的, 如果是new出来的,如何去获取也是个问题.

  如果你仅仅是想看看能否调用到目的函数,可以:

  CCTestDlgDlg test;   //看你自己的src,该如何构造,是否需要参数
                     //如何初始化对象,MFC的东西我忘完了
  CCTestDlgDlg *thisPtr = &test;
  _asm {
     pushad
     call $+5
     pop  ecx
     add ecx, 16h      //ECX=返回地址,+0x16 -> RetAddr
     push 2               //原参数
   push  ecx           //返回地址
   mov  ecx, dword ptr [thisPtr]
     push 00401096h
     ret

  RetAddr:             //返回这里
     popad  
}

在OD里随手写的,要是有问题你自己调试解决

你折腾这玩艺,莫非是弄挂?
2013-4-12 18:51
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
00401CEA  |.  894D FC       mov     dword ptr [ebp-4], ecx
00401CED  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
00401CF0  |.  E8 5BF3FFFF   call    00401050

如果只从这段代码看的话,几乎可以肯定是跟类有关系,exc里面就是this指针,但是call    00401050不是虚函数调用,个人感觉是有一个类(非虚)其中第一个成员是一个类对象,这里的call应该跟此对象有关
这么看吧:
class a
{
   //some funcs
   void fun1(class b& obj_b);
public:
    class b   m_b;

}

///
this->fun1(this->m_b);

///////////////////////////////
//如果以上文字对楼主有用,那么它是cpp肥兔写的
//如果楼主认为以上文字是垃圾,那么我也不知道它是谁写的
/////////////////////////////////
2013-4-13 16:10
0
游客
登录 | 注册 方可回帖
返回
//