¿Cuál es el principio de selección de palabras en pantalla de Kingsoft PowerWord?
1. Conocimientos básicos
En primer lugar, necesitas algunos conocimientos básicos para escribir este tipo de programas.
Puede utilizar Vc++, incluidos 16/32 bits.
Competente en API de Windows, especialmente partes GDI y KERNEL.
Comprender el lenguaje ensamblador y poder utilizar softice para depurar programas, ya que este tipo de programas se depuran mejor con softice.
2. Principios básicos
En la era de Windows 3.x, el sistema Windows proporcionaba solo unas pocas funciones de salida de caracteres.
TextOut
ExtTextOut
DrawText
......
DrawText finalmente utiliza ExtTextOut realizado.
Por lo tanto, toda la salida de caracteres en Windows se logra llamando a TextOut y ExtTextOut. Por lo tanto, si puede modificar los puntos de entrada de estas dos funciones y dejar que el programa primero llame a una de sus propias funciones y luego llame a la salida de caracteres del sistema, puede obtener todos los caracteres generados por Windows.
En la era Windows95, el principio básicamente no ha cambiado, pero 95 es más complicado que 3.x. Al principio, todavía se puede utilizar algún software de extracción de palabras escrito en Windows 3.x. Pero luego apareció IE4. Como resultado, muchos software de diccionario fueron eliminados porque no eran compatibles con IE4. Sin embargo, también creó oportunidades para algunos programas, como Kingsoft PowerWord. De hecho, el problema con IE4 no es complicado, excepto que genera caracteres Unicode usando TextOutW y ExtTextOutW. Sabiendo esto, simplemente interceptelo también. Sin embargo, el método de implementación es un poco más complicado y se explicará en detalle más adelante. Ahora existe IE5, y resulta que PowerWord ya no es fácil de usar. Microsoft es realmente #^@#$%$*&^@#@.....
Después de investigar, tengo. Encontré una solución, pero todavía hay algunos problemas y, a veces, me equivoco. Sigo estudiándolo y espero que todos puedan discutirlo juntos.
También existe Windows NT. El principio es el mismo, pero el método de implementación es completamente diferente al del 95.
3. Puntos técnicos
Para lograr la extracción de palabras, se deben resolver los siguientes problemas técnicos.
1. Interceptar la entrada de la API y obtener los parámetros de la API.
2. Colarse de forma segura en Windows, muy compatible con varias versiones de Windows.
3 Calcula las palabras y letras donde se encuentra el mouse.
4. Si está ejecutando programas de 32 bits en Windows 95, también implica la tecnología de programación mixta Windows32/16.
¡Lleguemos aquí primero hoy! Lo mejor es preparar una copia del software para 95/98 y Kingsoft PowerWord. Analicemos primero cómo lo hacen otros.
Bienvenido a contactarme
Correo electrónico:yeedong@163.net
Serie de conferencias sobre tecnología de captura de palabras en pantalla temática (2)
Autor Yidong
¡Perdón por hacer esperar a todos!
Leí las respuestas de algunas personas y descubrí que muchas personas todavía no conocen los principios de selección de palabras.
Primero, déjame explicarte el problema del gancho. PowerWord utiliza ganchos y utiliza dos tipos de ganchos, uno de los cuales es un gancho estándar de Windows. Instala una función de devolución de llamada a través de SetWindowHook, que instala un gancho de mouse para que pueda responder a los mensajes del mouse de manera oportuna y recuperar palabras. .Demasiada relación.
Otro tipo de gancho es el gancho API, que es la tecnología central de extracción de palabras. Escribió una declaración jmp al comienzo de TextOut y otras funciones para saltar a su propio código.
La razón por la que no puedes ver esta declaración de salto usando softice es porque solo existe en el momento en que se recupera la palabra y normalmente no existe.
Puedes establecer un punto de interrupción de lectura y escritura al comienzo de TextOut
salida de texto bpm
Busca la palabra nuevamente y encontrarás el código utilizado por PowerWord para escribir ganchos.
/************************************
Así que enfatizo aquí que si quieres aprender esta tecnología, debes entender el lenguaje ensamblador y ser competente en el uso del software
*****************. ************ ***********/
En cuanto a las funciones no reveladas descargadas de cjktl95, están relacionadas con la programación mixta de Windows32/16. , Los mencionaré más adelante.
Permítanme describir primero el proceso de recuperación de palabras.
0 Determinar si el mouse ha permanecido en un lugar durante un período de tiempo
1 Obtener el actual. posición del mouse
2 Genera un rectángulo centrado en la posición del mouse
3 Cuelga el gancho API
4 Deja que este rectángulo genere un mensaje de redibujo
p>5 En el gancho Espere a que salgan los caracteres
6 Calcule en qué palabra está el mouse y guarde la palabra
7 Si se obtiene la palabra, elimine el enlace API Después de un período de tiempo, independientemente de si la palabra se obtiene o no, elimine el enlace API
8 Utilice la palabra para buscar en el diccionario y mostrar el cuadro de explicación.
Muchos pasos son difíciles de implementar, por lo que sólo hay un puñado de personas en China que pueden hacer un diccionario completo.
Entre ellos, 0, 1, 2, 7 y 8 son relativamente simples y no se mencionarán.
Primero hablemos de cómo realizar el enlace:
El llamado enlace consiste en escribir una declaración JMP XXXX:XXXX en la entrada de la API de Windows y saltar a su propio código.
Los pasos son los siguientes:
1. Obtenga la entrada de la API de Windows y use GetProcAddress para implementarla.
2 Guarde los primeros cinco bytes de la API. entrada porque JMP es 0xEA, la dirección es de 4 bytes
3 Escriba la declaración de salto
Este paso es el más complicado
Los segmentos de código de Windows no se pueden escribir. Originalmente, pero Microsoft dejó una puerta trasera.
Existe una función no revelada llamada AllocCsToDsAlias,
UINT WINAPI ALLOCCSTODSALIAS(UINT);
Puedes obtener la entrada de esta función y poner el segmento de código API. Se le pasa el selector (si no sabe qué es un selector, primero aprenda a programar en modo protegido) y él devolverá un selector de segmento de datos grabable. Este selector debe liberarse después de su uso. Utilice el nuevo selector y el desplazamiento de la entrada API para sintetizar un puntero para escribir el segmento de código de Windows.
Este es el núcleo de la tecnología de extracción de palabras. No solo la extracción de palabras, sino también la localización en pantalla completa de la plataforma china complementaria utilizan esta tecnología. Ahora ya sabes por qué rara vez se conocen frases tan sencillas, ¿verdad? Porque hay demasiados productos que lo utilizan y demasiadas empresas dependen de él para ganar dinero.
Estas empresas y productos incluyen: Chinese Star, Sitong Lifang, Nanjixing, Kingsoft PowerWord, Shida Mingtai's Orient Express, roboword, Translator, Instant Chinese Expert, etc. . . . También hay al menos 20 pequeñas empresas. Aunque sus implementaciones específicas son diferentes, los principios generales son los mismos.
Escribí todo esto a mano y no hay ningún esquema ni nada parecido. Si tengo la oportunidad en el futuro, lo solucionaré para que todos puedan conformarse con ello. xixi...
Discusión sobre el tema de la adquisición de palabras en pantalla (3)
Autor Yidong
Perdón por hacer esperar a todos, estuve trabajando hace un tiempo Mi disco duro volvió a fallar, que desafortunado.
Seamos serios esta vez.
Tomemos como ejemplo la interceptación de TextOut.
El siguiente es el código:
//Intercept TextOut
typedef UINT (WINAPI* ALLOCCSTODSALIAS)(UINT
ALLOCCSTODSALIAS); AllocCsToDsAlias;
BYTE NewValue[5];//Guardar el nuevo código de entrada
BYTE OldValue[5];//Código de entrada original de API
carácter sin firmar * Address=NULL;//Dirección de entrada API grabable
UINT DsSelector=NULL;//Selector grabable que apunta a la entrada API
WORD OffSetEntry=NULL;//Desplazamiento API
WORD OffSetEntry=NULL;//API Offset p>
BOOL bHookAlready = FALSE; //Marca de si se debe enganchar al niño
BOOL InitHook()
{
HMODULE hKernel,hGdi;
hKernel = GetModuleHandle("Kernel");
if(hKernel==NULL)
return FALSE
AllocCsToDsAlias ; = (ALLOCCSTODSALIAS)GetProcAddress(hKernel,"AllocCsToDsAlias");//Esta es una API no publicada, así que obtenga la dirección como esta
if(AllocCsToDsAlias==NULL)
return FALSE
hGdi = GetModuleHandle("Gdi");
if(hmGdi==NULL)
devuelve FALSO; = GetProcAddress(hGdi,"TextOut");
if(Entry==NULL)
return FALSE
OffSetEntry = (WORD)(FP_OFF( Entrada ));//Obtener el selector del segmento de código API
DsSelector = AllocCsToDsAlias(FP_SEG(Entry));//Asignar un selector grabable equivalente
Address = (unsigned char* )MK_FP(DsSelector,OffSetEntry);//Dirección sintética
NewValue[0]=0xEA
*((DWORD*)(NewValue+1)) = (DWORD)MyTextOut; ;
OldValue[0]=Dirección[0];
*((DWORD*)(OldValue+1)) = *((DWORD*)(Dirección +1))
}
BOOL ClearHook()
{
if(bHookAlready)
HookOff();
FreeSelector(DsSelector);
}
BOOL HookOn()
{
if(!bHookAlready ){
for(int i=0;i<5;i++){
Dirección[i]=NuevoValor[i]
} p>
bGancho
Ya=VERDADERO
}
}
BOOL HookOff()
{
if(bHookYa) {
for(int i=0;i<5;i++){
Dirección[i]=OldValue[i]
}
bHookAlready=FALSE;
}
}
//La función de enlace debe tener los mismos parámetros y declaraciones que la API
BOOL WINAPI MyTextOut(HDC hdc,int nXStart,int nYStart,LPCSTR lpszString,UINT cbString)
{
BOOL ret
HookOff() ;
ret = TextOut(hdc,nXStart,nYStart,lpszString,cbString);//Ajustar el TextOut original
HookOn()
return ret;
}
El código anterior es el ejemplo más simple de cómo colgar un gancho API. Quiero recordarles a todos que este código lo escribí de memoria. Mi código anterior lo perdí. no lo he compilado ni probado
Porque no tengo VC++1.52, por lo que el código puede estar incorrecto.
Se recomienda utilizar Borland c++ y compilarlo como 16 bits.
Si usa VC++1.52, necesita cambiar la opción
En la opción de VC++1.52, hay una configuración de modo de memoria, seleccione el modo grande y " DS! =SS DS Cargar en la entrada de función.", recuerde, de lo contrario el sistema fallará.