dianziguan 发表于 2013-7-15 21:33

【D01E03】电子管 反破解教程之三 【用结构化异常SEH代替JMP指令】

本帖最后由 dianziguan 于 2013-7-18 21:19 编辑

用seh来修改eip
程序很简单,代码很少,破解时请不要用修改字符串的方式,这样不好玩。
完整源代码如下:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \MASM32\LIB\oleaut32.lib
include \MASM32\include\oleaut32.inc
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
DlgName db "MyDialog",0
;AppName db "注册程序,(C)电子管 2012.07.15",0
SerialNumber1 db "12345678",0
regNumber1 dd 0,0
mesbok_1 db "哈哈哈哈",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
regbuffer1 db 512 dup(?)
err1 dd ?
ok1 dd ?
.const
IDC_EDIT2      equ 3800
IDC_EDIT3      equ 3801
IDC_BUTTON      equ 3001
IDC_EXIT      equ 3002
.code
_ErrHandlerproc C _lpExceptionRecord, _lpSEH, \
      _lpContext, _lpDispatchContext
    local @szBuffer:byte

    pushad
    movesi, _lpExceptionRecord
    movedi, _lpContext
    assume esi:ptr EXCEPTION_RECORD, edi:ptr CONTEXT
    lea ebx,mesbok_1
                            mov eax,0e1b2a2d7h;注册
                            mov ,eax
                            mov eax,0a6b9c9b3h;成功
                            mov ,eax
                            mov eax,ok1
                            mov.regEip, eax
    assume esi:nothing, edi:nothing
    popad
    moveax, ExceptionContinueExecution
    ret

_ErrHandlerendp

start:
   invoke GetModuleHandle, NULL
mov    hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL,addr DlgProc,NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_INITDIALOG
   invoke SetDlgItemText,hWnd,IDC_EDIT2,ADDR SerialNumber1
      
.ELSEIF uMsg== WM_CLOSE
invoke EndDialog, hWnd,NULL
.ELSEIF uMsg==WM_COMMAND
         
mov edx,wParam
            mov eax,edx
   shr edx,16
   .if dx==BN_CLICKED
    .IF ax==IDC_BUTTON
                        assume fs:nothing
    push offset _ErrHandler
    push fs:
    movfs:, esp
                           mov eax,offset _SafePlace
                           mov ok1,eax
                              invoke GetDlgItemText,hWnd,IDC_EDIT3,ADDR regbuffer1,512
                              push esi
                              mov esi,offset regbuffer1
                              cld
                              lodsd
                              sub eax,30303030h
                              push eax
                              pop edx
                              lodsd
                              sub eax,30303030h
                              add eax,edx
                              sub eax,08080808h
                              mov edx,0
                           cld
                            mov cx,ax
                            div cx
                            mov edi,offset mesbok_1
                            mov eax,0e1b2a2d7h;注册
                            stosd
                            mov eax,0dcb0a7cah; 失败
                            stosd
   
_SafePlace:
    invoke MessageBox, NULL, addr mesbok_1, addr mesbok_1, MB_OK
               popfs:
    popeax

                                             
                     
                      exit_1:invoke EndDialog, hWnd,NULL
                        invoke ExitProcess,eax
                           
                           
                        .ELSEIF ax==IDC_EXIT
   invoke EndDialog, hWnd,NULL
    .ENDIF
   .ENDIF
            
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc endp
end start

小白菜 发表于 2015-5-20 11:33

这个是被除数为0时,触发异常的对吧。关键算法部分
00401107   .2D 30303030   sub eax,0x30303030
0040110C   .03C2          add eax,edx
0040110E   .2D 08080808   sub eax,0x8080808
00401113   .BA 00000000   mov edx,0x0
00401118   .FC            cld
00401119   .66:8BC8       mov cx,ax
0040111C   .66:F7F1       div cx


只要满足cx== 0就可以了 这里反推注册码就很简单;了,还有一种爆破就是将0040112F      AB            stos dword ptr es:这一句给nop掉

dianziguan 发表于 2015-6-13 18:14

小白菜 发表于 2015-5-20 11:33
这个是被除数为0时,触发异常的对吧。关键算法部分
00401107   .2D 30303030   sub eax,0x30303030
0 ...

确实如此

田田圏 发表于 2013-7-15 21:45

qiusuo 发表于 2013-7-15 21:52

不晓得什么是结构化异常

dianziguan 发表于 2013-7-15 21:55

qiusuo 发表于 2013-7-15 21:52 static/image/common/back.gif
不晓得什么是结构化异常

简单一点说,就是程序出错的时候自动转到错误处理程序去执行。

dianziguan 发表于 2013-7-15 21:57

田田圏 发表于 2013-7-15 21:45 static/image/common/back.gif
求教程求回复教程- -好小的文件 不是E的不会破 - -

是用汇编语言写的小程序。很小,也很简单,语句精炼,没有垃圾,是学习od最好的标本。

SxAni丶 发表于 2013-7-15 22:09

本帖最后由 SxAni丶 于 2013-7-16 10:18 编辑

学到了一些知识...

小子2012 发表于 2013-7-15 22:12

00008888

dianziguan 发表于 2013-7-15 22:19

小子2012 发表于 2013-7-15 22:12 static/image/common/back.gif
00008888

祝贺你!看懂了算法。有好多个正确答案的。小程序的目的是演示用seh代替jmp

qiusuo 发表于 2013-7-15 22:42

dianziguan 发表于 2013-7-15 21:55 static/image/common/back.gif
简单一点说,就是程序出错的时候自动转到错误处理程序去执行。

这个真不懂{:1_937:}

不会用鼠标的人 发表于 2013-7-15 22:55

本帖最后由 不会用鼠标的人 于 2013-7-15 23:28 编辑

哈哈,哥们我来了。。虽然有点晚。。。
0040110E   .2D 08080808   sub eax,0x8080808
00401113   .BA 00000000   mov edx,0x0
00401118   .FC            cld
00401119   .66:8BC8       mov cx,ax
0040111C   .66:F7F1       div cx
0040111F      BF 1A304000   mov edi,dzg03.0040301A                   ;注册失败
00401124   .B8 D7A2B2E1   mov eax,0xE1B2A2D7
00401129   .AB            stos dword ptr es:
0040112A   .B8 CAA7B0DC   mov eax,0xDCB0A7CA
0040112F   .AB            stos dword ptr es:
是在这动手脚吧

码:88880000
爆破:   0040111F      BF 1A304000   mov edi,dzg03.0040301A   改为      0040111F    ^\E9 DCFEFFFF   jmp dzg03.00401000

我们可以知道,当注册码错误时,文中红色的代码会接着往下执行,若错误,则会到达上面00401000的“结构异常处理程序”,那我们就可以改为无条件跳转jmp。

页: [1] 2 3
查看完整版本: 【D01E03】电子管 反破解教程之三 【用结构化异常SEH代替JMP指令】