【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
这个是被除数为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掉
小白菜 发表于 2015-5-20 11:33
这个是被除数为0时,触发异常的对吧。关键算法部分
00401107 .2D 30303030 sub eax,0x30303030
0 ...
确实如此 不晓得什么是结构化异常 qiusuo 发表于 2013-7-15 21:52 static/image/common/back.gif
不晓得什么是结构化异常
简单一点说,就是程序出错的时候自动转到错误处理程序去执行。 田田圏 发表于 2013-7-15 21:45 static/image/common/back.gif
求教程求回复教程- -好小的文件 不是E的不会破 - -
是用汇编语言写的小程序。很小,也很简单,语句精炼,没有垃圾,是学习od最好的标本。 本帖最后由 SxAni丶 于 2013-7-16 10:18 编辑
学到了一些知识... 00008888 小子2012 发表于 2013-7-15 22:12 static/image/common/back.gif
00008888
祝贺你!看懂了算法。有好多个正确答案的。小程序的目的是演示用seh代替jmp dianziguan 发表于 2013-7-15 21:55 static/image/common/back.gif
简单一点说,就是程序出错的时候自动转到错误处理程序去执行。
这个真不懂{:1_937:}
本帖最后由 不会用鼠标的人 于 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。