首页
社区
课程
招聘
请教oep大侠,你写的《也谈 HOW TO CODE A LOADER》文中有些困惑
发表于: 2006-8-10 19:37 4829

请教oep大侠,你写的《也谈 HOW TO CODE A LOADER》文中有些困惑

2006-8-10 19:37
4829
最近也想写的一个与你文中类似的内存注册机,有一些问题:

就是在你的代码中
invoke  WriteProcessMemory,pi.hProcess,040B8E1h,addr newtext,1,NULL
这一句是直接在要注册的程序代码中加入int 3,这样岂不是程序原来代码被改变了,另外int 3的机器码我在OD中看是3cd,int 3的机器码倒底是什么,如果是3cd,这是两个字节怎么插入到程序中。呵呵,有些东西可能我还没搞明白。望能给说说,另外 我说一说我写这个内存注册机的思路:
有一个程序:
00408502    80A5 CCF9FFFF>and byte ptr ss:[ebp-634],0
00408509    8B3D D8A08D00 mov edi,dword ptr ds:[<&MSVCRT._strlwr>]         ; msvcrt._strlwr
0040850F    8D85 C4F9FFFF lea eax,dword ptr ss:[ebp-63C]
00408515    50            push eax <--------这里放着注册码
00408516    FFD7          call edi
00408518    8D85 C4FDFFFF lea eax,dword ptr ss:[ebp-23C]
0040851E    50            push eax
0040851F    FFD7          call edi
00408521    59            pop ecx
00408522    59            pop ecx
00408523    50            push eax
00408524    8D85 C4F9FFFF lea eax,dword ptr ss:[ebp-63C]
0040852A    50            push eax

想做一个程序,在前面插入int 3指令,把Eax中的注册码读出来。
程序代码如下:
.386
   .model flat,stdcall
   option casemap:none
   include \masm32\include\windows.inc
   include \masm32\include\kernel32.inc
   include \masm32\include\comdlg32.inc
   include \masm32\include\user32.inc
   includelib \masm32\lib\kernel32.lib
   includelib \masm32\lib\comdlg32.lib
   includelib \masm32\lib\user32.lib
   .data
   AppName db "zwcad 2006 pro Cracker v0.1",0
   int_3 db 0cch
   value   db 8 dup(?)
   BUFFER  db 8 dup(?)
   oldbyte1 db 8 dup(?)
   ofn OPENFILENAME <>
   FilterString db "Executable Files",0,"*.exe",0
                db "All Files",0,"*.*",0,0
   ExitProc db "The debuggee exits",0
   NewThread db "A new thread is created",0
   EndThread db "A thread is destroyed",0

   testmsg     db "OK" ,0

   ProcessInfo db "File Handle: %lx ",0dh,0Ah
               db "Process Handle: %lx",0Dh,0Ah
               db "Thread  Handle: %lx",0Dh,0Ah
               db "Image   Base: %lx",0Dh,0Ah
               db "Start   Address: %lx",0
   .data?
   buffer db 512 dup(?)
   startinfo STARTUPINFO <>
   pi PROCESS_INFORMATION <>
   DBEvent DEBUG_EVENT <>
   context CONTEXT <>

   .code
   start:
   mov ofn.lStructSize,sizeof ofn
   mov ofn.lpstrFilter, offset FilterString
   mov ofn.lpstrFile, offset buffer
   mov ofn.nMaxFile,512
   mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
   invoke GetOpenFileName, ADDR ofn
   .if eax==TRUE
    invoke GetStartupInfo,addr startinfo
    invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE,\
                      DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS, NULL, NULL,\
                      addr startinfo, addr pi
.while TRUE
       invoke WaitForDebugEvent, addr DBEvent, INFINITE
       .if DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT
          invoke  WriteProcessMemory,pi.hProcess,0408515h,addr int_3,1,NULL
          invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId,DBG_CONTINUE
          .continue
       .elseif DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
          ;invoke wsprintf, addr buffer, addr ExitProc, TotalInstruction
          ;invoke MessageBox, 0, addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION
          .break
       .elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT
           .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT
             mov context.ContextFlags, CONTEXT_FULL
             invoke GetThreadContext, pi.hThread, addr context
             int 3
             .if     context.regEip == 0408515h
              int 3
              dec     context.regEip
              invoke ReadProcessMemory,pi.hProcess,eax,addr value,4,NULL
              invoke MessageBox, 0, addr BUFFER, addr AppName, MB_OK+MB_ICONINFORMATION
              mov eax,offset value
              invoke ReadProcessMemory,pi.hProcess,eax,addr BUFFER,08h,NULL
              invoke SetThreadContext,pi.hThread, addr context  
              invoke  CloseHandle,pi.hProcess
              invoke  CloseHandle,pi.hThread
              ;invoke TerminateProcess,pi.hProcess,-1      
            
              .elseif  context.regEip == 040B8E2h
              dec     context.regEip
              invoke  WriteProcessMemory,pi.hProcess,040B8E1h,addr oldbyte1,1,NULL
              mov eax,context.regEsi
              invoke  WriteProcessMemory,pi.hProcess,eax,addr BUFFER,0Dh,NULL
              invoke SetThreadContext,pi.hThread, addr context  
              invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
              ;.continue
              .break  
             .endif
             .endif
       .endif
      
      invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId,DBG_CONTINUE
