不想通宵 发表于 2022-8-29 10:34

带壳的程序,使用内存补丁工具。如果程序是动态基址的,补丁那地址怎么填呢?

某带壳程序在XP下是固定基址,比如找到打补丁地址是00421000。
但是在WIN7.10上去试,这个程序打开时基址是动态变化的,这个内存补丁就写入不正确了。

看了论坛的几个带壳打内存补丁的工具,貌似都是填写固定地址,没有根据RVA,OFFSET之类的去填地址呢。

bester 发表于 2022-8-29 16:11

springwillow 发表于 2022-8-29 15:21
现在的大部分破解补丁都存在这个问题,我觉得主要问题在于获得dll库的加载时机问题,早了可能dll库还没有加 ...

我补充一下你的说法吧,确实你说的这个dll库加载时机是个大问题 这个是比较特殊的情况(破解点在DLL库且主程序和DLL库带强壳内存保护和调试检测以及DLL库在主程序启动时进行验证),然而大部分程序基本上还是以破解主模块为主,当然了即使是有部分DLL验证 也没有说像上面我说的这么复杂 基本都是无壳或者说不在主程序启动时进行验证,所以降低了大部分难度,上面我所说的最特殊的情况其实也有解,但不是特别通用,基本上如果说是主程序带强壳保护加调试检测和动态基址或者是DLL库后加载的情况(不需要在主程序启动时破解)做通用补丁工具是不难的,多加一个GetMoudleBase直接搞定所有

springwillow 发表于 2022-8-29 15:21

现在的大部分破解补丁都存在这个问题,我觉得主要问题在于获得dll库的加载时机问题,早了可能dll库还没有加载,晚了可能已经调用完了(对于程序运行起来后再调用的库没有关系)。所以可能需要监测LoadLibrary加载的库名称或者特定的解密过程,加载或解秘后立即进行补丁,但是这样就需要调用调试加载,而调试加载会被壳认为是在调试破确程序,可能会被反调试,还需要进行反反调试,问题会变的越来越复杂。
期待高手能做出比较通用的内存补丁程序。最好是支持64位的,32位程序越来越少了。

Hmily 发表于 2022-8-29 10:56

@jy04468108 写的补丁工具不支持自动获取基地址吗?现在的补丁工具确实应该都写rva合适一些。

fanvalen 发表于 2022-8-29 11:17

没有固定地址且无法读懂基址,就要用机器码数组匹配,所以你需要弄一个唯一的机器码数组

不想通宵 发表于 2022-8-29 11:23

工具在writeprocessmemory补丁时,地址可以取GetMoudleBase和默认00400000动态计算下呀。
或者 在制作 补丁时,填地址旁边打个复选框 []RVA。

现在很多APP都用了ASLR啊,为啥补丁工具不修改下呢?

不想通宵 发表于 2022-8-29 11:25

本帖最后由 不想通宵 于 2022-8-29 11:31 编辑

@Hmily

看你说的那位jy04468108写的补丁工具,也是填的固定地址呀。

我感觉这种给 带壳的动态基址的程序打内存补丁,很常见呀,为啥没人问呢。。。


试了给那个加了VMP的程序改PE的Dllcharactertrics=0x8100,试图去掉动态加载, 保存后结果提示程序被破坏。

Hmily 发表于 2022-8-29 12:35

不想通宵 发表于 2022-8-29 11:25
@Hmily

看你说的那位jy04468108写的补丁工具,也是填的固定地址呀。


这种自校验的壳肯定不行了,看看等他更新下吧。

wgz001 发表于 2022-8-29 13:02

试一下这个工具
https://down.52pojie.cn/Tools/Patchers/Baymax.Patch.Tools.v2.9.7.5.rar

jy04468108 发表于 2022-8-29 13:25

本帖最后由 jy04468108 于 2022-8-29 13:32 编辑

Hmily 发表于 2022-8-29 10:56
@jy04468108 写的补丁工具不支持自动获取基地址吗?现在的补丁工具确实应该都写rva合适一些。
支持的,因为很多人不知道偏移怎么算,所以我索性就让他填基地址,然后自己算了一遍的。

jy04468108 发表于 2022-8-29 13:30

不想通宵 发表于 2022-8-29 11:25
@Hmily

看你说的那位jy04468108写的补丁工具,也是填的固定地址呀。

@Hmily 软件里有让填写基地址,保存的时候会计算偏移的。不然何必填基地址。
页: [1] 2
查看完整版本: 带壳的程序,使用内存补丁工具。如果程序是动态基址的,补丁那地址怎么填呢?