Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

c_a2

Encripar/decriptar

Recommended Posts

c_a2

Como já disse na minha apresentação, eu tenho muito poucos conecimentos em programação e por isso registei-me neste forum para ver se consigo ajuda para tentar resolver um problema que tenho com um código c++.

Este codigo depois de compilado encripta um ficheiro de texto para binário e vise-versa.

#include<fstream.h>
#include<conio.h>
#include<stdio.h>
int main()
{
char name[30],target[30],ch,mod;							 //DeclareVariables
int num[100],i,option;
cout<<"Enter Your Option ";
cout<<"1. To Encrypt The File ";
cout<<"2. To Decrypt The File ";
cout<<"Option : ";
cin>>option;
if(option==1)
{
cout<<"Enter The Path Of A File Which Is To Be Encrypted : ";
gets(name);
ifstream fin(name,ios::binary);							 //Open The Input File In A Binary Mode
if(!fin)
{														 //Show Error Occur If File Does Not Exist
cout<<"Error In Openinig Of A File : ";				 //Or Any Error Occurs
return 1;
}
cout<<"Enter The New Encrypted File Name : ";
gets(target);
ofstream fout(target,ios::binary);						 //Open The OutPut File In A Binary Mode
if(!fout)
{
cout<<"Error In Opening Of Target File : ";		 //Show Error If Any Error Occrs In Opening Of A File
return 1;
}
for(i=0;i<9;i++)
{														 //Multiple ForLoops For Storing The Numbers
num[i]=i;											 //In An Array
}
for(i=14;i<31;i++)										 //Loops Will Store 100 Numbers
{
num[i-5]=i;											 //Which Will Encrypt The Contents Of A File
}
for(i=33;i<=68;i++)									 //To Avoid The Error Ocuur Caused By The
{														 //Enter Key ,Tab Key & Space Key
num[i-7]=i;											 //These Variations In Loops Is Made
}
for(i=97;i<=122;i++)
{
num[i-35]=i;
}
while(fin)
{													 //Open The Input File
fin.get(ch);
if(ch==EOF)break;									 //Exit To Loop When End Of File
if((ch>=97) && (ch<=122))
{													 //Encrypt The Small Letters
i=97;
mod=num[ch-i];
fout<<mod;
}
if((ch>=65) && (ch<=90))
{
i=39;												 //Encrypt The Capital Letters
mod=num[ch-i];									 //And Store In An Output File
fout<<mod;
}
if((ch>=48) && (ch<=57))
{
i=4;											 //Encrypt The Numbers
mod=num[ch+i];
fout<<mod;
}
if((ch==10)||(ch==13))
{
mod=ch;											 //For Enter Key
fout<<mod;
}
if(ch==32)
fout<<ch;											 //For Space Key
if(ch==9)
fout<<ch;											 //For Tab Key
if((ch>=33)&&(ch<=47))
{												 //For Special Symbols
mod=ch+64;
fout<<mod;
}
if((ch>=58)&&(ch<=64))
{												 //For Special Symbols
mod=ch+54;
fout<<mod;
}
if((ch>=91)&&(ch<=96))
{
mod=ch+28;										 //For Special Symbols
fout<<mod;
}
if((ch>=123)&&(ch<=126))
{
mod=ch-40;										 //For Special Symbols
fout<<mod;
}
}
fin.close();										 //Close The Input File
fout.close();										 //Close The Output File
cout<<"Your File Is Encrypted Now........... ";
getch();
return 0;
}

/*===============================================================================================================*/

/* This Program Will Decrypt The Document */

if(option==2)
{
char name[30],target[30],ch,mod;							 //Declare Variables
int num[100],i,flag;
cout<<"Enter The Path Of A File Name Which Is To Be Decrypted : ";
gets(name);
ifstream fin(name,ios::binary);
if(!fin)													 //Open The Encryped File In A Binary Mode
{
cout<<"Error In Opening Of A File : ";
return 1;												 //Show Errorn If File Does Not Exist
}														 //Or Any Occurs In Opening Of A File
cout<<"Enter The New Decrypted File Name : ";
gets(target);
ofstream fout;
fout.open(target,ios::binary);							 //Opens The Output File In An Binary Mode
if(!fout)
{														 //Show Error If Any Error Occurs In Opening Of A File
cout<<"Error In Opening Of A Target File : ";
return 1;
}
for(i=0;i<9;i++)
{														 //Same Multiple For Loops For Storing The Numbers
num[i]=i;												 //In An Array
}
for(i=14;i<31;i++)
{
num[i-5]=i;											 //Loops Will Store 100 Numbers
}
for(i=33;i<=68;i++)										 //Which Encrypts The Document Also Decrypt It
{
num[i-7]=i;
}
while(fin)
{														 //Opens The Encryped File
fin.get(ch);
flag=0;													 //Turn Off Flag
if(ch==EOF)break;
for(i=26;i<52;i++)
{
if(ch==num[i])										 //Loop For Match The Small Letters Letters
{
mod=i+39;											 //If Match Then Put Appropriate Letter
fout<<mod;											 //In A OutPut File
flag=1; break ;											 //Turn On Flag And Exit The Loop
}
}
if (flag==1) continue ;									 //If Flag Is On Then Continue Outer Loop
for(i=0;i<26;i++)
{														 //Loop For Match The Capital Letters
if(ch==num[i])
{													 //If Match ThenPut Appropriate Letter
mod=i+97;											 //In A OutPut File
fout<<mod;
flag=1;break;											 //Turn On Flag And Exit From This Loop
}
}
if (flag==1) continue ;									 //If Flag Is On Then Continue Outer Loop
for(i=52;i<62;i++)
{														 //Loop For Numerical Numbers
if(ch==num[i])
{
mod=i-4;
fout<<mod;
flag=1; break ;
}
}
if (flag==1) continue ;
if((ch==10)||(ch==13))
{
mod=ch;											 //Condition For Enter Key
fout<<mod;
}
if(ch==32)
fout<<ch;											 //Condition For Space Key
if(ch==9)
fout<<ch;											 //Condition For Tab Key
if((ch>=97)&&(ch<=111))
{
mod=ch-64;										 //For Special Symbols
fout<<mod;
}
if((ch>=112)&&(ch<=118))
{
mod=ch-54;										 //For Special Symbols
fout<<mod;
}
if((ch>=119)&&(ch<=124))
{
mod=ch-28;										 //For Special Symbols
fout<<mod;
}
if((ch>=83)&&(ch<=86))
{												 //For Special Symbols
mod=ch+40;
fout<<mod;
}
}
fin.close();									 //Close The Encrypted File
fout.close();									 //Close Your Original Decrypted File
cout<<"The File Is Being Decrypted............ ";
getch();
return 0;
}
return 0;
}

