吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9541|回复: 12
收起左侧

[其他转载] FASM 汇编 - 64 位 version.dll 劫持代码

  [复制链接]
爱飞的猫 发表于 2017-1-15 08:11
本帖最后由 jixun66 于 2017-1-15 08:12 编辑

使用 FASM 编译通过,能正常使用。
用的是 Beyond Compare 4 以前找的特征码,只是过了联网验证,有没有效没仔细检查,不过通过 x64dbg 检查后的确把我想修改的地方改掉了。

[Asm] 纯文本查看 复制代码
; Beyond Compare v4.1.9 (build 21719)
; 网络校验黑名单去除
; 
; FASM BC4.ASM version.dll

format PE64 GUI DLL;
entry DllEntryPoint;

use64;
include 'win64a.inc';

section '.text' code readable executable;

; 修复导出表项
; 参数: 模块句柄, 函数名, 写出偏移(qword 大小)
macro apifix hMod,sz,fn
  {
  mov rdx, sz                ; proc name
  mov rcx, hMod              ; hLib
  call [GetProcAddress]
  mov qword[fn], rax
  };

; 利用 VirtualProtect 修改目标区域为可读写执行
; 修改完后再恢复其保护。
; 参数: 修改地址(地址偏移), 保护长度, 储存旧保护的地址, 
;       数据宽度(byte/word/dword/qword), 写出数据
macro fixCode lpAddr,len,oldProtect,dataWidth,data
  {
    lea rax, oldProtect
    invoke VirtualProtect, lpAddr, len, PAGE_EXECUTE_READWRITE, rax
    
    mov rax, lpAddr
    mov dataWidth [rax], data
    
    lea rax, oldProtect
    invoke VirtualProtect, lpAddr, len, dword[rax], rax
  };

; 修复导出的 API 地址
proc FixImport
  local hModule:QWORD
  local lpBuffer:QWORD

  frame
    invoke LocalAlloc, LPTR, MAX_PATH + 1
    mov [lpBuffer], rax
    invoke GetSystemDirectory, rax, MAX_PATH
    invoke strncat, [lpBuffer], szTargetLibrary, MAX_PATH
    invoke LoadLibrary, [lpBuffer]
    mov [hModule], rax
    invoke LocalFree,[lpBuffer]
  
    apifix [hModule], szGetFileVersionInfoA, _GetFileVersionInfoA
    apifix [hModule], szGetFileVersionInfoByHandle, _GetFileVersionInfoByHandle
    apifix [hModule], szGetFileVersionInfoExW, _GetFileVersionInfoExW
    apifix [hModule], szGetFileVersionInfoSizeA, _GetFileVersionInfoSizeA
    apifix [hModule], szGetFileVersionInfoSizeExW, _GetFileVersionInfoSizeExW
    apifix [hModule], szGetFileVersionInfoSizeW, _GetFileVersionInfoSizeW
    apifix [hModule], szGetFileVersionInfoW, _GetFileVersionInfoW
    apifix [hModule], szVerFindFileA, _VerFindFileA
    apifix [hModule], szVerFindFileW, _VerFindFileW
    apifix [hModule], szVerInstallFileA, _VerInstallFileA
    apifix [hModule], szVerInstallFileW, _VerInstallFileW
    apifix [hModule], szVerLanguageNameA, _VerLanguageNameA
    apifix [hModule], szVerLanguageNameW, _VerLanguageNameW
    apifix [hModule], szVerQueryValueA, _VerQueryValueA
    apifix [hModule], szVerQueryValueW, _VerQueryValueW
    apifix [hModule], szVerQueryValueIndexA, _VerQueryValueIndexA
    apifix [hModule], szVerQueryValueIndexW, _VerQueryValueIndexW
  endf;
      
  ret
