欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

模拟OD获取软件的注册码

程序员文章站 2022-12-04 09:15:05
作 者: organic 最近朋友给了一个软件,让破解一下,软件没什么保护,首先OD打开直接准备下断,结果查找一看发现没有获取编辑框的API函数,再尝试给注册的"确定"按...
作 者: organic
最近朋友给了一个软件,让破解一下,软件没什么保护,首先OD打开直接准备下断,结果查找一看发现没有获取编辑框的API函数,再尝试给注册的"确定"按钮下消息断点,但不知道什么原因没下成功,然后直接用“超级字符串搜索”搜索Unicode字符,查找"无法通过验证",查到后汇编跟随,如下:
 模拟OD获取软件的注册码
往上翻,在“40FCD1 push 2D”处下断,一步步跟,在“0040FCE2   CALL HydroLab.00405430”此条指令执行后ecx中惊现注册码
 模拟OD获取软件的注册码
但是这个软件的注册码在不同的机器上是不同的,本人很懒,找到注册码了就懒得继续去跟了,也懒得去分析软件的算法,但必须给朋友一个在他机子上能正确使用的注册码,那怎么办,懒人有懒方法,我们用OD分析得到了注册码,那我们写一个注册机,模拟OD过程不就同样可以得到注册码。而且在不同的机子上都可以通用。
 
首先看我们用OD搜注册码的过程,我们只要让软件运行到0040FCE2   CALL HydroLab.00405430”此条指令后断下,取ecx的值,然后读其指向的内存,我们就能得到注册码了。
 
下面是代码
 
代码:
DebugProc proc
  local  BPNum:DWORD
 
  mov    BPNum, 0
  invoke  UH_FindProcess, addr szFindWndName
  mov    hFindProcess, eax
  mov    FindProcessID, edx
  .if  eax != 0
   
    invoke  WriteProcessMemory, hFindProcess, BPAddr, addr WrinteBP, 1, NULL          ;在“40FCEF”写入断点 www.2cto.com
    invoke  DebugActiveProcess, FindProcessID                         
;附加进程进入调试
    .while  TRUE
     
      invoke  WaitForDebugEvent, addr strDebugEvent, INFINITE                 
;等待调试信息
      .break  .if strDebugEvent.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
     
      .if  strDebugEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT
       
        mov    strContext.ContextFlags, CONTEXT_FULL
        mov    eax, strDebugEvent.u.CreateProcessInfo.hThread               
;保存调试线程的句柄
        mov    hDebugThread, eax
      .elseif strDebugEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
        .if strDebugEvent.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT 
;捕获调试进程的断点
         
          .if  BPNum > 0                                 
;被调试进程第一次进入调试时会自动产生一个断点信息,忽略
           
            invoke  GetThreadContext, hDebugThread, addr strContext           
;获取调试进程的上下文信息
            invoke  ReadProcessMemory, hFindProcess, strContext.regEcx, addr EditBuffer, 18, NULL    ;读取ecx地址说保存的注册码信息
            invoke  SetDlgItemText, hWinmain, IDC_EDT_OutPut, addr EditBuffer
          .endif 
          inc    BPNum
          invoke  ContinueDebugEvent, strDebugEvent.dwProcessId, strDebugEvent.dwThreadId, DBG_CONTINUE
          .continue
        .endif     
      .endif
      invoke  ContinueDebugEvent, strDebugEvent.dwProcessId, strDebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED
    .endw
  .else
    invoke  MessageBox, NULL, addr szProcessFindfail, NULL, MB_OK
  .endif
 
  ret
DebugProc endp

1、我们先把软件运行起来,然后“40FCEF”的位置(其他位置也可以)写入中断指令“CC”,
这样软件点注册后会中断在这里
2、软件断下来了,那么我们如何获取他的ecx呢,方法有多种,
前面说过我们用模拟OD的方法,那么就用“DebugActiveProcess”附加软件进程,然后用“WaitForDebugEvent”循环捕获软件的断点异常,
由于我们第一次附加进程时调式软件会自动产生一个断点异常,这个断点不是我们要的,
我们加入一个循环计数,判断是否是第一次产生的中断
3、当我们点击软件注册后,软件断下,被我们的注册机捕获断点异常,
然后用“GetThreadContext”获取调试进程的上下文信息,这里包含了调试软件几乎所有的寄存器信息,
我们取ecx后然后读取软件的注册码信息
    代码写得比较简陋,有兴趣的朋友还可以加入自动打开软件然后发送一个注册消息,
模拟软件注册过程,然后自动得到注册码,这里我就不多写了
软件注册码得到后的截图:


模拟OD获取软件的注册码