[软件]不详细透露,狗的版本,不详。Usb狗,大概是2008年的。
[工具]OD,MASM
首先谈谈加密狗。加密狗,是一个硬件,内部大概xxxx,很多的细节,我也不太了解。
在windows平台访问一个硬件,首先要访问设备驱动,要访问一个设备驱动首先要做的就是CreateFile.打开一个设备驱动。然后使用DeviceIoControl.
恩,明白了这点后,我们就知道,只要挂接deviceIoControl就可以截获其通信流了。
下边先发一个挂接DeviceIoControl的历程,破解硬盘帮定的历程。
我感觉,几乎所有物理硬件硬盘帮定,都可以使用其。破之
;在此文档的文档工具栏项目上单击右键->参数属性
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include shlwapi.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
includelib shlwapi.lib
HookApi PROTO :DWORD,:DWORD,:DWORD
MyDeviceIoControl PROTO
MyCreateProcessA PROTO
.data
lpszByDll db "Welcome",0
lpHookDll db "kernel32.dll",0
szDeviceIoControl db "DeviceIoControl",0
szCreateProcessA db "CreateProcessA",0
szExplorer db 'c:\windows\explorer.exe',0
szCmpProc db 'c:\windows\system32\check.exe',0
dbRedDate1 db 01h,01h,00h,04h,07h,00h,00h,00h,0FAh,0C1h,0E3h,2Dh,82h,0DCh,\
86h,0BFh,78h,0DAh,4Ah,0E2h,78h,0A8h,5Eh,0E2h,0
dbRedDate2 db 01h,01h,00h,04h,07h,00h,00h,00h,0E8h,22h,0D3h,8Ah,00h,00h,00h,\
00h,00h,00h,00h,00h,05h,00h,00h,84h
dbReadDate11 db 00h,02h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
5Ah,0Ch,0FFh,3Fh,37h,0C8h,10h,00h,00h,00h,00h,00h,3Fh,00h,00h,00h,\
00h,00h,00h,00h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h
r12 db 52h,35h,30h,59h,35h,52h,35h,36h,00h,00h,00h,40h,04h,00h,2Eh,33h,\
41h,41h,20h,46h,20h,20h,54h,53h,32h,33h,30h,35h,31h,33h,41h,30h,\
20h,53h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h
r13 db 20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,10h,80h,\
00h,00h,00h,2Fh,00h,40h,00h,02h,00h,02h,07h,00h,0FFh,3Fh,10h,00h,\
3Fh,00h,10h,0FCh,0FBh,00h,10h,01h,0FFh,0FFh,0FFh,0Fh,00h,00h,07h,00h
r14 db 03h,00h,78h,00h,78h,00h,78h,00h,78h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,1Fh,00h,02h,05h,00h,00h,48h,00h,40h,00h,\
0FEh,00h,00h,00h,6Bh,34h,01h,7Dh,23h,40h,68h,34h,01h,0BCh,23h,40h
r15 db 7Fh,20h,00h,00h,00h,00h,0FEh,0FEh,0FEh,0FFh,00h,00h,00h,0D0h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,70h,59h,1Ch,1Dh,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,40h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
r16 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,1Eh,40h,\
1Ch,40h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
09h,00h,70h,59h,1Ch,1Dh,70h,59h,1Ch,1Dh,20h,20h,02h,00h,0B6h,02h
r17 db 02h,00h,8Ah,00h,06h,3Ch,0Ah,3Ch,00h,00h,0C6h,07h,00h,01h,00h,08h,\
14h,13h,00h,12h,02h,00h,80h,00h,00h,00h,00h,00h,80h,00h,02h,02h,\
00h,00h,04h,04h,00h,00h,00h,00h,00h,00h,00h,00h,00h,1Dh,0Bh,00h
r18 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
r19 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,01h,00h,00h,00h
r1a db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
r1b db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,0a5h,8fh
r1c db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
dbReadDate22 db 00h,02h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
5Ah,0Ch,0FFh,3Fh,37h,0C8h,10h,00h,00h,00h,00h,00h,3Fh,00h,00h,00h,\
00h,00h,00h,00h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h
r22 db 52h,35h,30h,59h,35h,52h,35h,36h,00h,00h,00h,40h,04h,00h,2Eh,33h,\
41h,41h,20h,46h,20h,20h,54h,53h,32h,33h,30h,35h,31h,33h,41h,30h,\
20h,53h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h
r23 db 20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,10h,80h,\
00h,00h,00h,2Fh,00h,40h,00h,02h,00h,02h,07h,00h,0FFh,3Fh,10h,00h,\
3Fh,00h,10h,0FCh,0FBh,00h,10h,01h,0FFh,0FFh,0FFh,0Fh,00h,00h,07h,00h
r24 db 03h,00h,78h,00h,78h,00h,78h,00h,78h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,1Fh,00h,02h,05h,00h,00h,48h,00h,40h,00h,\
0FEh,00h,00h,00h,6Bh,34h,01h,7Dh,23h,40h,68h,34h,01h,0BCh,23h,40h
r25 db 7Fh,20h,00h,00h,00h,00h,0FEh,0FEh,0FEh,0FFh,00h,00h,00h,0D0h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,70h,59h,1Ch,1Dh,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,40h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
r26 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,1Eh,40h,\
1Ch,40h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
09h,00h,70h,59h,1Ch,1Dh,70h,59h,1Ch,1Dh,20h,20h,02h,00h,0B6h,02h
r27 db 02h,00h,8Ah,00h,06h,3Ch,0Ah,3Ch,00h,00h,0C6h,07h,00h,01h,00h,08h,\
14h,13h,00h,12h,02h,00h,80h,00h,00h,00h,00h,00h,80h,00h,02h,02h,\
00h,00h,04h,04h,00h,00h,00h,00h,00h,00h,00h,00h,00h,1Dh,0Bh,00h
r28 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
r29 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,01h,00h,00h,00h
r2a db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
r2b db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,\
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,0a5h,8fh
r2c db 00h,00h,00h,00h,33h,2Eh,41h,41h,46h,00h,33h,31h
lpError db "pg error",0
lpJMP db 0e9h,00h,00h,00h,00h,90h,90h
.data?
hInstance dd ?
pDeviceIoControl dd ?
pCreateProcessA dd ?
hKernel32 dd ?
pProcName db MAX_PATH dup (?)
bFlag dd ?
.CODE
;入口.如果DLL需要加载资源,需要保存hIinstDLL这个句柄到全局变量.它才是模块句柄
;使用GetModuleHandle获得的永远是主程序的句柄
LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
.if reason == DLL_PROCESS_ATTACH ;动态库被加载时调用,返回0加载失败!
mov eax,hInstDLL
mov hInstance,eax
; invoke MessageBox,NULL,addr lpError,addr lpError,MB_OK
;hook DeviceIoControl
;invoke GetModuleFileName,NULL,addr pProcName,MAX_PATH
;invoke MessageBox,NULL,addr pProcName,addr pProcName,MB_OK
invoke LoadLibrary,addr lpHookDll
mov hKernel32,eax
invoke GetProcAddress,hKernel32,addr szDeviceIoControl
mov pDeviceIoControl,eax
invoke GetProcAddress,hKernel32,addr szCreateProcessA
mov pCreateProcessA,eax
mov eax,MyDeviceIoControl
invoke HookApi,eax,pDeviceIoControl,7h
mov eax,MyCreateProcessA
invoke HookApi,eax,pCreateProcessA,5h
mov eax,TRUE
ret
.elseif reason == DLL_PROCESS_DETACH
.elseif reason == DLL_THREAD_ATTACH
.elseif reason == DLL_THREAD_DETACH
;添加处理代码
.endif
ret
LibMain Endp
;供主程序调用的函数
MsgBox proc hWnd,lpszText,fStyle
invoke MessageBox,hWnd,lpszText,offset lpszByDll,fStyle
ret
MsgBox endp
HookApi proc MyAdd:DWORD,HookAdd:DWORD,WriteLen:DWORD
local @OldPro:DWORD
local @mbi:MEMORY_BASIC_INFORMATION
local @temp:DWORD
local @hCurPro:DWORD
local @DWWRITE:DWORD
invoke VirtualQuery,HookAdd,addr @mbi,sizeof MEMORY_BASIC_INFORMATION
cmp eax,0
jz Error
invoke VirtualProtect,@mbi.BaseAddress,@mbi.RegionSize,PAGE_EXECUTE_READWRITE,addr @OldPro
cmp eax,0
jz Error
;hook code
mov eax,MyAdd
mov ebx,HookAdd
sub eax,ebx
sub eax,5
mov @temp,eax
;anay machin code addr
lea ecx,lpJMP
mov DWORD ptr[ecx+1],eax
;hook
;invoke MemCopy,HookAdd,addr lpJMP,5
invoke GetCurrentProcess
mov @hCurPro,eax
invoke WriteProcessMemory,@hCurPro, HookAdd, addr lpJMP, WriteLen,addr @DWWRITE
;
; this error
invoke VirtualProtect,@mbi.BaseAddress,@mbi.RegionSize,@OldPro,addr @OldPro
cmp eax,0
jz Error
jmp Succe
Error:
invoke MessageBox,NULL,addr lpError,addr lpError,MB_OK
mov eax,0
ret
Succe:
mov eax,1
ret
HookApi endp
MyDeviceIoControl proc
pushad
pushfd
;24h是原始入口 在这里边不能使用messagebox等函数 因为messagebox本来也会引发这个操作
; invoke MessageBox,NULL,addr lpError,addr lpError,MB_OK
mov ebx,DWORD ptr [esp+2ch]
.if ebx == 74080h;判断是不是SMART_GET_VERSION
mov ecx,bFlag
.if ecx ==FALSE;记数复位
mov edi,DWORD ptr [esp+38h];out buffer
mov ecx,18h
lea esi,dbRedDate1
rep movs BYTE ptr[edi],BYTE ptr[esi]
popfd
popad
;恢复堆栈
pop ecx
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
push ecx
mov eax,1
ret
.elseif ecx == TRUE
mov edi,DWORD ptr [esp+38h];out buffer
mov ecx,18h
lea esi,dbRedDate2
rep movs BYTE ptr[edi],BYTE ptr[esi]
popfd
popad
;恢复堆栈
pop ecx
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
push ecx
mov eax,1
ret
.endif
.elseif ebx == 0007C088h;判断是不是SMART_RCV_DRIVE_DATA
mov ecx,DWORD ptr[esp+3ch]
.if ecx != 213h;判断接受buffer长度是不是213h.如果是的话,如果不是就恢复执行正常流程
popfd
popad
jmp GO_HOME
.endif
mov ecx,bFlag;计数复位
.if ecx == FALSE
mov edi,DWORD ptr [esp+38h];out buffer
mov ecx,21ch
lea esi,dbReadDate11
rep movs BYTE ptr[edi],BYTE ptr[esi]
popfd
popad
mov bFlag,TRUE
;恢复堆栈
pop ecx
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
push ecx
mov eax,1
ret
.elseif ecx == TRUE
mov edi,DWORD ptr [esp+38h];out buffer
mov ecx,21ch
lea esi,dbReadDate22
rep movs BYTE ptr[edi],BYTE ptr[esi]
popfd
popad
mov bFlag,FALSE
;恢复堆栈
pop ecx
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
push ecx
mov eax,1
ret
.endif
.endif
; invoke MessageBox,NULL,addr lpError,addr lpError,MB_OK
;执行恢复过程
popfd
popad
GO_HOME:
push 14h
push 7C810CC8h
;这里只能使用ecx寄存器
mov ecx, pDeviceIoControl
add ecx,7h
jmp ecx
ret
MyDeviceIoControl endp
MyCreateProcessA proc
pushad
pushfd
;24h是原始入口
; mov ebx,DWORD ptr [esp+2ch]
; invoke MessageBox,NULL,ebx,ebx,MB_OK
lea eax,dbReadDate11
lea eax,dbRedDate2
mov ebx,DWORD ptr [esp+2ch]
invoke StrCmpN,addr szCmpProc,ebx,30
.if eax == FALSE
;修改
mov edi,DWORD ptr [esp+2ch]
mov ecx,30
lea esi,szExplorer
rep movs BYTE ptr[edi],BYTE ptr [esi]
.endif
popfd
popad
GO_HOME:
mov edi,edi
push ebp
mov ebp,esp
mov eax,pCreateProcessA
add eax,5h
jmp eax
ret
MyCreateProcessA endp
End LibMain
大概就是这个样子,狗,的话。我后边慢慢谈杂破。
从某种意义上来说,从通信级破解,是最好的解决方法,以后的话,我们我们只有关注随机变量和软件通信验证算法了。
待续..
[课程]FART 脱壳王!加量不加价!FART作者讲授!