endp;

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
  local hModule:QWORD
  local oldProtect:DWORD
  local lpBuffer:QWORD
  cmp edx, 1
  jnz skipPatch
  
  ; 检测是否为目标进程
  frame
    invoke LocalAlloc, LPTR, MAX_PATH + 1
    mov [lpBuffer], rax
    invoke GetModuleFileName, NULL, rax, MAX_PATH
    invoke strstr, [lpBuffer], szTargetExeName
    mov dword[oldProtect], eax
    invoke LocalFree,[lpBuffer]
  endf
  
  cmp dword[oldProtect], 0
  jz skipPatch
    
  frame
    ; 取得当前主程序句柄
    invoke GetModuleHandle,NULL
    mov [hModule], rax
    
    ; 00000000012D0D99 | B0 00                    | mov al,0
    add rax, 0xED0D9A ; offset
    mov [lpBuffer], rax
    
    fixCode [lpBuffer], 1, [oldProtect], byte, 0x00
    
    ; 00000000017EEADE | B0 00                    | mov al,0
    mov rax, [hModule]
    add rax, 0x13EEADF ; offset
    mov [lpBuffer], rax
    
    fixCode [lpBuffer], 1, [oldProtect], byte, 0x00
    
    ; 写出 Shell Code, 让其在加载授权信息时显示我们想要的信息。
    ; 因为要修改好几个到好几个地方,所以还是手动算了
    mov rax, [hModule]
    add rax, 0x7E9170 ; offset
    mov [lpBuffer], rax
    
    ; 准备
    lea rax, [oldProtect]
    invoke VirtualProtect, [lpBuffer], 0x10, PAGE_EXECUTE_READWRITE, rax
    
    ; 修改
    mov rax, [lpBuffer]
    mov word[rax], 0xB848
    add rax, 2
    mov qword[rax], fnPatchName
    add rax, 8
    mov dword[rax], 0x02EBD0FF
    
    ; 还原
    lea rax, [oldProtect]
    invoke VirtualProtect, [lpBuffer], 0x10, dword[rax], rax
  endf
  
skipPatch:
  call FixImport
  mov eax,TRUE
  ret
endp

; 修改关于界面的显示信息回调
proc fnPatchName
  local base:QWORD
  local oldProtect:DWORD
  local lpBuffer:QWORD
    ; rcx = target
    ; rcx+1A0h: user name
    ; rcx+F0h : Serial
    mov [base], rcx
    
    mov rax, [rcx + 0x1A0]
    mov [lpBuffer], rax

    invoke strncpy, [lpBuffer], szLicenseName, 0x0E
    
    mov rax, [base]
    mov rax, [rax + 0xF0]
    mov [lpBuffer], rax
    invoke strncpy, [lpBuffer], szSerialNumber, 0x0A

    leave
    ; 继续程序原本的初始化代码
    xor rax, rax
    mov [rbp + 0x30], rax
    mov [rbp + 0x40], rax
    retn
endp

; 导出函数, 全是跳转
_exp_GetFileVersionInfoA:           jmp [                _GetFileVersionInfoA  ]
_exp_GetFileVersionInfoByHandle:    jmp [        _GetFileVersionInfoByHandle   ]
_exp_GetFileVersionInfoExW:         jmp [                _GetFileVersionInfoExW]
_exp_GetFileVersionInfoSizeA:       jmp [            _GetFileVersionInfoSizeA  ]
_exp_GetFileVersionInfoSizeExW:     jmp [            _GetFileVersionInfoSizeExW]
_exp_GetFileVersionInfoSizeW:       jmp [            _GetFileVersionInfoSizeW  ]
_exp_GetFileVersionInfoW:           jmp [                _GetFileVersionInfoW  ]
_exp_VerFindFileA:                  jmp [                       _VerFindFileA  ]
_exp_VerFindFileW:                  jmp [                       _VerFindFileW  ]
_exp_VerInstallFileA:               jmp [                    _VerInstallFileA  ]
_exp_VerInstallFileW:               jmp [                    _VerInstallFileW  ]
_exp_VerLanguageNameA:              jmp [                   _VerLanguageNameA  ]
_exp_VerLanguageNameW:              jmp [                   _VerLanguageNameW  ]
_exp_VerQueryValueA:                jmp [                     _VerQueryValueA  ]
_exp_VerQueryValueW:                jmp [                     _VerQueryValueW  ]
_exp_VerQueryValueIndexA:           jmp [                _VerQueryValueIndexA  ]
_exp_VerQueryValueIndexW:           jmp [                _VerQueryValueIndexW  ]

