朱朱同学注册时间也不短了,怎么还像个新手呢,你这个问题提的没多大意义。关于importrec反查输入表函数,软件是不太完善的,一个最大的问题是,它只支持微软标准的输入表格式,如果iat地址,不同dll之间结束标志超过2个,也就是两组以上的0,它就认为iat表结束了,微软也是这么规定,具体可以查一下isdn。所以对于iat的正确长度,要靠人眼观察来确定。函数显示无效,只要模块不显示无效可以无视它的分析。一个常见的无效是在64位系统下,如果引用了user32的DefWindowProcA,它反查的函数是NtdllDefWindowProc_A,这时会导致user32模块找不到,也不能写入输入表。这种情况只要保存树文件,然后收工编辑修改一下模块名跟函数名,然后载入树文件,转储就可以了!而用scylla就不存在这个问题,scylla的不足是不支持指定地址写入输入表,并且还很贴心的自动把文件大小给优化了!我的做法是自己写个脚本,用scylla把输入表写入最后一个区段后,然后用脚本把输入表搬家到原输入表的位置!下面是我自己写的64位的搬家脚本,32位自己修改!
[Asm] 纯文本查看 复制代码 //导入表搬家
var ori_idata
var new_idata
var new_dll
var new_dll_end
mov ori_idata,18002e000
mov new_idata,180025560
mov new_dll,1800257d0
mov new_dll_end,1800257f0
xor rdx,rdx
mov edx,new_idata
sub edx,ori_idata
///////////////////////
//修改原始输入表
///////////////////////
mov rdi,new_idata
first:
mov rax,8:[rdi]
and rax,ff000000ffffffff
cmp rax,0
je loop1
cmp rax,0ffffffff
jg loop1
add eax,edx
mov 4:[rdi],eax
loop1:
add rdi,8
cmp rdi,new_dll
jl first
///////////////////
//修改dll名称
//////////////////
mov rdi,new_dll
second:
mov eax,4:[rdi]
cmp eax,0
je loop2
add eax,edx
mov 4:[rdi],eax
////////
mov eax,4:[rdi+0c]
cmp eax,0
je loop2
add eax,edx
mov 4:[rdi+0c],eax
loop2:
add rdi,014
cmp rdi,new_dll_end
jl second
/////////////////
exit |