能力值:
( LV2,RANK:10 )
2 楼
dest 先转成 unsigned char 指针,然后加上 i&7 的值,然后取其地址的值与 s[i] 做异或再回写到这个地方。
能力值:
( LV2,RANK:10 )
3 楼
[QUOTE=abutter;1183333]dest 先转成 unsigned char 指针,然后加上 i&7 的值,然后取其地址的值与 s[i] 做异或再回写到这个地方。[/QUOTE]
能写个代码吗?随便C或DELPHI或JAVA都成?谢谢!
能力值:
( LV2,RANK:10 )
4 楼
反汇编的就是 C 啊,只是变量多了一些而已。
能力值:
( LV2,RANK:10 )
5 楼
*((_BYTE *)dest + (i & 7)) ^= s[i];
就是这一句能写个代码吗?我的C实在是很烂,实在是感谢!
能力值:
( LV2,RANK:10 )
6 楼
本质上跟下面的代码一样:
_BYTE *mem = (_BYTE *)dest;
_BYTE value = mem[i & 7];
value = value ^ si[i];
mem[i &7] = value;
能力值:
( 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)地址内容
能力值:
( LV2,RANK:10 )
8 楼
多谢,我试试看!
能力值:
( LV2,RANK:10 )
9 楼
能帮我把整个函数写下吗?我这里还是有问题!
导入的头文件是什么?
_BYTE没定义呀?
能力值:
( 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的方式来翻译,但也有些差别。你自己适当的改一改程序,能编译过去就行。
能力值:
( LV2,RANK:10 )
11 楼
谢谢,唉,C没学过真觉得难!
能力值:
( LV2,RANK:10 )
12 楼
谁能帮我完整的写下来整个函数呀,我还是编译不下去!
能力值:
( LV3,RANK:20 )
13 楼
能把你错误信息发下??我想知道啥错误?
能力值:
( 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
能力值:
( LV3,RANK:20 )
15 楼
强制类型转换错误,把等号右边的变量(_BYTE*)xxx ,【xxx是你的变量啊】
能力值:
( LV3,RANK:20 )
16 楼
可以加这个Q找我详谈,2627899764
能力值:
( 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);
}
能力值:
( 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
能力值:
( LV2,RANK:10 )
19 楼
十分感谢!!!!
这下可以运行了,结果也完全正确!
能力值:
( LV2,RANK:10 )
20 楼
真的很感谢!!!!!!!!!!!!!!!!!!!!!!!!!111