; 常数
section '.szdb' data readable;
  szTargetExeName db "\BCompare.exe", 0
  szTargetLibrary db "\version.dll",  0
  szLicenseName   db "FASM v1.71.54", 0
  szSerialNumber  db "8888-8888",     0

  szGetFileVersionInfoA         db "GetFileVersionInfoA",         0
  szGetFileVersionInfoByHandle  db "GetFileVersionInfoByHandle",  0
  szGetFileVersionInfoExW       db "GetFileVersionInfoExW",       0
  szGetFileVersionInfoSizeA     db "GetFileVersionInfoSizeA",     0
  szGetFileVersionInfoSizeExW   db "GetFileVersionInfoSizeExW",   0
  szGetFileVersionInfoSizeW     db "GetFileVersionInfoSizeW",     0
  szGetFileVersionInfoW         db "GetFileVersionInfoW",         0
  szVerFindFileA                db "VerFindFileA",                0
  szVerFindFileW                db "VerFindFileW",                0
  szVerInstallFileA             db "VerInstallFileA",             0
  szVerInstallFileW             db "VerInstallFileW",             0
  szVerLanguageNameA            db "VerLanguageNameA",            0
  szVerLanguageNameW            db "VerLanguageNameW",            0
  szVerQueryValueA              db "VerQueryValueA",              0
  szVerQueryValueW              db "VerQueryValueW",              0
  szVerQueryValueIndexA         db "VerQueryValueIndexA",         0
  szVerQueryValueIndexW         db "VerQueryValueIndexW",         0

; 跳转地址储存
section '.expw' data readable writeable;
  _GetFileVersionInfoA              dq ?
  _GetFileVersionInfoByHandle       dq ?
  _GetFileVersionInfoExW            dq ?
  _GetFileVersionInfoSizeA          dq ?
  _GetFileVersionInfoSizeExW        dq ?
  _GetFileVersionInfoSizeW          dq ?
  _GetFileVersionInfoW              dq ?
  _VerFindFileA                     dq ?
  _VerFindFileW                     dq ?
  _VerInstallFileA                  dq ?
  _VerInstallFileW                  dq ?
  _VerLanguageNameA                 dq ?
  _VerLanguageNameW                 dq ?
  _VerQueryValueA                   dq ?
  _VerQueryValueW                   dq ?
  _VerQueryValueIndexA              dq ?
  _VerQueryValueIndexW              dq ?

section '.idata' import data readable writeable; \          Version.dll 劫持补丁
  library kernel,'KERNEL32.DLL',                  \
    msvc,'msvcrt.dll';                             \       FASM 1.71.54 编译通过
                     ;                              \      测试于 BC4 可正常使用
  import kernel,                                     \
   VirtualProtect,'VirtualProtect',                   \
   LocalAlloc,'LocalAlloc',                            \
   LocalFree,'LocalFree',                               \
   GetModuleHandle,'GetModuleHandleA',                   \
   LoadLibrary,'LoadLibraryA',                            \
   GetProcAddress,'GetProcAddress',                        \
   GetModuleFileName,'GetModuleFileNameA',                  \
   GetSystemDirectory,'GetSystemDirectoryA';                 \         Jixun.Moe

  import msvc,        \
     strstr,'strstr',  \
     strncpy,'strncpy', \
     strncat,'strncat'

section '.edata' export data readable;                        \  52破解 & 飘云阁
  export 'version.dll',                                        \
    _exp_GetFileVersionInfoA,       'GetFileVersionInfoA',      \
    _exp_GetFileVersionInfoByHandle,'GetFileVersionInfoByHandle',\
    _exp_GetFileVersionInfoExW,     'GetFileVersionInfoExW',      \
    _exp_GetFileVersionInfoSizeA,   'GetFileVersionInfoSizeA',     \
    _exp_GetFileVersionInfoSizeExW, 'GetFileVersionInfoSizeExW',    \
    _exp_GetFileVersionInfoSizeW,   'GetFileVersionInfoSizeW',       \
    _exp_GetFileVersionInfoW,       'GetFileVersionInfoW',            \
    _exp_VerFindFileA,              'VerFindFileA',                    \
    _exp_VerFindFileW,              'VerFindFileW',                     \
    _exp_VerInstallFileA,           'VerInstallFileA',                   \
    _exp_VerInstallFileW,           'VerInstallFileW',                    \
    _exp_VerLanguageNameA,          'VerLanguageNameA',                    \
    _exp_VerLanguageNameW,          'VerLanguageNameW',                     \
    _exp_VerQueryValueA,            'VerQueryValueA',                        \
    _exp_VerQueryValueW,            'VerQueryValueW',                         \
    _exp_VerQueryValueIndexA,       'VerQueryValueIndexA',                     \
    _exp_VerQueryValueIndexW,       'VerQueryValueIndexW'

