Operaciones matemáticas básicas en vb6
keygen DocCF - Software de Gestión Escolar
keygen DocCF - Software de Gestión Escolar
Materiales: Olly Parcheado 5
Victima : DocCF - Software de Gestión Escolar versión 2.2
Luego de instalar e ingresar al registro del programa colocamos un BP en vbaStrcomp cuando estamos en el form de registro y podemos ver que la comparación se realiza con el resultado de algunas operaciones matemáticas tanto del número que ingresamos como del número generado por el programa y no con los números mismos.
Puesto que son operaciones matemáticas podemos utilizar vbaR8Str para ver de dónde saca los valores de comparación, traceando un poco se puede ver que obtiene los valores de
Código:
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Grupo CF Developer\DocCF
Setting1 = 10838093996047972805767
Setting3 = 10061210012438047703422
Seguimos traceando y vemos que utiliza los dos primeros números de Setting3 para sumarles 3 y luego 1 con FADDP los resultados de cada operación podemos verlos en ST0,ST1,ST2,… en Registers FPU
Seguimos traceando y vemos que la suma de los 2 primeros números de setting3 (10) + 3 + 1 = 14 es utilizado para obtener la siguiente subcadena para leer 3 caracteres a partir de ese número que en mi caso seria 1006121001243 804 7703422 el cual se resta de 999
Código:
FSUBP
ST=804.00000000000028730
ST(1)=999.00000000000057460
--------------------------
195 (Resultado)
Código:
FDIVP
195 / 3
---------
65 // resulta a primera parte de la cadena de comparación
Bueno ya no utilizare imágenes, solo mostrare las operaciones que se realiza en la cadena de setting3.
Luego se suma con FADDP
Código:
4 + 13
-----
17
Código:
FUMLP
3*3 (el multiplicador equivale al número de caracteres que tiene la subcadena, en otros casos puede ser 4)
-----
9
Código:
FSUB RESTA
ST=9.0000000000000028730
ST(1)=770.00000000000028730
------------------------
761 //este número luego de convertirse a string se concatena a la primera parte de la cadena de comparación y quedaría 65761
Código:
FADDP
13+4
----
17
3+17=20 //que se usa para obtener la ultima subcadena.
Luego de pasarlo a entero este se realiza la resta
Código:
FSUBP
3422-5997
----------
2575 y el resultado se divide
FDIV DIVIDE
2575 / 5
--------
515 //obtenemos la ultima parte de la cadena de comparación 65761515
Analizando Setting1
Luego de tracear un poco vemos que ingresa el valor de setting1 que es el número que necesitamos para validar el software en mi caso es Setting1 = 10838093996047972805767 utiliza los 2 primeros números, los pasa a entero, le suma 3 y 1 = 14
1083809399604 797 2805767
Código:
810-797 = 13 /7 = 1,85714285714286 //Esta es la primera parte de la cadena de comparación
Código:
FUMLP (4 equivale al número de caracteres que se tomo de la cadena original)
4*9=36 luego se resta:
FSUBP
2805-36 = 2769 //La segunda parte que se concatena a la cadena de comparación.
Código:
FSUBP
4005-767 = 3238 /3 = 1079,33333333333
Y queda UNICODE "1,8571428571428627691079,33333333333" la cual es comparada como vimos al comienzo:
Ya sabemos cómo realiza las operaciones ahora solo queda revertirlas, simplemente dividimos la cadena de comparación que en mi caso es 65761515 tomo el primer número 6 5761515 y lo multiplico por 7 y lo resto a 810 con eso ya tengo para sustituir:
Código:
Valor que escribió el programa: 10838093996047972805767
Valor que se modificara: 1083809399604 768 2805767
Tomo los siguientes 4 números (6 5761 515) y les sumo 36 quedara en 5797 y lo sustituyo
Valor que escribió el programa: 10838093996047972805767
Valor que se modificara: 1083809399604768 5797 767
Tomo los últimos 3 números (65761 515) multiplico por 3 y lo resto de 4005 dando como resultado 2460 cambiamos los últimos valores:
Valor que escribió el programa: 10838093996047972805767
Valor que se modificara: 10838093996047685797 2460
Hay una variable más dependiente de la fecha que hace variar el numero de caracteres que lee para la multiplicación y resta de la 2da parte de las operaciones, como este tutorial está hecho para los que les interesa la Ingeniería Inversa, no lo especifico porque al tracear verán a que me refiero y así evitamos que algunas personas obtengan el serial valido solo copiando el tutorial sin aprender nada.
Para probar el string (en mi caso 65761515) que el programa genera para la comparación hice un pequeño programa en c++ para demostrar el análisis hecho.
Código
#include <iostream> #include <string> #include <sstream> #include <windows.h> int iValor(std::string cad); std::string sValor(int num); std::string leerValorREG_SZ(HKEY Registry, const std::string &sClave, const std::string &sValor); char *cRetorno(const std::string &sSource); int main() { std::string sClaveReg ="Software\\VB and VBA Program Settings\\Grupo CF Developer\\DocCF"; std::string sValorReg ="Setting3"; std::string sInfoRegistro = leerValorREG_SZ(HKEY_CURRENT_USER,sClaveReg,sValorReg); std::string sResult = ""; std::string sNumeroBuscado = ""; // Asignamos a un entero los primeros 2 numeros int iInicio = iValor(sInfoRegistro.substr(0,2).c_str())+3; int iResult = 0; //Asignamos a un string 3 numeros a partir de iInicio y convertimos en un entero sResult = sInfoRegistro.substr(iInicio,3); iResult = (999 - iValor(sResult))/3; //añadimos el valor de la 1ra operacion a el string que contendra el numero buscado sNumeroBuscado.append(sValor(iResult)); //procesamos la siguiente subcadena, asignamos a un string, luego a un entero y realizamos la 2da operacion //añadimos el valor de la 2da operacion a el string que contendra el numero buscado iInicio = iInicio + 3; sResult = sInfoRegistro.substr(iInicio,3); iResult = iValor(sResult)-9; sNumeroBuscado.append(sValor(iResult)); //procesamos la ultima subcadena, asignamos a un string, luego a un entero y realizamos la 3era operacion //añadimos el valor de la 3ra operacion a el string que contendra el numero buscado iInicio = iInicio + 3; sResult = sInfoRegistro.substr(iInicio,4); iResult = (5997 - iValor(sResult))/5; sNumeroBuscado.append(sValor(iResult)); //Imprimimos el numero buscado el que debera compararse con el resultado del setting1 std::cout << sNumeroBuscado << std::endl; std::cin.get(); return EXIT_SUCCESS; } int iValor(std::string cad) { int temp = atoi(cad.c_str()); return temp; } std::string sValor(int num) { std::string sTemp; std::stringstream ssTemp; ssTemp << num; sTemp = ssTemp.str(); return sTemp; } std::string leerValorREG_SZ(HKEY Registry, const std::string &sClave, const std::string &sValor) { unsigned char infoValor [1024]; char infocadena [1024]; std::string sClaveLeida=""; HKEY hKey; LONG lStatus; DWORD dwType; DWORD dwSize; dwType=REG_SZ; dwSize=1023; int i=0; lStatus = RegOpenKeyEx(Registry,cRetorno(sClave),0,KEY_READ,&hKey); if (lStatus == ERROR_SUCCESS) { lStatus = RegQueryValueEx(hKey,cRetorno(sValor), 0,&dwType, (LPBYTE)&infoValor, &dwSize); if (lStatus == ERROR_SUCCESS) { for(i=0;infoValor[i]!=0 && infoValor[i]!=204;i++) { infocadena[i]=(char)infoValor[i]; } infocadena [i]='\0'; sClaveLeida.assign(infocadena); RegCloseKey(hKey); return sClaveLeida; } } RegCloseKey(hKey); return "No se puede obtener el valor"; } char *cRetorno(const std::string &sSource) { int iTotal = strlen(sSource.c_str()); char *temp = new char[iTotal+1]; strncpy_s(temp,iTotal+1, sSource.c_str(),iTotal+1); temp[iTotal]='\0'; return temp; }
Para que funcione en las propiedades del proyecto debe cambiarse Juego de caracteres = Utilizar juego de caracteres multibyte.
Y bueno ya es tarde por aqui, asi que si se me paso algo o si hay alguna duda favor avisar
Saluos
PD: Favor de no enviarme pedidos del Keygen por MP o en este tema puesto que lo visto ahora es solo de caracter educativo para los que practican la Ingeneria Inversa y no para personas particulares que buscan activar este programa .