首页
社区
课程
招聘
做了一个工具,钩住API函数HookDeviceIoControl
发表于: 2006-3-2 14:19 23452

做了一个工具,钩住API函数HookDeviceIoControl

2006-3-2 14:19
23452
有部分软件是通过HookDeviceIoControl来取硬盘序列号的,所以钩住它就可以模拟别人的硬盘号了,钩API时候使用JMP方式,所以如果频繁调用HookDeviceIoControl会出错。
另外我有个帐号boyachang,不知道怎么就变成马甲了,我刚申请那个帐号不久,请版主高抬贵手,能放开么?
http://intelfan.ys168.com

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (39)
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
最初由 Intelfan 发布
另外我有个帐号boyachang,不知道怎么就变成马甲了


论坛不允许一个人注册2个ID,如被发现就称为“马甲”。
这也是为了维护论坛秩序,希望你能理解。
2006-3-2 14:32
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
程序可以在我的网络硬盘下载
http://intelfan.ys168.com/
2006-3-2 15:11
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 Intelfan 发布
程序可以在我的网络硬盘下载
http://intelfan.ys168.com/


你这样肯定出问题,不是只有这个程序只读取硬盘ID号采用这个API.当然出问题了.
2006-3-8 10:58
0
雪    币: 205
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
也就是运行你的HOOK程序后,有些进程下的kerner32.dll里的API被改成JMP了
有的进程下的 API没变
可能是没全局HOOK
2006-3-15 16:41
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵,懒得改了,最初是改IAT的,但是对加了壳的程序不好用,所以用JMP的方式了,从别人现成的代码改的,它调用旧函数时候是要先恢复的,所以在多线程下有问题,其实调用旧函数可以直接执行备份的5个字节,然后JMP到函数的开头+5的位置,不过我很懒,能用就可以了。
2006-3-15 17:16
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
其实一般情况取硬盘ID还是不会出错的,我试了几个软件,钩住后机器码会变的,它不能钩住所有的进程的,它是用SetWindowsHook进入其它进程的,所以只有调用USER32.dll中的函数以后才能被钩住的。
2006-3-15 17:19
0
雪    币: 205
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果可以 可以把哪个DLL 稍稍 改下
2006-3-15 17:52
0
雪    币: 176
活跃值: (1450)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
lz可以开源吗?
2006-6-26 20:47
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
lz 是什么??? 源代码我可以给你的
2006-6-27 09:10
0
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
11
最初由 Intelfan 发布
lz 是什么???


LZ=楼主
2006-6-27 09:50
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
源代码已经放到我的网盘里了,

关于源代码:
此代码是我从网上找的两份代码基础上改的,第一个代码是用IAT来HOOKAPI,对于加壳的软件就无效了,后来我改用JMP方式的,可以对付加壳软件了。

备注:
只要程序调用USER32模块中的函数就会HOOK上的,像CMD就不会被HOOK上。

缺陷:
现在采用的JMP方式我没有改良,它是先恢复JMP指令的数据再执行原来的函数,所以同时有多个程序调用DeviceIOControl会有问题,不过基本上够用了。本人比较懒,够用就不再完善了。

谁能帮我转到论坛上呢?我的网盘还得总维护,太累…

呵呵,别干坏事儿?
2006-6-27 12:09
0
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
最初由 kanxue 发布
论坛不允许一个人注册2个ID,如被发现就称为“马甲”。
这也是为了维护论坛秩序,希望你能理解。