section '.reloc' data fixups readable discardable;


代码与编译后的 bin 文件 (改名 version.dll 扔到软件目录后运行就行)。
BC4.asm.bin.7z (3.58 KB, 下载次数: 134)

2017-01-15.png

IDA 伪代码看起来美美的:
version.png

免费评分

参与人数 6威望 +1 吾爱币 +17 热心值 +6 收起 理由
那年我高三 + 2 + 1 收藏啦~
晓晓——笑笑 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Hmily + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Monitor + 1 + 1 我很赞同!
zpfttkl + 2 + 1 支持支持啦
榻榻米 + 1 + 1 xiaojun大牛无所不能~

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

朱朱你堕落了 发表于 2017-11-25 10:01
jixun66 发表于 2017-11-25 07:01
xp 跑不起来 version.dll,还是要 lpk.dll 引导;因此推荐用 Win7 + 的导出函数。

我个人是把两个版本 ...

感谢您的回复,

xp上跑不起来version.dll,要LPK引导,看来比较麻烦啊,当然我也不知道具体是怎么实现的,那就不先纠结这个了。

那换个msimg32吧,如果是制作一个能通用WIN7,XP两个平台的32位的msimg32,

您的意思是,尽量使用WIN7,以WIN7以上的平台,如 WIN8,WIN10的sysWOW下32位的msimg32来制作吗。
用高版本的来制作是为了,向下兼容WIN7吧?

如果是XP的,需要也弄一份,相当于是单独一份,但是为了在两个平台上都能使用,
是把两份都相同的导出函数,放在一起,,

但是如果是不同的导出函数,那要怎么弄?XP上,WIN7上msimg32的导出函数肯定有不一样的,
那这部分的导出函数要如何处理呢?
 楼主| 爱飞的猫 发表于 2017-11-27 02:15
朱朱你堕落了 发表于 2017-11-25 10:01
感谢您的回复,

xp上跑不起来version.dll,要LPK引导,看来比较麻烦啊,当然我也不知道具体是怎么实现 ...

msimg32.dll 引导取决于程序有没有加载这个文件;XP 下 的 lpk.dll 以及 Win7+ 的 version.dll 都会随着程序启动自动加载。

version.dll 我选择两个版本的导出函数都合并,因为不同的系统有不同的函数导出,避免可能存在的不兼容问题。一般来说导出函数不会更变太多的。
cxqdly 发表于 2017-1-15 15:06
zqguang3708 发表于 2017-1-15 20:06
哇哇哇 太棒了  膜拜大神
Hmily 发表于 2017-1-16 15:57
之前做的通杀32,后面更新64了,赞一个!
cxqdly 发表于 2017-1-17 01:07
Hmily 发表于 2017-1-16 15:57
之前做的通杀32,后面更新64了,赞一个!

H大,X64的dll有发布过吗 我只看到过32的

点评

没有,楼主这不是发了吗。  详情 回复 发表于 2017-1-17 10:55
Hmily 发表于 2017-1-17 10:55
cxqdly 发表于 2017-1-17 01:07
H大,X64的dll有发布过吗 我只看到过32的

没有,楼主这不是发了吗。
thymefly 发表于 2017-5-22 18:37
在最新的4.2.2下不起作用了。
其实还有个思路就是无限期试用,它回读注册表里一个值。这个值注册表没有就从当前日期开始并新建。
cxqdly 发表于 2017-7-3 12:56
把bin文件改么为version.dll吗  没有作用呀@jixun66
 楼主| 爱飞的猫 发表于 2017-7-4 03:31
cxqdly 发表于 2017-7-3 12:56
把bin文件改么为version.dll吗  没有作用呀@jixun66

新版失效了吧
朱朱你堕落了 发表于 2017-11-24 14:35
@jixun66 大神,问个问题,如果要生成32位的version.dll劫持补丁,要用WIN7,sysWOW64文件夹下32位的version.dll来生成,还是
用XP上的version.dll来生成劫持代码?用哪个来生成,WIN7和XP上都能劫持成功?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 08:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表