打开decry加密函数
按h将src和v9转换为十六进制数
可以看到这里的两个十六进制是大端序,但是数据在内存中都是小端序,所以要将其,反转一下。一般在CPU,x86都是小端序,但是IDA将之转换为了大端序。
分析join函数
join函数作用是以指定的字符连接成一个新的字符串。此处是将key3 和 v9 连接成一个新的字符串。text = killshadow。
key1=ADSFK
key = ADSFK
key = ADSFKNDCLS
如果key【v3 % v5】是大写字母,则把它变为小写字母。大小写字母的ASCLL码,相差32。
key->adsfkndcls;
\
text等于str2才可以
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
#include <stdio.h>
int main() {
char key[] = "adsfkndcls"; //key字符串是adsfkndcls
char text[] = "killshadow"; //text字符串是killshadow
int i; //定义了变量 i
int v2 = 0;
int v3 = 10;//v3的长度为10 ,因为在大写字母变小写的时候,v3会++,而字符串变了10次。
int v5 = 10;
for (int i = 0; i < v5; i++) { //开始循环
for (int j = 0; j < 123; j++) { //开始第二重循环 j = v1;
if ((j < 'A' || j >'Z') || (j < 'z' && j > 'a')) { //|| 和 && 交换 > 和 < 交换 ,让j不再那个范围之内
continue;//如果不在范围之内,就跳过本次循环。
}
if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i]) { //执行这个算法,跟text字符串相比,如果相等就输出
printf("%c", j);
v3++;//注意算法里面 v3++,所以这里也要把v3++;
break;
}
}
}
}
void FileBuffer_To_ImageBuffer(void* pFileBuffer, void** pImageBuffer)
{
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD*)pFileBuffer + pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)((BYTE*)pNTHeader + sizeof(DWORD));
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((BYTE*)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((BYTE*)pOptionHeader + pPEHeader->SizeOfOptionalHeader);
void* pTempFileBuffer = NULL;
//P = (void*)0x10086;
//判断是否含有有效MZ和PE标志
if (*(PWORD)pFileBuffer != IMAGE_DOS_SIGNATURE)
{
printf("无有效的MZ标志\n");
}
if (*(PDWORD)((DWORD)pFileBuffer + pDosHeader->e_lfanew) != IMAGE_NT_SIGNATURE)
{
printf("无有效的PE标志\n");
}
//开辟空间
pTempFileBuffer = malloc(pOptionHeader->SizeOfImage);
if (!pTempFileBuffer)
{
printf("pTempFileBuffer空间申请失败...");
}
//移动头和节表
memset(pTempFileBuffer, 0, pOptionHeader->SizeOfImage);//熟悉的初始化函数
memcpy(pTempFileBuffer, pFileBuffer, pOptionHeader->SizeOfHeaders);/*void *memcpy(void*dest, const void *src, size_t n);由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。函数返回一个指向dest的指针。*/
for (DWORD i=0; i<pPEHeader->NumberOfSections; i++)
memcpy((void*)((DWORD)pTempFileBuffer+((pSectionHeader+i)->VirtualAddress)),(void*)((DWORD)pFileBuffer+((pSectionHeader+i)->PointerToRawData)), (pSectionHeader + i)->SizeOfRawData);
*pImageBuffer = pTempFileBuffer;
pTempFileBuffer = NULL;
}