E precisava de implementar neste código 4 rotinas que foram decompiladas com o software Hex-Rays de um ficheiro dll.

Supostamente a extração destas rotinas são em linguagem c só que este software faz uma extração aproximada do c e depois tem que ser corregida para que funcione e era aí que eu precisava de ajuda para ver se alguém me consegu fazer essa correcção.

em Baixo coloco as rotinas que necessitava de implementar.

1ª rotina de encriptação:

char __thiscall sub_10002090(int this)
{
  int v1; // ST04_4@1
  v1 = **(_DWORD **)(this + 8);
  *(_BYTE *)(this + 20) = (**(_DWORD **)(this + 8) >> 24) + (unsigned __int8)(**(_DWORD **)(this + 8) >> 16) + **(_DWORD **)(this + 8) + BYTE1(v1);
  *(_BYTE *)(this + 20) *= 17;
  *(_BYTE *)(this + 21) = *(_BYTE *)(this + 20) + 37;
  return 1;
}

2ª rotina de encriptação:

char __thiscall sub_10001E80(void *this)
{
  char result; // al@2
  void *v2; // [sp+0h] [bp-8h]@1
  unsigned int i; // [sp+4h] [bp-4h]@3
  v2 = this;
  if ( (unsigned __int8)sub_10002090() )
  {
  for ( i = *(_DWORD *)((char *)v2 + 22);
		i < *((_DWORD *)v2 + 4);
		++i )
  {
	 *(_BYTE *)(*((_DWORD *)v2 + 2)
			  + i) ^= ~byte_1006E128[*((_BYTE *)v2 + 20)];
	 *((_BYTE *)v2 + 20) += *((_BYTE *)v2 + 21) + *(_BYTE *)(*((_DWORD *)v2 + 2) + i);
  }
  result = 1;
  }
  else
  {
  result = 0;
  }
  return result;
}

1ª rotina de decriptação:

char __thiscall sub_10002020(int this)
{
  int v1; // ST04_4@1
  v1 = **(_DWORD **)(this + 8);
  *(_BYTE *)(this + 20) = (**(_DWORD **)(this + 8) >> 24) + (unsigned __int8)(**(_DWORD **)(this + 8) >> 16) + **(_DWORD **)(this + 8) + BYTE1(v1);
  *(_BYTE *)(this + 20) *= 17;
  *(_BYTE *)(this + 21) = *(_BYTE *)(this + 20) + 37;
  return 1;
}

2ª rotina de decriptação:

char __thiscall sub_10001DE0(void *this)
{
  char result; // al@2
  char v2; // ST04_1@5
  void *v3; // [sp+0h] [bp-Ch]@1
  unsigned int i; // [sp+8h] [bp-4h]@3
  v3 = this;
  if ( (unsigned __int8)sub_10002020() )
  {
  for ( i = *(_DWORD *)((char *)v3 + 22);
		i < *((_DWORD *)v3 + 4);
		++i )
  {
	 v2 = *((_BYTE *)v3 + 21)
		+ *(_BYTE *)(*((_DWORD *)v3 + 2) + i)
		+ *((_BYTE *)v3 + 20);
	 *(_BYTE *)(*((_DWORD *)v3 + 2)
			  + i) ^= ~byte_1006E128[*((_BYTE *)v3 + 20)];
	 *((_BYTE *)v3 + 20) = v2;
  }
  result = 1;
  }
  else
  {
  result = 0;
  }
  return result;
}

Obrigado pela atenção

Share this post


Link to post
Share on other sites
HappyHippyHippo

ora bem

- tens poucos conhecimentos de programação

- estas a tentar criar um código para subverter uma encriptação fechada

- estas a pedir a alguém que faça esse trabalho por ti

... hum ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.