VBGood网站全文搜索 Google

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

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 2700|回复: 1

像任意外部程序注入API ,也就是主动让他LoadLibraryA

[复制链接]
发表于 2014-1-7 19:01:14 | 显示全部楼层 |阅读模式
本帖最后由 zgneng 于 2014-1-7 19:24 编辑

win7下很稳定 ,老外写的一个源码

就是XP 一注入,注入的进程会自动崩溃,大家看下什么原因,高手修复下

源码奉上 320.rar (9.17 KB, 下载次数: 487)

本帖被以下淘专辑推荐:

发表于 2015-4-27 12:10:39 | 显示全部楼层
本帖最后由 dahual 于 2015-4-27 12:12 编辑

类似思路写出的代码很多,这个确实写的很好。
Win7下也不可能“很稳定”,只是“凑巧稳定”而已。
  1. addr = VirtualAllocEx(ByVal hProcess, ByVal 0&, ByVal UBound(abAsm) + 1, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
复制代码
这句中的页面属性标志PAGE_READWRITE 修改为PAGE_EXECUTE_READWRITE 就可以了。
  1. Private Const PAGE_READWRITE = &H4&
  2. Private Const PAGE_EXECUTE_READWRITE = &H40
复制代码
  1. 'Main function which do the job
  2. Private Function CallFunctionRemote(ByVal hProcess As Long, ByVal func_addr As Long, _
  3.                                     ByVal nParams As Long, data() As API_DATA, _
  4.                                     Optional ByVal dwTimeOut As Long = INFINITE) As Long
  5.    Dim hThread As Long, ThreadId As Long
  6.    Dim addr As Long, ret As Long, h As Long, i As Long
  7.    Dim codeStart As Long
  8.    Dim param_addr() As Long
  9.    
  10.    If nParams = 0 Then
  11.       CallFunctionRemote = CallFunctionRemoteOneParam(hProcess, func_addr, 0, 0, 0, 0)
  12.    ElseIf nParams = 1 Then
  13.       CallFunctionRemote = CallFunctionRemoteOneParam(hProcess, func_addr, 1, _
  14.                            data(0).lpData, data(0).dwDataLength, data(0).argType, _
  15.                            data(0).bOut)
  16.    End If
  17.    
  18.    ReDim abAsm(50 + 6 * nParams)
  19.    ReDim param_addr(nParams - 1)
  20.    lCP = 0
  21.    addr = VirtualAllocEx(ByVal hProcess, ByVal 0&, ByVal UBound(abAsm) + 1, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
  22.    
  23.    codeStart = GetAlignedCodeStart(addr)
  24.    lCP = codeStart - addr
  25.    For i = 0 To lCP - 1
  26.        abAsm(i) = &HCC
  27.    Next
  28.    PrepareStack 1 'remove ThreadFunc lpParam
  29.    Dim s As String
  30.    s = "MessageBoxA" & Chr(0)
  31.    For i = nParams To 1 Step -1
  32.        AddByteToCode &H68 'push wwxxyyzz
  33.        If data(i - 1).argType = arg_Value Then
  34.           If data(i - 1).dwDataLength > 4 Then
  35.              MsgBox "Arguments passing as Value should not exeed 4 bytes (long)", vbCritical
  36.              GoTo CleanUp
  37.           End If
  38.           AddLongToCode data(i - 1).lpData
  39.        Else
  40.           param_addr(i - 1) = VirtualAllocEx(ByVal hProcess, ByVal 0&, _
  41.                               ByVal data(i - 1).dwDataLength, MEM_RESERVE Or MEM_COMMIT, _
  42.                               PAGE_READWRITE)
  43.           If param_addr(i - 1) = 0 Then GoTo CleanUp
  44.           If WriteProcessMemory(hProcess, ByVal param_addr(i - 1), ByVal data(i - 1).lpData, _
  45.                                data(i - 1).dwDataLength, ret) = 0 Then GoTo CleanUp
  46.           AddLongToCode param_addr(i - 1)
  47.        End If
  48.    Next
  49.    AddCallToCode func_addr, addr + VarPtr(abAsm(lCP)) - VarPtr(abAsm(0))
  50.    AddByteToCode &HC3
  51.    AddByteToCode &HCC
  52.    If WriteProcessMemory(hProcess, ByVal addr, abAsm(0), UBound(abAsm) + 1, ret) = 0 Then GoTo CleanUp
  53.    'hThread = CreateRemoteThread(hProcess, 0, 0, ByVal codeStart, data(0).lpData, 0&, ThreadId)
  54.    hThread = CreateRemoteThread(hProcess, 0, 0, ByVal codeStart, param_addr(0), 0&, ThreadId)
  55.    Debug.Print Hex(codeStart), Hex(data(0).lpData)
  56.    If hThread Then
  57.       ret = WaitForSingleObject(hThread, dwTimeOut)
  58.       If ret = 0 Then ret = GetExitCodeThread(hThread, h)
  59.    End If
  60.    CallFunctionRemote = h
  61.    For i = 0 To nParams - 1
  62.        If param_addr(i) <> 0 Then
  63.           If data(i).bOut Then
  64.              ReadProcessMemory hProcess, ByVal param_addr(i), ByVal data(i).lpData, data(i).dwDataLength, ret
  65.           End If
  66.        End If
  67.    Next i
  68. CleanUp:
  69.    VirtualFreeEx hProcess, ByVal addr, 0, MEM_RELEASE
  70.    For i = 0 To nParams - 1
  71.        If param_addr(i) <> 0 Then VirtualFreeEx hProcess, ByVal param_addr(i), 0, MEM_RELEASE
  72.    Next i
  73. End Function
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-8-14 07:40

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