El código que mencionas en teoría es un ciclo que recorre todas las secciones.
Seguro esta parte no te gusta mucho:
RtlMoveMemory Pish, bvBuff(Pidh.e_lfanew + 248 + 40 * i), Len(Pish)
Bueno el ciclo va desde 0 hasta el número de secciones:
(Rpidh.e_lfanew + 248 + 40* i) -> Corresponde a lo siguiente:
- l_fanew apunta al inicio de NT_HEADERS, lo reconoces por la firma PEx0x0
- +248 -> te ubica justo al inicio de la tabla de secciones.
- +40*i -> como sabes por jerarquía de operadores se hace primero la multiplicación, la i corresponde a la sección y el 40 al tamaño (40*(i=0)) = 0, l_fanew + 248 + 0 será de donde se lea la primera sección.
RtlMoveMemory constantemente cambiará el valor de la estructura
Pish, esta estructura tendrá valores distintos a cada vuelta del ciclo ya que como mencionamos estamos recorriendo la declaración de las secciones.
WriteProcessMemory toma en varios de sus parámetros datos de la estructura y posteriormente copia en memoria, las secciones inician en ImageBase + VirtualAddress y tienen tamaño VirtualSize.
Así que eso, es copiar en memoria las secciones del buffer pero se hace como corresponde en memoria usando los datos del IMAGE_SECTION_HEADER. Si quieres aclarar tus dudas sobre secciones te invito a participar de este taller:
http://foro.elhacker.net/analisis_y_diseno_de_malware/taller_en_construccionsecciones_en_archivos_pe-t362515.0.html
Un saludo,
Iván Portilla.