#!only_win32
#-----------------------------------------------+
#                      ._____________________.  |
#   Coded by slav0nic  | slav0nic0@gmail.com |  |    
#                      ^---------------------^  |
# Site: slav0nic.xss.ru                         |
#-----------------------------------------------+
# sl_win_findjsp
# program for searching addresses of "jmp esp/call esp" instructions in DLL-libraries
#ps: for python "exploiters/shellcoders" :)

def help_():
    doc="""\nUsage: sl_win_findjsp.py [library_name]\n
        For analysing all libraries (from lib_name) run without parametrs
        """
    print doc
    
import sys
try:
    import platform             #python >= 2.3
    release=platform.release()
except:
    release="Unknown"
import locale
try:
    from ctypes import *
except:
    print "[-]ctypes module needed"
    print "Download:  http://starship.python.net/crew/theller/ctypes/"
    sys.exit(1)

###############__DEFAULT_CONFIG__############################
lib_name=("comctl32.dll",
          "netapi32.dll",
          "kernel32.dll",
          "advapi32.dll",
          "user32.dll",
          "msvcrt.dll",
          "ws2_32.dll",
          "gdi32.dll"                              
          )
find={"\xff\xd4":"call esp", "\xff\xe4":"jmp esp"}  #format: {instruction : comment}
#!!!! instruction <= "\xff\xff" (2 bytes) & lower case :)
#####################################################
inst=0
PROCESS_ALL_ACCESS = 0x1F0FFF
#import functions from dlls##########################
OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
CloseHandle = windll.kernel32.CloseHandle
#####################################################

if len(sys.argv)>1:
    if sys.argv[1] == "-h":help_();sys.exit(0)
    else:  lib_name = (sys.argv[1],);print lib_name
 
win_ver = sys.getwindowsversion()
win_lang = locale.getdefaultlocale()[0][:3].upper()
pid = windll.kernel32.GetCurrentProcessId()
buffer = c_char_p("_"*2)  
bytesRead = c_ulong(0)
bufferSize =  len(buffer.value)
print "MS %s %s %s %i.%i.%i %s\n"\
    %(sys.platform.capitalize(),release,win_lang,win_ver[0],win_ver[1],win_ver[2],win_ver[4])
processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
for i in range(len(lib_name)):
    address = windll.kernel32.LoadLibraryA(lib_name[i])
    if not address:
        print "[-]Can't load lib %s"%lib_name[i]
        break       
    print "%s[0x%x]\n\t\."%(lib_name[i],address)
    while(1):
        if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
            pass
        else:
           #print "\t|[!debug]End scan addr=%x"%address
            print "\t|"+"-"*25
            break
        for j in range(len(find)):
            if (find.keys()[j] in  buffer.value):
                 print "\t|[+] [0x%x] %s"%(address,find.get(find.keys()[j]))
                 inst += 1
                 #print  "\t|[debug] opcode %r"%buffer.value
            elif ((buffer.value[:1]==find.keys()[j][1]) and  (tmpbuf[1:]==find.keys()[j][0])):                                            
                 print "\t|[+] [0x%x] %s"%(address-1,find.get(find.keys()[j]))  # repr(buffer.value)
                 inst += 1
        tmpbuf = buffer.value #previous buffer
        address += bytesRead.value

CloseHandle(processHandle)
print "[!]Founded %i addresses"%inst


