首页
社区
课程
招聘
[旧帖] 代码求助! 0.00雪花
发表于: 2013-6-1 13:32 6428

[旧帖] 代码求助! 0.00雪花

2013-6-1 13:32
6428
IDA反汇编出如下代码
size_t __fastcall GetKey(size_t result, void *a2)
{
  char v2; // r3@4
  void *dest; // [sp+0h] [bp-18h]@1
  const char *s; // [sp+4h] [bp-14h]@1
  signed int i; // [sp+Ch] [bp-Ch]@2

  s = (const char *)result;
  dest = a2;
  if ( result )
  {
    memcpy(a2, "opqrstuv", 9u);
    for ( i = 0; ; ++i )
    {
      result = strlen(s);
      v2 = 1;
      if ( (signed int)result <= i )
        v2 = 0;
      if ( !v2 )
        break;
      *((_BYTE *)dest + (i & 7)) ^= s[i];
    }
  }
  return result;
}

主要是这句*((_BYTE *)dest + (i & 7)) ^= s[i];不懂,谁能给解释下并且语句实现出来,谢谢!

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

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 28
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
dest 先转成 unsigned char 指针,然后加上 i&7 的值,然后取其地址的值与 s[i] 做异或再回写到这个地方。
2013-6-1 13:53
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=abutter;1183333]dest 先转成 unsigned char 指针,然后加上 i&7 的值,然后取其地址的值与 s[i] 做异或再回写到这个地方。[/QUOTE]

能写个代码吗?随便C或DELPHI或JAVA都成?谢谢!
2013-6-1 13:59
0
雪    币: 28
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
反汇编的就是 C 啊,只是变量多了一些而已。
2013-6-1 14:06
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
*((_BYTE *)dest + (i & 7)) ^= s[i];
就是这一句能写个代码吗?我的C实在是很烂,实在是感谢!
2013-6-1 14:44
0
雪    币: 28
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
本质上跟下面的代码一样:

_BYTE *mem = (_BYTE *)dest;
_BYTE value = mem[i & 7];
value = value ^ si[i];
mem[i &7] = value;
2013-6-1 15:14
0
雪    币: 276
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这里设个指针变量k 、 数值变量l
k=(_BYTE*)dest ; // [(_BYTE*)是强制转换,就是把dest变量强制转换为指向字节的指针变量]
l=(i&7); //其实就是保存i变量的低3位,其他位清零。*
*(k+l)=*(k+l)^s[i]; //*(k+l)是k变量的值(地址)+l的值,*()指向某一地址的内容。     *(k+l)就是(k+l)所对应的地址的内容与s[i]按位异或。再把这个值赋给给(k+l)地址内容
2013-6-1 15:18
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
多谢,我试试看!
2013-6-1 15:25
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
能帮我把整个函数写下吗?我这里还是有问题!
导入的头文件是什么?
_BYTE没定义呀?
2013-6-1 15:35
0
雪    币: 95
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
_BYTE等价于unsigned char,
在windef.h里有这一句:
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;


IDA翻译的时候是默认按VC的方式来翻译,但也有些差别。你自己适当的改一改程序,能编译过去就行。
2013-6-1 15:57
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢,唉,C没学过真觉得难!
2013-6-1 16:02
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谁能帮我完整的写下来整个函数呀,我还是编译不下去!
2013-6-1 16:12
0
雪    币: 276
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
能把你错误信息发下??我想知道啥错误?
2013-6-1 16:23
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
[Error] C:\Users\Administrator\Documents\C-Free\Projects\test2\main.cpp:28: error: cannot convert `unsigned char*' to `int*' in assignment
2013-6-1 16:40
0
雪    币: 276
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
强制类型转换错误,把等号右边的变量(_BYTE*)xxx ,【xxx是你的变量啊】
2013-6-1 20:50
0
雪    币: 276
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
可以加这个Q找我详谈,2627899764
2013-6-1 20:54
0
雪    币: 7
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
#include <string.h>
#include <stdio.h>

#define _BYTE  char

size_t __fastcall GetKey(size_t result, void *a2)
{
        char v2; // r3@4
        void *dest; // [sp+0h] [bp-18h]@1
        const char *s; // [sp+4h] [bp-14h]@1
        signed int i; // [sp+Ch] [bp-Ch]@2
       
        s = (const char *)result;
        dest = a2;
        if ( result )
        {
                memcpy(a2, "opqrstuv", 9u);
                for ( i = 0; ; ++i )
                {
                        result = strlen(s);
                        v2 = 1;
                        if ( (signed int)result <= i )
                                v2 = 0;
                        if ( !v2 )
                                break;
                        *((_BYTE *)dest + (i & 7)) ^= s[i];
                }
        }
        return result;
}

void dispbuf(unsigned char *buf, unsigned int bytecount)
{
        while(bytecount--)
        {
                printf("%02X ", *buf++);
        }
        printf("\n");
}

void main(void)
{
        char s[] = "abcdefghijklmnopqrstuvwxyz";
        char d[9]={0};

        GetKey((int)s,d);

        // 8是 opqrstuv 字符串的长度
        dispbuf(d, 8);

}
2013-6-2 00:45
0
雪    币: 7
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
GetKey 的功能:
Result 输入一个字符串,用这个字符串的
第0,8,16...  个字符依次异或 "opqrstuv" 的 o
第1,9,17...  个字符依次异或 "opqrstuv" 的 p
第2,10,18...个字符依次异或 "opqrstuv" 的 q
第3,11,19...个字符依次异或 "opqrstuv" 的 r
第4,12,20...个字符依次异或 "opqrstuv" 的 s
第5,13,21...个字符依次异或 "opqrstuv" 的 t
第6,14,22...个字符依次异或 "opqrstuv" 的 u
第7,15,23...个字符依次异或 "opqrstuv" 的 v

异或的结果写到a2指向的缓冲区

*((_BYTE *)dest + (i & 7)) ^= s[i];
改写:
{
    char *p;
    p = (char *)dest;               
    p[i % 8] = p[i % 8]  ^ s[i]; // c 的写法是 p[i % 8]  ^= s[i];
}

上面的 i & 7 即 i % 8 ,就是 i 取余 8
2013-6-2 01:03
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
十分感谢!!!!
这下可以运行了,结果也完全正确!
2013-6-2 01:18
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
真的很感谢!!!!!!!!!!!!!!!!!!!!!!!!!111
2013-6-2 01:24
0
游客
登录 | 注册 方可回帖
返回
//