Notas de estudio de Pocket Journey to the West

El maestro de la clase en línea dijo que el número de más de 70 horas de clase estaba bloqueado, eh. . . Piense en ello como una revisión de OD

Revisión de OD

e: Lista de módulos, puede ver todos los archivos DLL llamados
t: Línea de subproceso: puede ver todos los subprocesos en ejecución
k: Lista de pila: Puede ver todas las llamadas llamadas
b: Lista de puntos de interrupción: Puede ver todos los puntos de ajuste de rupturas
c: Ventana de CPU / ventana de código

Entrada: se completó la creación de la ventana principal / de inicio / se completó la creación del subprograma
OD abre la entrada principal del programa de la siguiente manera:
00B755E2> / $ 55 push ebp

Presione el botón e anterior para encontrar la entrada ELEMENTCLIENT.EXE de la siguiente manera:
Módulos ejecutables, entrada 32
dirección base = 00400000
tamaño = 00950000 (9764864.)
entrada = 00B755E2 ELEMENTC.
Nombre = ELEMENTC
ruta = D: \ kdxy \ setup \ pocket hacia el oeste journey \ element \ ELEMENTCLIENT.EXE Después de
abrir el proceso adicional ce, buscamos en el rango de 00400000 a 00D50000, todas las direcciones verdes

Si el proceso adicional no se puede ejecutar,
presione el botón t arriba y haga clic derecho para reiniciar todos los hilos.

Presione el botón c arriba para regresar a la interfaz principal
ctrl + gy luego ingrese la dirección para saltar directamente a la dirección de destino.
Ingrese enviar para ubicar directamente la función de
envío . Si el envío no se puede ubicar , ingrese WS2_32.send y presione Enter

Encuentre el lugar donde no haya nadie para interrumpir y guarde el paquete sin enviarlo.
Tome el medicamento, interrumpa el paquete y luego ctrl + F9 puede saltar a la última instrucción de la función de envío.
Presione Enter para regresar a la siguiente instrucción de llamar enviar 0x00666850