.endw
          invoke  CloseHandle,pi.hProcess
          invoke  CloseHandle,pi.hThread         ;再次调用CloseHandle,你能明白原因的:)

   .endif
   invoke ExitProcess, 0
   end start
--------------
但运行得不到想要的结果,不知哪里出错,望大侠给点指导。谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这么长时间都没有人回。
还好我把写好的这个内存注册机已写出来了。
这个注册机的原理是:
1.保存在OD跟踪到的注册码的代码位置下一条两个字节的指令。因为我们要插入Int 3
2.在OD跟踪到的注册码的代码位置的下一条插入两个字节的int 3(3cdh)
3.然后再这个中断发生后,读出我们要的注册码,再改Eip的值
4.再把代码改成原来的

现把代码贴出来,大家共享。
=================================
.386
   .model flat,stdcall
   option casemap:none
   include \masm32\include\windows.inc
   include \masm32\include\kernel32.inc
   include \masm32\include\comdlg32.inc
   include \masm32\include\user32.inc
   includelib \masm32\lib\kernel32.lib
   includelib \masm32\lib\comdlg32.lib
   includelib \masm32\lib\user32.lib
   .data
   AppName db "zwcad 2006 pro Cracker v0.1",0
   int_3 dw 03cdh
   oldcode db 2 dup(?)
   value   db 8 dup(?)
   BUFFER  db 8 dup(?)
   oldbyte1 db 8 dup(?)
   ofn OPENFILENAME <>
   FilterString db "Executable Files",0,"*.exe",0
                db "All Files",0,"*.*",0,0
   ExitProc db "The debuggee exits",0
   NewThread db "A new thread is created",0
   EndThread db "A thread is destroyed",0

   testmsg     db "OK" ,0

   ProcessInfo db "File Handle: %lx ",0dh,0Ah
               db "Process Handle: %lx",0Dh,0Ah
               db "Thread  Handle: %lx",0Dh,0Ah
               db "Image   Base: %lx",0Dh,0Ah
               db "Start   Address: %lx",0
   .data?
   buffer db 512 dup(?)
   startinfo STARTUPINFO <>
   pi PROCESS_INFORMATION <>
   DBEvent DEBUG_EVENT <>
   context CONTEXT <>

   .code
   start:
   mov ofn.lStructSize,sizeof ofn
   mov ofn.lpstrFilter, offset FilterString
   mov ofn.lpstrFile, offset buffer
   mov ofn.nMaxFile,512
   mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
   invoke GetOpenFileName, ADDR ofn
   .if eax==TRUE
    invoke GetStartupInfo,addr startinfo
    invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE,\
                      DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS, NULL, NULL,\
                      addr startinfo, addr pi
.while TRUE
       invoke WaitForDebugEvent, addr DBEvent, INFINITE
       .if DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT
          invoke  ReadProcessMemory,pi.hProcess,0408516h,addr oldcode,2,NULL
          invoke  WriteProcessMemory,pi.hProcess,0408516h,addr int_3,2,NULL
          invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId,DBG_CONTINUE
          .continue
       .elseif DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
          ;invoke wsprintf, addr buffer, addr ExitProc, TotalInstruction
          ;invoke MessageBox, 0, addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION
          .break
       .elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT
           .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT
             mov context.ContextFlags, CONTEXT_FULL
             invoke GetThreadContext, pi.hThread, addr context
             .if  context.regEip == 0408518h
              dec context.regEip
              dec context.regEip
              invoke ReadProcessMemory,pi.hProcess,context.regEax,addr value,8,NULL
              invoke MessageBox,0, addr value,addr AppName, MB_OK+MB_ICONINFORMATION
              invoke WriteProcessMemory,pi.hProcess,context.regEip,addr oldcode,2,NULL
              invoke SetThreadContext,pi.hThread, addr context
              invoke  CloseHandle,pi.hProcess
              invoke  CloseHandle,pi.hThread
              ;invoke TerminateProcess,pi.hProcess,-1      
              invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
              .continue
             .endif
             .endif
       .endif
      
      invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId,DBG_CONTINUE
.endw
          invoke  CloseHandle,pi.hProcess
          invoke  CloseHandle,pi.hThread         ;再次调用CloseHandle,你能明白原因的:)

   .endif
   invoke ExitProcess, 0
   end start
=====================
2006-8-12 12:45
0
雪    币: 5115
活跃值: (2573)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
好几天没来了,所以才看到,抱歉

1、INT3指令是一个字节CC,你说的3CDH应该 INT 3
2、调试程序流程很简单的:
A、启动程序,在启动的同时修改程序,插入CC断点;
B、等待调试事件的发生。调试事件发生时候,比较EIP是否是我们需要的EIP-1,如果是,说明到达了我们需要的断点,恢复EIP,读取被调试程序内存中的数据,否则继续调试,直到中断在我们需要的位置;
C、结束被调试的程序,然后把我们读取的数据进行变幻或者在我们自己的程序里显示出来,就OK了。
2006-8-14 21:14
0
游客
登录 | 注册 方可回帖
返回