首页
社区
课程
招聘
[求助]麻烦帮忙大大看一下一个函数的IDA的静态代码,有些不太懂。
发表于: 2018-10-28 23:58 3694

[求助]麻烦帮忙大大看一下一个函数的IDA的静态代码,有些不太懂。

2018-10-28 23:58
3694
用IDA反汇编的一个小函数。应该比较简单,但我是一个小菜鸟,没接触过逆向。只是现在有个小需求,用IDA看了一下,麻烦帮忙分析,以C或者C#,JAVA等高级语言还原一下,感谢大大们。
IDA
int __fastcall getHashCode(const char *a1, int a2)
{
  const char *v2; // r5
  int v3; // r4
  size_t v4; // r0
  int v5; // r3
  int v6; // r1
  int v7; // r2
  signed int v8; // r4
  int v9; // r6

  v2 = a1;
  v3 = a2;
  sub_500DF4();
  v4 = strlen(v2);
  v5 = 2146271213;
  v6 = v3 << 8;
  v7 = 0;
  v8 = -286331154;
  while ( v7 != v4 )
  {
    v9 = v2[v7++];
    v5 = (v8 + v5) ^ dword_B14070[v9 + v6]; // 这个 dword_B14070[v9 + v6]看不懂, dword_B14070是数组地址吗?
    v8 += 3 + 32 * v8 + v9 + v5;
  }
  return v5;
}
我自己用C#写的,不知道对不对,对
        static int GetHashcode(string name,int num)
        {
            char[] hashchar = name.ToArray();
            int v5 = 2146271213;
            int v8 = -286331154;
            int v6 = num << 8;
            for (int i = 0; i < hashchar.Length; i++)
            {
                v5 = (v8 + v5) ^ (hashchar[i] + v6); // 这个dword_B14070[v9 + v6]看不懂,dword_B14070是数组地址吗?这里该如何写
                v8 += 3 + 32 * v8 + hashchar[i] + v5;
            }
            return v5;
        }

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没人帮忙一下吗,希望有人帮忙一下,帮我将这段伪代码翻译成C++代码
2018-10-29 23:51
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
3
dword_B14070是全局数组
2018-10-30 02:46
0
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
非常感谢,我大概弄懂了这个函数的逻辑。dword_B14070是个全局数组,大小为为1086字节,调用sub_500DF4()对这个数组初始化。
void sub_500DF4()
{
  int v0; // r4
  unsigned int v1; // r1
  int v2; // r5
  unsigned int v3; // r1
  unsigned int v4; // r7
  int v5; // r5

  v0 = (unsigned __int8)byte_B15470;
  if ( !byte_B15470 )
  {
    v1 = 1048577;
    do
    {
      v2 = 0;
      do
      {
        v3 = (125 * v1 + 3) % 0x2AAAAB;
        v4 = v3;
        v1 = (125 * v3 + 3) % 0x2AAAAB;
        *(_DWORD *)((char *)dword_B14070 + v0 + v2) = (unsigned __int16)v1 | (v4 << 16);
        v2 += 1024;
      }
      while ( v2 != 5120 );
      v0 += 4;
    }
    while ( v0 != 1024 );
    byte_B15470 = 1;
    v5 = dword_AF9F1C;
    dword_AF9F1C = getHashCode("xyqpocket", 1u) ^ v5;
  }
}
跳转到byte_B15470(是不是偏移地址b15470处)里IDA是个%1,这个是什么意思。跳转到dword_b14070,内容是这样的
bss:00B14070 ; _DWORD dword_B14070[1086]
.bss:00B14070 dword_B14070    % 0x10F8                ; DATA XREF: getHashCode(char const*,uint)+14↑o
.bss:00B14070                                         ; .text:off_500DF0↑o ...

这个%1和% 0x10F8 是什么意思。
2018-10-30 11:36
0
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
holing dword_B14070是全局数组
对于fastcall的so库里函数,可以编程直接调用吗。如果可以,我不需要自己翻译这个伪代码,直接调用so库里的这个函数就可以了。但在网上找来找去,没发现fastcall调用约定的方法函数的动态库怎么调用。
2018-10-30 11:39
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
huangxubang 对于fastcall的so库里函数,可以编程直接调用吗。如果可以,我不需要自己翻译这个伪代码,直接调用so库里的这个函数就可以了。但在网上找来找去,没发现fastcall调用约定的方法函数的动态库怎么 ...
处理器架构一致就可以直接调用,不一致需要用模拟器,看你发的应该是ARM架构的代码吧,如果你要在x86的cpu上调用你需要找个支持跑arm代码的模拟器
最后于 2018-10-30 12:47 被hzqst编辑 ,原因:
2018-10-30 12:46
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
7
huangxubang 对于fastcall的so库里函数,可以编程直接调用吗。如果可以,我不需要自己翻译这个伪代码,直接调用so库里的这个函数就可以了。但在网上找来找去,没发现fastcall调用约定的方法函数的动态库怎么 ...
直接用应该可以,一般默认都是fastcall,实在不行自己写个嵌入式汇编封装一下。
2018-11-7 02:06
0
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢。好久没来看雪了,忘了说,问题已经解决了。
2018-12-22 09:01
0
游客
登录 | 注册 方可回帖
返回
//