Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - xavieeee

#1
Buenas,

Estoy intentando crear una aplicación para editar imágenes con Python.

Esto es lo que quiero hacer:
1.- Crear una imagen con  un screenshot #ok
2.- Convertir la imagen a blanco y negro #ok
3.- Borrar las filas que sean enteras  negras #ok
4.- Borrar las columnas que sean enteras negras

No entiendo la lógica del punto 3, y no soy capaz de editar  la función que borra las filas para que borre las columnas.

Espero que podáis ayudarme

Un saludo,


Código (python) [Seleccionar]
import pyscreenshot as ImageGrab
from itertools import izip
from PIL import Image
import time

#Screenshot y guarda como .png

im1=ImageGrab.grab(bbox=(495,198,511,209))
im1.save("imagen.png","png")

#Convertir imagen a blanco y negro
col = Image.open("imagen.png")
gray = col.convert('L')
bw = gray.point(lambda x: 0 if x<128 else 255, '1')
bw.save("imagenbw.png")

#Borrar las filas que sean completamente negras
def find_rows_with_color(pixels, width, height, color):
   rows_found=[]
   for y in xrange(height):
       for x in xrange(width):
           if pixels[x, y] != color:
               break
       else:
           rows_found.append(y)
   return rows_found

rold_im = Image.open("imagenbw.png")
if old_im.mode != 'RGB':
   old_im = old_im.convert('RGB')
pixels = old_im.load()
width, height = old_im.size[0], old_im.size[1]
rows_to_remove = find_rows_with_color(pixels, width, height, (0, 0, 0)) #Remove black rows
new_im = Image.new('RGB', (width, height - len(rows_to_remove)))
pixels_new = new_im.load()
rows_removed = 0
for y in xrange(old_im.size[1]):
   if y not in rows_to_remove:
       for x in xrange(new_im.size[0]):
           pixels_new[x, y - rows_removed] = pixels[x, y]
   else:
       rows_removed += 1
new_im.save("imagennew.png")
#2
Buenas,

Primero de todo agradecer a Mad Antrax su ayuda el la elaboración de los siguientes códigos.

Estoy intentando inyectar código mediante Cheat Engine en el casino SuperStackPoker.

El objetivo es convertir el stack de los jugadores y las apuestas que realizan en función de la ciega grande de la mesa en la que se encuentren. Lo explicare de otro modo por si no jugáis a Poker.

Si un jugador esta sentado con 200 € en una mesa y el nivel de la mesa es 25NL, la ciega grande o apuesta mínima sera de 0,25 €. Por lo que este jugador esta sentado con 800 ciegas grandes o apuestas mínimas (200/0,25)
En cambio si el jugador tiene los mismos 200 €, pero esta en una mesa de nivel 200NL solo tendrá 100 apuestas mínimas. (200/2)

He conseguido realizar parte del código:

EL siguiente script multiplica el stack de todos los jugadores de la mesa por el valor de la apuesta mínima de la mesa.
Este scrip es solo para cuando un jugador iguala una apuesta, tengo otros dos para cuando suben o se retiran. Son las tres instrucciones que escriben el valor del stack.

[ENABLE]

aobscanmodule(INJECT,ClientRuntime.dll,00 CC CC 55 8B EC 8B 55 08 8B 02 89 81 E0 00 00 00) // should be unique
alloc(newmem,$1000)
alloc(var1,4)

label(code)
label(return)

var1:
dd #1

newmem:

code:

 mov [ecx+000000E0],eax
 push ebx
   mov ebx,[ecx+000000E0]
   imul ebx,[var1]
   mov [ecx+000000E0],ebx
 pop ebx
 jmp return

INJECT+0B:
 jmp code
 nop
return:
registersymbol(INJECT)
registersymbol(var1)
[DISABLE]

INJECT+0B:
 db 89 81 E0 00 00 00

unregistersymbol(INJECT)
dealloc(newmem)
unregistersymbol(var1)
dealloc(var1)


Con el siguiente scrip cargo el valor en var1

[ENABLE]

aobscanmodule(LeerApuestaMinima,ClientRuntime.dll,89 57 28 8B 4E 5C) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

code:
 mov [edi+28],edx
 mov [var1],edx
 mov ecx,[esi+5C]
 jmp return

LeerApuestaMinima:
 jmp code
 nop
return:
registersymbol(LeerApuestaMinima)

[DISABLE]

LeerApuestaMinima:
 db 89 57 28 8B 4E 5C

unregistersymbol(LeerApuestaMinima)
dealloc(newmem)


Funciona bien con algunos matices.
He utilizado el comando imul, pero en realidad lo que necesito es dividir. No he sido capaz de utilizar los comandos div y idiv.
El segundo problema es que como la instrucción que carga el valor de apuesta mínima es diferente de las de igualar, subir o retirarse pues cuando hay mas de una mesa abierta de distintos niveles pues el valor de var1 va cambiando constantemente y la multiplicación no se realiza por el valor que le corresponde a cada mesa.

