Red de conocimiento informático - Consumibles informáticos - ¿Cuál es el principio de selección de palabras en pantalla de Kingsoft PowerWord?

¿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

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]

}

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á.