首先查个壳,发现没壳,是32bit,那就丢进ida32中进行反编译进入main函数查看,里面有很多个函数,挨个点进去看看,找找关键点进入最后一个函数,发现了些东西,两个函数输出success和denied,if括号内的条件就得为非0,也就是说ws数组和s2数组相等才行,上面对s2数组进行了处理,那就直接看他咋处理的,然后逆推就行了,先提取数据,选中之后shift+e,这边有一个坑,那就是dword_8048A90的数据提取,这个数组最后的四个0不要提取,为什么是最后四个呢?这边需要一点汇编的知识点,数的定义,一般四个为一组,定义0,没有意义,所以最后定义的数0不采取
点进decrypt函数该函数传入的两个数组都是已知数,这边对应好就行了(num数组为我自己定义的数组,方便些),这边也有一个小点注意一下,那就是不是所有的c代码都会有意义,跟着他的大概意思揣测,未说明白的地方直接跳过就好,最后上代码
#include<stdio.h>
#include<string.h>
int main(){
int s[]={
58, 20, 0, 0, 54, 20, 0, 0, 55, 20,
0, 0, 59, 20, 0, 0, 128, 20, 0, 0,
122, 20, 0, 0, 113, 20, 0, 0, 120, 20,
0, 0, 99, 20, 0, 0, 102, 20, 0, 0,
115, 20, 0, 0, 103, 20, 0, 0, 98, 20,
0, 0, 101, 20, 0, 0, 115, 20, 0, 0,
96, 20, 0, 0, 107, 20, 0, 0, 113, 20,
0, 0, 120, 20, 0, 0, 106, 20, 0, 0,
115, 20, 0, 0, 112, 20, 0, 0, 100, 20,
0, 0, 120, 20, 0, 0, 110, 20, 0, 0,
112, 20, 0, 0, 112, 20, 0, 0, 100, 20,
0, 0, 112, 20, 0, 0, 100, 20, 0, 0,
110, 20, 0, 0, 123, 20, 0, 0, 118, 20,
0, 0, 120, 20, 0, 0, 106, 20, 0, 0,
115, 20, 0, 0, 123, 20, 0, 0, 128, 20,
0, 0, 0, 0, 0, 0
};
int num[]={
1, 20, 0, 0, 2, 20, 0, 0, 3, 20,
0, 0, 4, 20, 0, 0, 5, 20, 0, 0,
};
for(int i=0;i<sizeof(s)/sizeof(int);i++){
s[i]-=num[i%20];
if(s[i]>32&&s[i]<128){
printf("%c",s[i]);
}
}
return 0;
}
写代码的时候,也要注意几个小点,只有32-128之间的再输出出来,如果不对,再缩小范围60-128,同时也要注意数组的长度,此处取num数组的值时,需要对20取模,不然会超出数组的长度取值,到时候就会错了,毕竟s数组长度远大于num数组。
最后总结一下,c代码中未说明清楚的东西可以暂且忽略一下,数组和数组进行异或时,需要考虑两个数组的长度,不能超出数组本身的长度(^_^),拿下