能力值:
( LV9,RANK:330 )
|
-
-
6 楼
#include <Windows.h>
#include <stdint.h>
#include <stdio.h>
//init key table
void sub_00401000(BYTE *p1, BYTE *p2, int size){
DWORD index = 0;
DWORD table[0x100];//dword_0x0019F6E0
BYTE tmp;
for (int i = 0; i < size; i++){
table[i] = p2[i];
p1[i] = i;
}
for (int i = 0; i < size; i++){
//0042DB70 48 vAdd4 ;0x00000000+0x00000000=0x00000000
index = (index + p1[i] + table[i]) & 0xFF;
//004324BF 3C vNor4 ;0x00000000 0xFFFFFF12=0x000000ED
tmp = p1[i] ^ 0xED;
//00431DF6 68 vWrite1 ;[0x0019FBFC]=0x81
p1[i] = p1[index];
//00431E31 48 vAdd4 ;0x00000081+0x0019FBFC=0x0019FC7D
p1[index] = tmp;
}
}
//encrypt
void sub_001150(BYTE *p1, char *psz, int len){
BYTE index = 0;
BYTE tmp = 0;
for (int i = 0; i < len; i++){
//0043AA49 5C vRead1 ;[0x0019FBFD]=0x9F
index = index + p1[i + 1];
//0043AD6B 48 vAdd4 ;0x00000000+0x0000009F=0x0000009F
//0043EFAB 48 vAdd4 ;0x0000009F+0x0019FBFC=0x0019FC9B
//0043EFBC 5C vRead1 ;[0x0019FC9B]=0x7F [0x9F]
//0043EFDB 68 vWrite1 ;[0x0019FBFD]=0x7F
tmp = p1[i + 1];
p1[i + 1] = p1[index];
//0043F02D 5C vRead1 ;[0x0019FAE3]=0x9F
//0043F04C 68 vWrite1 ;[0x0019FC9B]=0x9F
//0043F3FA 5C vRead1 ;[0x0019FC9B]=0x9F
//0043F715 48 vAdd4 ;0x0000009F+0x0000007F=0x0000011E
//0043F715 48 vAdd4 ;0x0000009F+0x0000007F=0x0000011E
//index + p1[index];
//0043F925 3C vNor4 ;0xFFFFFEE1 0x7FFFFF00=0x0000001E
//(index)& 0xFF;
//0044386D 48 vAdd4 ;0x0000001E+0x0019FBFC=0x0019FC1A
//=p1[(index + p1[index]) & 0xFF];
//00443BE0 5C vRead1; [0x0019FD28] = 0x31
//=psz[i];
//00443F73 3C vNor4 ;0x00000023 0x00000023=0xFFFFFFDC
//004441DF 3C vNor4 ;0x00000021 0xFFFFFFCC=0x00000012
//= psz[i] ^ p1[(index + p1[index]) & 0xFF];
//1E AA 76 78 58 F6
//0044423B 68 vWrite1; [0x0019FD28] = 0x12
psz[i] = psz[i] ^ p1[(tmp + p1[index]) & 0xFF];
//00444291 5C vRead1 ;[0x0019FD28]=0x12
//= psz[i];
//00444893 3C vNor4 ;0x00000012 0xFFFFFF21=0x000000CC
//004448EF 68 vWrite1 ;[0x0019FD28]=0xCC
psz[i] = psz[i] ^ 0xDE;
}
}
void sub_004012A0(char *psz, int len){
BYTE p1[0x100];
BYTE p2[0x100] = {
0x81, 0x3F, 0xBA, 0xDA, 0x6F, 0xBD, 0x5A, 0x3D, 0xA5, 0x62, 0x89, 0x8C, 0xE2, 0x13, 0xD8, 0x82,
0xA5, 0xC9, 0x27, 0x19, 0x72, 0xF0, 0xF2, 0xCB, 0x71, 0x8B, 0x17, 0xA1, 0x1A, 0x42, 0x35, 0xBE,
0xFD, 0x55, 0xF0, 0x65, 0x38, 0x21, 0x76, 0xD6, 0xD6, 0xF3, 0xC5, 0x58, 0xAB, 0xE8, 0x03, 0x9A,
0x24, 0xB9, 0xB6, 0xE8, 0xD9, 0xF3, 0x64, 0xB4, 0x82, 0x62, 0x9D, 0x37, 0x1B, 0x36, 0x00, 0x8E,
0x1C, 0x99, 0x93, 0xE5, 0xE5, 0xF7, 0xDC, 0xB8, 0x72, 0xEE, 0xE3, 0x48, 0x62, 0x20, 0x0C, 0x8C,
0x1D, 0xCC, 0x2D, 0x94, 0x26, 0x1C, 0x64, 0xBE, 0x54, 0x59, 0x11, 0x3B, 0xF5, 0xE3, 0x5F, 0xC9,
0x60, 0x1F, 0x59, 0xF9, 0xFA, 0xFD, 0xC0, 0xD6, 0x55, 0x58, 0xB9, 0x12, 0x95, 0xF4, 0x06, 0x1A,
0x3C, 0xB1, 0x36, 0x86, 0x00, 0xDB, 0xE6, 0xD7, 0xA3, 0x1B, 0x9F, 0x75, 0xF2, 0xCA, 0x76, 0xEA,
0xDD, 0x02, 0xB3, 0x8A, 0x08, 0x51, 0x99, 0xC9, 0x72, 0x36, 0x88, 0x2A, 0x19, 0x09, 0x7B, 0x3C,
0x56, 0x60, 0x53, 0x28, 0xBA, 0x14, 0x0B, 0x88, 0x5C, 0x61, 0x65, 0x2F, 0x0D, 0x2D, 0xBA, 0x92,
0x86, 0xB3, 0x01, 0x70, 0xE2, 0xAA, 0xB5, 0xF5, 0x84, 0xF9, 0xD5, 0x6A, 0x97, 0x6B, 0x3C, 0xC5,
0xA5, 0xBA, 0x40, 0x82, 0xA0, 0x42, 0x4E, 0x83, 0xCA, 0x3F, 0x3E, 0x76, 0x2A, 0xF2, 0x3D, 0x5C,
0x3F, 0xFC, 0x64, 0x0C, 0x53, 0x91, 0x97, 0xC7, 0xD6, 0xEA, 0x73, 0x42, 0x7B, 0x93, 0x05, 0x29,
0x23, 0x94, 0x8B, 0x8C, 0x0E, 0xD4, 0x30, 0x2A, 0xCC, 0xCC, 0x9E, 0xB8, 0x8E, 0x77, 0x6B, 0xA4,
0xE4, 0x0A, 0xAE, 0x05, 0xFD, 0xD0, 0x8E, 0x13, 0x80, 0x0D, 0xDB, 0xF7, 0xCB, 0x3A, 0x72, 0x9F,
0xA5, 0xC3, 0x97, 0x58, 0x86, 0x23, 0x6B, 0x8E, 0xF5, 0x32, 0xC1, 0xFB, 0x42, 0x31, 0xD6, 0xF3,
};
if (len == 0){
return;
}
sub_00401000(p1, p2, 0x100);
sub_001150(p1, psz, len);
}
void sub_00401A50(){
printf("%s\n", "----> Hello, SVMP!!!");
}
int main(int argc, char **argv){
char szInput[260];
int len = 0;
sub_00401A50();
printf("in:");
scanf("%s", szInput);
len = strlen(szInput);
sub_004012A0(szInput, len);
printf("out:");
for (int i = 0; i < len; i++){
printf("%02x ", (BYTE)szInput[i]);
}
fflush(stdin);
getchar();
return 0;
}
|