He intentado juntar los dos scripts para que antes de realizar la operación lea el valor de la apuesta mínima, pero no he sido capaz.


Espero que podáis ayudarme.

Un saludo,
#3
Buenas,

Estoy tratando de modificar la interfaz de usuario de un soft de escritorio con Cheat Engine.
Necesito dividir el valor de una variable por el valor de otra variable y no consigo realizarlo.

En el siguiente script divido el valor de la variable1 por 4

[ENABLE]

aobscanmodule(script1,ClientRuntime.dll,0C 8B 02 89 81 E0 00 00 00) // should be unique
alloc(newmem,$1000)

label(code)
label(return)
alloc(variable,4)

variable:
         dd #6

newmem:

code:
  mov [ecx+000000E0],eax
  shr [ecx+000000E0],2
  //push eax
  //     mov eax,[variable]
  //     shl [ecx+000000E0],ebx
  //pop eax
  jmp return

script1+03:
  jmp code
  nop
return:
registersymbol(script1)
registersymbol(variable)
[DISABLE]

script1+03:
  db 89 81 E0 00 00 00

unregistersymbol(script1)
dealloc(newmem)
dealloc(variable)


El valor de la segunda variable la tengo que extraer de la siguiente instrucción
ClientRuntime.dll+4DBF0E


Espero que me podáis echar una mano.


Un saludo,
#4
Buenas,

He encontrado tu manual que habla de shared codes, lo he entendido todo, pero no encuentro las instrucciones para lo que quiero hacer.
Te lo comento a ver si me puedes orientar un poco.

En mi juego cuando comienzo una batalla hay puede haber de 2 a 9 jugadores y ademas se pueden disputar varias batallas al mismo tiempo.

En cualquier caso yo lo único que quiero hacer es dividir el valor de la vida de todos los players x una variable que depende de cada batalla. Me explico, battalla 1 nivel 50, quiero que la vida de todos los palyers se divida por 50, batalla 2 nivel 75, quiero que la vida de todos los players se divida por 75.

Esta es la instrucción que accede a  la vida de todos los players que están en las batallas.  ClientRuntime.dll+935C25
Cuando visualizo la ventana "find out what addresses this instruction accesses" se van añadiendo todas las vidas de los jugadores a medida que voy abriendo batallas.

Llegados a este punto no se como continuar y peor aún, no se que buscar para realizar lo que quiero hacer.

Muchas gracias por tu ayuda.

Un saludo,
#5
Buenas,

He seguido viendo ejemplos y por fin he conseguido hacer algo con CE

El problema que tenia es que no era capaz de encontrar la dirección estática de las variables que quería. Lo he solucionado con el siguiente script para auto assemble.
Con este código cambio el valor de una variable a 100, sin importar el cambio de dirección.

[ENABLE]
alloc(stack1,1024)
label(originalcode)
label(exit)
label(returnhere)

stack1:
mov [esi+000000E0],#100
originalcode:
//mov [esi+000000E0],eax

exit:
jmp returnhere

"ClientRuntime.dll"+93600D:
jmp stack1
nop
returnhere:





[DISABLE]
dealloc(stack1)
"ClientRuntime.dll"+93600D:
mov [esi+000000E0],eax


Este esto son los datos de memory viewer  que hay que extraer para elaborarlo analizando la dirección desde find out what writes to this address
ClientRuntime.dll+93600D - 89 86 E0000000        - mov [esi+000000E0],eax

Este es el manual que segui:
https://www.youtube.com/watch?v=Ov37X9Ldn44

Funciona medio bien, me explico, la variable que analizo, no solo cambia cuando es escrita por el proceso que encuentro, entonces en algunos momentos del juego el scrip deja de ser efectivo 100%
He intentado crear el mismo script para las instrucciones que encuentro en find out what accesses to this address, ya que el count de estos aumenta cada segundo pero cada vez que intento activar el script el juego se cierra.

Estos son los dos procesos con los que intento hacer el script y el juego se cierra:
ClientRuntime.dll+935C25 - 81 3A 40420F00        - cmp [edx],000F4240
ClientRuntime.dll+3C18A7 - FF 30                 - push [eax]

No se si es que escribo mal el código ya que la  estructura no es igual o por otra cosa.


Cualquier ayuda sera agradecida.


Un saludo,
#6
Buenas,

Me he leido las 23 páginas, he hecho todos los ejemplos y he buscado nuevos en san google y aún así no puedo modificar las aplicaciones que quiero.

Quiero modificar la visualización, no el valor de la variable, de varios soft de escritorio, pero no he sido capaz de encontrar ni una sola variable.

En vez de  deciros el soft y que lo probéis invirtiendo vuestro tiempo, os quería proponer, a quien le interese, una o dos horas de conexión remota a cambio de una compensación monetaria.

Si alguien esta interesado que me envíe un privado o me agregue a skype.
nick skype: No datos personales

Un saludo,