首页
社区
课程
招聘
[旧帖] 一个函数的参数问题 0.00雪花
发表于: 2012-10-24 21:17 2709

[旧帖] 一个函数的参数问题 0.00雪花

2012-10-24 21:17
2709
0045D530 >/$  BF 01000000   mov edi,1
0045D535  |.  68 665E5300   push A.00535E66
0045D53A  |.  68 555E5300   push A.00535E55               
0045D53F  |.  BE 11000000   mov esi,11
0045D544  |.  41            inc ecx
0045D545  |.  E8 D1880D00   call A.00535E1B
0045D54A  |.  90            nop
0045D54B  |.  90            nop

下面是call A.00535E1B 的汇编代码

00535E1B  /$  8B5424 04     mov edx,dword ptr ss:[esp+4]
00535E1F  |.  57            push edi
00535E20  |.  8B7C24 0C     mov edi,dword ptr ss:[esp+C]
00535E24  |.  3BD7          cmp edx,edi
00535E26  |.  73 26         jnb short A.00535E4E
00535E28  |.  56            push esi
00535E29  |.  8BFF          mov edi,edi
00535E2B  |>  8A02          /mov al,byte ptr ds:[edx]
00535E2D  |.  3201          |xor al,byte ptr ds:[ecx]
00535E2F  |.  66:0FB671 01  |movzx si,byte ptr ds:[ecx+1]
00535E34  |.  0FB6C0        |movzx eax,al
00535E37  |.  66:8931       |mov word ptr ds:[ecx],si
00535E3A  |.  66:3E:8B0445 >|mov ax,word ptr ds:[eax*2+535C10]
00535E43  |.  66:33C6       |xor ax,si
00535E46  |.  42            |inc edx
00535E47  |.  66:8901       |mov word ptr ds:[ecx],ax
00535E4A  |.  3BD7          |cmp edx,edi
00535E4C  |.^ 72 DD         \jb short A.00535E2B
00535E4E  |>  5E            pop esi
00535E4F  |.  5F            pop edi
00535E50  \.  C2 0800       retn 8

从汇编来看,call 00535E1B 有两个参数(前面不是有两个push吗),  但是为什么用IDA  F5后,函数变成三个参数呢。 求解释一下,小弟对c语言不是很懂。下面是IDA F5之后的call 00535E1B代码

__int16 __thiscall sub_535E1B(int this, unsigned int a2, unsigned int a3)
{
  unsigned int i; // edx@1
  __int16 v4; // si@2
  int v5; // eax@2
  __int16 result; // ax@2

  for ( i = a2; i < a3; *(_WORD *)this = result )
  {
    v4 = *(_BYTE *)(this + 1);
    v5 = (unsigned __int8)(*(_BYTE *)this ^ *(_BYTE *)i);
    *(_WORD *)this = v4;
    result = v4 ^ word_535C10[v5];
    ++i;
  }
  return result;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 248
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
F5党。。。养懒人
2012-10-24 21:24
0
雪    币: 6728
活跃值: (3897)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还有一个参数是ecx, ecx作为参数传参的话, 有可能是fastcall调用方式(前两个参数是ecx和edx), 也有可能是thiscall,c++类里的this指针(用ecx), 很显然这里有三个参数, fastcall的话, 应该就是ecx和edx作为前两个参数, 所以不是fastcall, 可能就是thiscall了, 注意不是绝对的, 如果还明白的话, 再看看关于调用约定的文章
2012-10-24 23:07
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
__thiscall  __fastcall 查一下调用约定,便于你理解
2012-10-25 10:30
0
雪    币: 506
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
类的的成员函数,类指针算是它的第一个参数。
2012-10-25 11:11
0
游客
登录 | 注册 方可回帖
返回
//