.......是如何知道一个人注册两个id的??
2006-6-27 12:21
0
雪    币: 67
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
通过ip cookie 等等吧
2006-6-27 13:04
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
汗!改什么也别改系统的dll文件呀!
2006-6-27 14:08
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主做了我正在做的,
现在我破一个软件,最后才发现是采用IceLicense
(http://www.ionworx.com/IceLicense.html)
保护的,IceLicense采用的椭圆曲线,想做注册机不太可能了,

但IceLicense采用硬盘ID做机器码,现在用HOOK CreateFile和DeviceIoControl来欺骗系统伪造假ID,还没有完成,希望能指点一二.
2006-6-27 14:27
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
里面可以配置返回的数据,也可以在模拟模式下自动截取硬盘ID数据,试一下行不行,还有你截获CreateFile干什么?
2006-6-27 14:36
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
18
我发一个钩住ExitWindowsEx的DLL源码

改一下就可以钩住别的API的

如下;

=======hookdll.dll==================

.486
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

SEH struct
a  byte ?
api DWORD ?   
d byte ?  
e byte ?
SEH ends

WriteApi proto :DWORD ,:DWORD,:DWORD
MyAPI proto  :DWORD  ,:DWORD

.data
hInstance dd 0
WProcess dd 0
DllName  db "user32.dll",0
ApiName  db "ExitWindowsEx",0

Pmapi DWORD ?
Myapi DWORD ?
template db '%lX',0
posBuffer db 10 dup (0)

.data?
hHook dd ?
hWnd dd ?

.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
    .if reason==DLL_PROCESS_ATTACH
        push hInst
        pop hInstance
        
    invoke   GetCurrentProcess

      mov WProcess ,eax
     invoke  GetModuleHandle,addr DllName
   
     invoke GetProcAddress,eax,addr ApiName
     mov Pmapi,eax
  

invoke WriteApi,WProcess,Pmapi, offset MyAPI

  

.endif
    mov  eax,TRUE
    ret
DllEntry Endp

GetMsgProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    invoke CallNextHookEx,hHook,nCode,wParam,lParam
     mov eax,TRUE
     
      ret
GetMsgProc endp

InstallHook proc
   
    invoke SetWindowsHookEx,WH_GETMESSAGE,addr GetMsgProc,hInstance,NULL
    mov hHook,eax
    ret
InstallHook endp

UninstallHook proc
    invoke UnhookWindowsHookEx,hHook
    ret
UninstallHook endp

WriteApi proc Process:DWORD ,Papi:DWORD,Ptype:DWORD

LOCAL mbi:MEMORY_BASIC_INFORMATION
LOCAL msize:DWORD
LOCAL hacker:SEH

push Ptype
pop hacker.api
mov hacker.a,184
mov hacker.d,255
mov hacker.e,224

;返回虚拟信息
invoke VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION

;修改虚拟保护

invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr mbi.Protect

;修改内存字节

invoke  WriteProcessMemory,Process, Papi, addr hacker,sizeof SEH ,NULL

invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect

ret

WriteApi endp

MyAPI proc  bs:DWORD  ,dwReserved:DWORD

mov eax,TRUE
ret

MyAPI endp

End DllEntry

============================hookdll.def=======================

LIBRARY hookdll
EXPORTS InstallHook
EXPORTS UninstallHook
EXPORTS GetMsgProc

=============================================================

LINK.EXE /SECTION:.bss[S] /DLL /DEF:$6 /SUBSYSTEM:WINDOWS /LIBPATH:"$L" /OUT:"$7",3

2006-6-27 18:32
0
雪    币: 176
活跃值: (1450)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 Intelfan 发布
源代码已经放到我的网盘里了,

关于源代码:
此代码是我从网上找的两份代码基础上改的,第一个代码是用IAT来HOOKAPI,对于加壳的软件就无效了,后来我改用JMP方式的,可以对付加壳软件了。

........


呵呵,谢谢楼主(lz)。
2006-6-27 21:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
最初由 Intelfan 发布
里面可以配置返回的数据,也可以在模拟模式下自动截取硬盘ID数据,试一下行不行,还有你截获CreateFile干什么?


ICE 采用以下四种方式获得ID, 我本想HOOK CreateFileb比Hook DeviceIoControl按全一点。
就HOOK CreateFile 使得CreateFile("\\.\C:")和CreateFile("\\.\Scsi0:")是返回空的,就可以迫使ICE系统采用GetVolumeInformationA。

正在学习你的代码,谢谢。

for I:=1 to 4 do
  begin
    case I of
    1: //1: DeviceIoControl(    "\\.\C:"
    begin
      DiskSerialNumber := DeviceIoInfor.GetDiskCSerialNumber();
      ShowMessage('\.\C:   '+ DiskSerialNumber);
    end;
    2: //1: DeviceIoControl(    "\\.\Scsi0:"
    begin
      DiskSerialNumber := DeviceIoInfor.GetIDEDiskSerialNumber();
      ShowMessage('Scsi0   '+ DiskSerialNumber);
    end;
    3: //3: GetVolumeInformationA    "c:\"
    begin
      DiskSerialNumber := DeviceIoInfor.GetVolumeInforID();
      ShowMessage('c:\   '+ DiskSerialNumber);
    end;
    else
      DiskSerialNumber := 'Error';
      ShowMessage('Error   '+ DiskSerialNumber);
    end;
    if DiskSerialNumber <> '' then
    begin
      break;
    end;
  end;
2006-6-28 20:10
0
雪    币: 1489
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我的代码还不能用于CreateFile,因为系统调用CreateFile太频繁了,而现在的JMP方式不完善,我自己做完HOOK CreateFile的东西,不过如果把调用旧的CreateFile的那段完善一下,应该可以的。
2006-6-29 09:13
0
雪    币: 215
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
JMP -> 你的代码
首先EnterCriticalSection
然后改成以前的代码
然后进入原程序执行
执行完后LeaveCriticalSection
就OK了。
HOOK方式缺陷太多,建议放弃。。。
2006-6-29 10:42
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
23
最初由 蓝色光芒 发布
JMP -> 你的代码
首先EnterCriticalSection
然后改成以前的代码
然后进入原程序执行
执行完后LeaveCriticalSection
........

除了这种方法以外还可以挂载一个微型反汇编器 得到多于8个字节的完整汇编指令长度  处理完成以后先加载这段代码然后跳到8个字节后边的代码执行
2006-7-1 17:57
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
其实所有系统api 都要处理多线程同步问题, 你就当自己在写api 就行了, 入口和出口加上 多线程互斥的机制就ok 了, 和api 内部运行一样的原理
2006-7-1 20:32
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
有delphi的代码学习一下吗
2006-7-1 21:28
0
游客
登录 | 注册 方可回帖
返回
//