首页
社区
课程
招聘
[旧帖] [求助]关于在汇编程序中调用函数时参数的问题 0.00雪花
发表于: 2008-2-23 18:32 4345

[旧帖] [求助]关于在汇编程序中调用函数时参数的问题 0.00雪花

2008-2-23 18:32
4345
在汇编中比如在调用creatfilesA函数时,我怎么知道这个函数所需的参数应该放在哪个寄存器中?它的返回值又放在哪个寄存器中?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
HANDLE CreateFile(
  LPCTSTR lpFileName,                         // file name
  DWORD dwDesiredAccess,                      // access mode
  DWORD dwShareMode,                          // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
  DWORD dwCreationDisposition,                // how to create
  DWORD dwFlagsAndAttributes,                 // file attributes
  HANDLE hTemplateFile                        // handle to template file
);

Return Values
If the function succeeds, the return value is an open handle to the specified file. If the specified file exists before the function call and dwCreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS (even though the function has succeeded). If the file does not exist before the call, GetLastError returns zero.

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError


API好像是用堆栈来传参数的,返回值要么在Eax里,要么在参数中。。
汇编中可以Invoke来调用API,你把参数写在后面就行了,不用你亲自压栈
2008-2-23 18:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
3
如果是MSDN的话我也会看,但是现在我用的是汇编不是C,比如有一个汇编下感染EXE文件的程序,其中调用_CreateFileA时lpFileName是放在ESI中的!MSDN什么时候说有ESI了?
2008-2-23 19:00
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
CreateFileA肯定不会到Esi中取参数,他只知道到堆栈中去取。。。。
或许你会在esi中看到FileName,但那说明不了他会取esi做参数。。
在Call CreateFileA之前,你肯定能看见入栈操作。。。

btw:你谈的不是64位的汇编吧,那我可是一窍不通。
2008-2-23 19:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
5
OpenFile proc
    xor eax,eax
    push eax
    push eax
    push 00000003h
    push eax
    inc eax
    push eax
    push 80000000h or 40000000h
    push esi
    call _CreateFileA
    ret
OpenFile endp
2008-2-23 19:21
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
6
我想你的理解是:
push esi
call _CreateFileA
 
这足以代表 CreateFileA 是以esi为其中一个参数的。

实际上不是这样的,push esi 仅仅代表着把esi入栈,这和call _CreateFileA可以说没有任何必然的关系。些时的esi可以换成任意寄存器或内存地址,只要这个寄存器或内存地址是指向文件名的指针即可。

下面是CreateFileA的代码,你可以清楚的看见他是如何取参数的:

7C801A24 >  8BFF            mov     edi, edi                         ; ntdll.7C930738
7C801A26    55              push    ebp
7C801A27    8BEC            mov     ebp, esp
7C801A29    FF75 08         push    dword ptr [ebp+8]
7C801A2C    E8 43C60000     call    7C80E074
7C801A31    85C0            test    eax, eax
7C801A33    74 1E           je      short 7C801A53
7C801A35    FF75 20         push    dword ptr [ebp+20]
7C801A38    FF75 1C         push    dword ptr [ebp+1C]
7C801A3B    FF75 18         push    dword ptr [ebp+18]
7C801A3E    FF75 14         push    dword ptr [ebp+14]
7C801A41    FF75 10         push    dword ptr [ebp+10]
7C801A44    FF75 0C         push    dword ptr [ebp+C]
7C801A47    FF70 04         push    dword ptr [eax+4]
7C801A4A    E8 11ED0000     call    CreateFileW
7C801A4F    5D              pop     ebp
7C801A50    C2 1C00         retn    1C
7C801A53    83C8 FF         or      eax, FFFFFFFF
7C801A56  ^ EB F7           jmp     short 7C801A4F


他引用参数时用的是[ebp+XX],这显然是在堆栈中取参数,而不是你说某个寄存器。
2008-2-23 19:38
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
........................................................参数楼上已经些了

返回值自己看下对应汇编代码就知道了。。自己在VS环境下点下汇编。就彻底明白了。
2008-2-23 19:45
0
游客
登录 | 注册 方可回帖
返回
//