00666830   .  53            push ebx
00666831   .  56            push esi
00666832   .  8BF1          mov esi,ecx
00666834   .  57            push edi
00666835   .  6A 00         push 0x0                                 ; /Flags = 0
00666837   .  8B46 10       mov eax,dword ptr ds:[esi+0x10]          ; |
0066683A   .  8B48 04       mov ecx,dword ptr ds:[eax+0x4]           ; |
0066683D   .  8B50 08       mov edx,dword ptr ds:[eax+0x8]           ; |
00666840   .  8B46 04       mov eax,dword ptr ds:[esi+0x4]           ; |
00666843   .  8BD9          mov ebx,ecx                              ; |
00666845   .  2BD3          sub edx,ebx                              ; |
00666847   .  52            push edx                                 ; |DataSize = 856FDDC (139918812.)
00666848   .  51            push ecx                                 ; |Data = 0A29A465
00666849   .  50            push eax                                 ; |Socket = 0x3
0066684A   .  FF15 B868BE00 call dword ptr ds:[<&WS2_32.#send_19>]   ; \send
00666850   .  8BD8          mov ebx,eax

Presione ctrl + f9 nuevamente para saltar al final de la función, y presione Enter para saltar a la siguiente instrucción de la llamada anterior. Si presiona la tecla incorrecta, puede usar la tecla-para regresar a la instrucción señalada anterior (ya sea se puede saltar ctrl + f9 o enter. De regreso a la instrucción que acabo de señalar) De
esta manera, encontramos múltiples llamadas en un bucle, le damos la primera, segunda, tercera ... cada punto de interrupción de llamada, presione el botón b arriba para ver todos los puntos de interrupción
entrados en el punto de interrupción deshacer, comer ¡El punto de interrupción de la entrada de drogas es lo que está buscando! Siempre que sea un punto de interrupción que solo se puede ingresar al tomar un medicamento, ¡se puede llamar de forma remota en el hilo! ¡Observe el empuje en las primeras líneas y depure con inyección de código!

Cómo encontrar una llamada en una llamada: llamar con medicamento, es decir, reemplazar el medicamento con una llamada.
Encontrar una llamada rápidamente: detenerse en la función de envío, llamar y presionar el botón k arriba para analizar todas las llamadas.

Interrumpa al comienzo de la función de envío, haga doble clic en la dirección de la pila en la esquina inferior derecha, puede convertirse en - ->, ->,- ->, +4, $ + 8, etc.
Observamos que se pasan cuatro parámetros: socket, data, datasize y flags, si podemos analizar la dirección de cada parámetro, ¡podemos implementar cada tipo de llamada!
La interrupción al comienzo de la función de envío se cambia a una interrupción condicional, como [ESP + 0x0C] == 0x0B, ¡intente uno por uno!
Hay diferentes tamaños de datos para la pausa para caminar, la pausa sin movimiento, la pausa por clic, la pausa por ataque y la pausa del medicamento. Simplemente escriba el valor de pausa correspondiente.

eax es generalmente el valor de retorno de la llamada, una pequeña parte puede ser ecx
ecx generalmente se usa para almacenar la dirección base del objeto (como la espada Dugu en el nuevo amor de espadachín)
ebx y edx son más rápidos de leer y escribir, nada especial

Finalice la depuración después de adjuntar el proceso: haga clic con el botón derecho en el área de código-strongOD-detach
OD Habilidades básicas: conozca f7 y f8 y f9 para ejecutar, ctrl + f9 e ingrese y para saltar, código de segmento int3 y condiciones para interrumpir, segmento de datos memoria (fácil No usar si se detecta) y hardware (romper en la siguiente línea de la instrucción para acceder a los datos de la memoria) para interrumpir, los botones de arriba ven las
funciones básicas de ensamblaje de diferentes interfaces de ventana : mov (valor de paso) y lea ( pasar la dirección), presione x (sub esp, 4 + mov [esp], x) y pop x (mov x, [esp] + add esp, 4), llame a x (presione eip + jmp x) y retn (pop eip ) y retn x (pop eip + add esp, x)

Haga clic con el botón derecho en el área de código, busque, comentarios definidos por el usuario (puede ver todos los comentarios de código),
haga clic con el botón derecho en el área de código, busque, todas las constantes (puede ver todos los códigos que usan la dirección verde)

Cuando vea [ebp + 2C] en OD, primero debe juzgar si ebp es la parte inferior de la pila de funciones o el desplazamiento. ebp y el área de la pila en la esquina inferior derecha se colocan en la parte superior de la pila (llamada push eip) y la línea superior (encabezado de función push ebp) es la misma que
el área de la pila en la esquina inferior derecha. Si es para la llamada recién saltada, el lado derecho de la instrucción en la parte superior de la pila será "call return xxx", y luego habrá llaves para encerrar el parámetro pasado junto con las siguientes líneas. Después de que esta función tiene un push, el "call return xxx" no es la parte superior de la pila que se
ve al buscar el código retn, para distinguir entre retn la siguiente línea de código no es la entrada de la función, haga clic en el análisis de código, para ver si habrá una flecha jmp arriba apuntando hacia ella , sí, esa es la misma función (por lo general, el medio no es int3 La misma función) Al
buscar el código, verá retn. Preste atención para distinguir si la siguiente línea de retn es una entrada de función. ctrl + f9-retorno de carro -la línea anterior apunta a la entrada del carro de llamada para la entrada de la función, compare con la siguiente línea de retn justo ahora ¿Son iguales (generalmente lo anterior es int3 es el encabezado de la función)

Cuando vea [esp + 10] en el OD, debe darse cuenta de que necesita mirar el código y buscar el cuarto empujón, (esp es la parte superior de la pila, y busque cuatro direcciones en la esquina inferior derecha de el área de la pila (4B como unidad). valor)

En OD, vea mov edx, [eax + 2C] y la línea anterior es call, tenga cuidado de que eax sea probablemente el valor de retorno de call

Cuando se llama a una llamada remota, el registro mov antes de la llamada depende de si el valor del registro se llama en el cuerpo de la función o si es un parámetro. Cuando se
llama a una llamada remota, la operación de esp después de la llamada depende de si el cuerpo de la función es automático o no. Pila plana como retn 10, o use OD para el paso F8 antes y después de CALL para ver si el esp antes de empujar y después de la llamada son iguales, también puede saber si la pila se aplana automáticamente

假设现在的场景如下(所有指令与值都假设为1B)
设10处指令执行时ebp与esp的值都是08
11    push eax
12    push ecx
13    push edx
14    call 0xF4
15    inc a
      ....
F4    push ebp
F5    mov ebp,esp
      ....
FE    pop ebp
FF    retn 3

我们知道call x(push eip + jmp x)
所以在执行F4处的指令前栈顶会有一个大括号括着四行
依次是eip的值即15,edx的值,ecx的值,eax的值
当前栈:(ebp=08,esp=04)
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

F4处压入ebp保护起来,此时栈顶的值是08,然后是15
当前栈:(ebp=08,esp=03)
03  08
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

我们知道esp永远是指向栈顶的,即此时esp的值是03
F5处把esp赋给ebp,则ebp的值也是03,指向本段函数的栈底
此时就回到了esp与ebp相等的情况(开始时的两个值都是08)
当前栈:(ebp=03,esp=03)
03  08
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

假设本段函数没有再调用子函数,没有对栈进行操作,一直到FE处
FE处pop ebp还原ebp的值为08,即上层函数的栈底,esp由于退栈地址增加变成04
当前栈:(ebp=08,esp=04)
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

我们知道retn x相当于pop eip + add esp,x
首先eip=15,esp由于退栈地址增加变成05
当前栈:(ebp=08,esp=05)
05  edx
06  ecx
07  eax
08  ...
(补充说明:如果只是retn没有x,则第地址为15处的指令就该是add esp,3)

然后esp再add增加把三个输入的参数退掉
当前栈:(ebp=08,esp=08)
08  ...

假如上面的程序调整为:
F4    push ebp
F5    mov ebp,esp
F6    sub esp,04
      ....
FD    add esp,04
FE    pop ebp
FF    retn 3

解释:
F6的作用就是给局部变量开辟空间
FD的作用就是给局部变量释放空间

我们要区分出变量与参数,假如在执行到F8处时:
当前栈:(ebp=03,esp=02)
02  DD
03  08
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...
我们凭借OD右下角栈区中(返回到15)来进行分界
在04处(返回到15)下面的是传入参数,[ebp+08],[ebp+0C],...
在04处(返回到15)上面的是局部变量,[ebp-04],[ebp-08],...
注意如果是用esp来定位栈区地址的话esp只有加没有减的,要小心计算

Supongo que te gusta

Origin blog.csdn.net/cj1064789374/article/details/114542717
Recomendado
Clasificación