cndml 发表于 2022-8-11 14:08

X64重定位表修复---X64DBG脚本分享

本帖最后由 cndml 于 2022-8-11 14:09 编辑

一、前言:
      随着64位程序的普及,64位的壳也越来越多,在32位时代有个重定位修复工具RELOX,只要把程序不同基址加载两次,然后dump出来,用relox比较一下就可以得到完整的重定位表,64位下一直也没见relox更新,伸手党看来做不了了,那就自己来解决。
二、LET'S DO IT
   重定位表其实不复杂,64位下代码段不需要重定位,重定位表是按内存页存储的,跟32位没啥不同,写个程序有点复杂,不如用脚本简单,由于x64dbg脚本不支持字符串,为提高运行效率只能混合汇编来实现,dump出的两个不同基址文件分别命名为1.dat,2.dat,存放到调试程序目录下,然后载入脚本运行,成功的话,会在调试器x64目录下生成一个reloc.bin文件,脚本调试在win7 64位下通过,写的比较简单,没有出错提示信息,一点调试基础没有的可能用起来各种错误,好在脚本不长,稍微学习一下就能看懂,欢迎大家补充修改!
//////////////////////////////////////////
var addfile1
var addfile2
var hwndfile1
var hwndfile2
var sizefile1
var sizefile2
var lpCreateFileA
var lpGetFileSize
var lpVirtualAlloc
var lpReadFile
var store
var addreloc
var reloc
var sizereloc
//bc
///////////////////////////////////////
gpa "CreateFileA","kernel32.dll"
mov lpCreateFileA ,$RESULT
gpa "GetFileSize","kernel32.dll"
mov lpGetFileSize ,$RESULT
gpa "VirtualAlloc","kernel32.dll"
mov lpVirtualAlloc ,$RESULT
gpa "ReadFile","kernel32.dll"
mov lpReadFile,$RESULT      
/////////////////////////////////
alloc 1000
mov store,$RESULT
mov rip,store+30
//fill store,90,0x200
/////////////////read file/////////////////////
mov 8:,2E32007461642E31
mov 8:,746164
mov 8:,lpCreateFileA
mov 8:,lpGetFileSize
mov 8:,lpVirtualAlloc
mov 8:,lpReadFile
mov 8:, C03360EC83485340
mov 8:, 45FFFFFFC10D8D48
mov 8:, 894803408D44C933
mov 8:, 2024448944302444
mov 8:, 00000080282444C7
mov 8:, AD15FF80000000BA
mov 8:, 48E88B4890FFFFFF
mov 8:, 6C89486674FFF883
mov 8:, FFCD8B48D2333824
mov 8:, F06348FFFFFF9B15
mov 8:, 7489484E74FFFE83
mov 8:, D68B48C933484024
mov 8:, B94100001000B841
mov 8:, FFD68B4800000004
mov 8:, D88B48FFFFFF7B15
mov 8:, 4489482674C08548
mov 8:, D08B48C68B444824
mov 8:, 202444C748CD8B48
mov 8:, 244C8D4C00000000
mov 8:, 85FFFFFF5915FF50
mov 8:, 90909090900575C0
mov 8:, 9090909090909090
bp store+d8
bp store+d3
run
cmp rip,store+d8
jne exit
mov addfile1,
mov hwndfile1,
mov sizefile1,
fill store+3b,C7,1
mov rip,store+30
run
cmp rip,store+d8
jne exit
mov addfile2,
mov hwndfile2,
mov sizefile2,
cmp sizefile1,sizefile2
jne exit            
mov rsi,addfile1
mov r8,4:
mov r8,
mov rdi,addfile2
mov r9,4:
mov r9,
mov rbx,sizefile1-1008
mov rcx,1000
mov rbp,addfile1
///////////////find reloc///////////////////////
////////////////////////////////////////////
//bc
fill store+30,90,100
mov 8:,7EC02B490E048B48
mov 8:,2B490F048B485011
mov 8:,7424043B48067EC1
mov 8:,CB3B48C1FF485839
mov 8:,670D7400FA83DE7E
mov 8:,890000000A55148D
mov 8:,EB00558944EB0455
mov 8:,8D67117400FA833F
mov 8:,55890000000A5514
mov 8:,89D23348EA034804
mov 8:,F00025C18B480045
mov 8:,58DA7500453BFFFF
mov 8:,00000FFF25C18B48
mov 8:,4489480000A0000D
mov 8:,9090A4EBC2FF0855
mov 8:,9090909090909090
bp store+a8
mov rip,store+30
run
pause
pause
mov rax,rsi
not rax
add rax,rbp
inc eax
mov sizereloc,eax
and eax,fffff000
shr eax,c
inc eax
shl eax,c
mov reloc,eax
alloc $reloc
mov rdi,$RESULT
mov addreloc,rdi
mov rcx,sizereloc
fill store+30,90,100
mov rip,store+30
bp store+34
mov 2:,A4F3
run
savedata "reloc.bin",addreloc,reloc
exit:
pause
ret

sunsjw 发表于 2023-2-27 09:41

填充内存可以使用set
比如:
set $store,#C0 33 60 EC 83 48 53 40 45 FF FF FF C1 0D 8D 48 89 48 03 40 8D 44 C9 33 20 24 44 89 44 30 24 44#

610100 发表于 2024-7-19 16:48

relox更新了 小改ReloX,让其支持PE32+,可以处理64位程序重定位表 https://bbs.kanxue.com/thread-281855.htm

xiaoweng 发表于 2022-8-11 14:24

感谢楼主分享!小白学习拿走了

bk20220721 发表于 2022-8-11 14:31

sam喵喵 发表于 2022-8-11 15:16

感谢分享,希望十年之内我能看懂

xiawan 发表于 2022-8-11 15:26


此贴必火,占位刘留名~~~~

rabit331 发表于 2022-8-11 16:54

学习了,真不错。

szranshao 发表于 2022-8-11 18:33

这个厉害了,特定时刻还是汇编好使。

kantal 发表于 2022-8-11 20:03

这个厉害了,特定时刻还是汇编好使。~~!

go2crack 发表于 2022-8-11 20:08

还是出一个RELOX这样的64位工具吧,太多小白不会了。

CHE1027 发表于 2022-8-11 21:55

一天一学
页: [1] 2 3 4 5
查看完整版本: X64重定位表修复---X64DBG脚本分享