能力值:
( 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还没用过。 不妨试试
能力值:
( 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)
能力值:
( LV2,RANK:10 )
4 楼
谢谢楼上的回复,但是我是新手,看的懂一半你所说的。
这是我的调用,请问哪里错了?
DWORD dBaseAddr = 0x00401050; __asm { pushad mov edi, dBaseAddr mov edi, [edi] call edi popad }
能力值:
( 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.
能力值:
( LV2,RANK:10 )
6 楼
对于两个文件地址应该变为 基地址:偏移地址
但我用的都是jmp 基地址:偏移地址 call还没用过。 不妨试试
能力值:
( 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,否则要自己处理对象构造,
分配足够的空间, 初始化成员(可用同样的办法直接调用其构造函数)
能力值:
( LV13,RANK:400 )
8 楼
this调用必须要ecx传参的
把this指针的值放在ecx中然后去call
能力值:
( LV2,RANK:10 )
9 楼
还是不懂,看来是我悟性不高或基础太差, 这个this指针怎么找?
能力值:
( LV2,RANK:10 )
10 楼
谢谢您的回复,我的dll已经注入到a.exe中了,调用a.exe中的函数还要计算吗?
能力值:
( 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 }
能力值:
( 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里随手写的,要是有问题你自己调试解决
你折腾这玩艺,莫非是弄挂?
能力值:
( 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肥兔写的
//如果楼主认为以上文字是垃圾,那么我也不知道它是谁写的
/////////////////////////////////