首先查个壳,发现没壳,是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代码中未说明清楚的东西可以暂且忽略一下,数组和数组进行异或时,需要考虑两个数组的长度,不能超出数组本身的长度(^_^),拿下