以前一直在潜水,从论坛上学到了很多东西,也没有为论坛做个贡献。看到大侠们都是用asm、c++、delphi写的loader。
正巧在学习python,看到有一个debug框架,于是用python写了个loader.py.软件破解过程比较简单,就不献丑了。
下面是loader.py源码。
#!/usr/bin/env python
#--*-- coding =utf-8 --*--


"""
Author: <nmweizi@gmail.com>, 2007.1.6
crack xxxxx 11.0.2
xxxxx must install at C:\\Program Files\\SlickEdit\win\\vs.exe
(bp_address,mem_address,s_value,d_value,times,delay,begintime)

Usage:
    python loader.py
"""

import pydbg, time
import os,sys

def busca_pid(dbg, nombre):
    for pid,proc in dbg.enumerate_processes():
            if proc.lower() == nombre.lower(): return pid
    return -1

def modificaDados(dbg):
    global bp_address,mem_address,s_value,d_value,times,delay,begintime
    if dbg.read_process_memory(mem_address,length=1) == s_value and \
        (time.clock()-begintime) >= delay:
        times = times -1 
        if times == 0:
            dbg.write_process_memory(mem_address,d_value,length=1)
            print 'Patched!'
            
            #TODO if use bp_set(bp_address) int 3 then del # at this line
            #dbg.bp_del(bp_address) 
            dbg.bp_del_hw(bp_address) 
            print "Remove breakpoint %s ok!" % hex(bp_address).upper()
    return pydbg.DBG_CONTINUE

def handler_breakpoint (dbg):
    if dbg.first_breakpoint:
        dbg.hide_debugger()
      
        #print "first_breakpoint"
    if dbg.exception_handler_single_step:
        modificaDados(dbg)
    return pydbg.DBG_CONTINUE

def handler_event(dbg):
    if dbg.event_handler_create_process:
        dbg.bp_set_hw(bp_address,2,pydbg.HW_EXECUTE) #not sucessed ,why ?
        #print 'CREATE_PROCESS_DEBUG_EVENT'
    return pydbg.DBG_CONTINUE
    


if __name__ == '__main__':
    global dbg,bp_address,mem_address,s_value,d_value,times,delay,begintime
    
    bp_address,mem_address,s_value,d_value,times,delay,begintime = \
                    (0x406dba,0x406dbc,"\x66","\x67",1,0,time.clock())
    dbg=pydbg.pydbg()
    path = "C:\\Program Files\\SlickEdit\win\\vs.exe"
    cmdline = ""
    if not os.path.exists(path):
        print "File '%s' not exist!" % path
        sys.exit(1)
    
    dbg.set_callback(pydbg.EXCEPTION_BREAKPOINT, handler_breakpoint)
    
    #TODO if use bp_set(bp_address) int 3 then # this line
    dbg.set_callback(pydbg.CREATE_PROCESS_DEBUG_EVENT, handler_event)  
    
    dbg.load(path,cmdline)
    
    #TODO if use bp_set(bp_address) int 3 then del # at this line
    #dbg.bp_set(bp_address)     #int 3

    #winsock_recv     = dbg.func_resolve("ws2_32",  "recv")
    #winsock_recvfrom = dbg.func_resolve("ws2_32",  "recvfrom")
    #dbg.bp_set(winsock_recvfrom)
    #dbg.set_callback(pydbg.USER_CALLBACK_DEBUG_EVENT,modificaDados)
    #dbg.set_callback(pydbg.EXCEPTION_SINGLE_STEP,modificaDados)
    
    dbg.run()
    #dbg.debug_event_loop()