前言
system在LIBC.LIB中, 但是将LIBC.LIB制作为sig文件后, 在IDA打开调用system函数的工程中加载LIBC.sig后, 并不能看到system函数被识别.
IDA不认得LIBC.LIB中的system函数原因, 和工程中system函数的签名不一样.
可以比对pat文件, 看特征码是否和本工程中的system函数相同.
需要自己做一个MASM静态库, 将system函数的反汇编实现抠出来, 贴到静态库工程, 将内部函数改名, 并声明为 proto, 编译成静态库之后, 再做签名, IDA才认得.
工程下载点
工程运行环境说明
\Flair IDA6.1签名需要的可执行文件, 放到<IDA>\
里面的pcf打好了补丁, 退出时, 不会和用户交互.
\MYLIB 做签名用的MASM静态库工程, 编译环境radAsm2.2.1.5
静态库不用 start: 和 end start, 只要有函数的实现就行.
要确保抠代码贴到静态库后, 调用的内部函数__fnFoo用 fnFoo proto 声明, 并将内部函数由__fnFoo改成fnFoo, 表明不是我实现的, 我只是调用已经存在的函数实现
\makeIdaSign 签名用的脚本工程, 执行make_sig.bat, 可以看到pat文件是否正确, 看机器码中的地址是否是统配符号, 如果是绝对地址就错了.
按2个回车, 签名制作完成. 第一个回车, 去看pat文件是否正确.
\CallSystem 测试程序, 只调用了system函数
将做好的.sig放到<IDA>\sig\下, 启动IDA载入目标程序, 加载签名库MYLIB.LIB, 如果函数应用数量 > 0, 就成功了, system函数会被IDA识别为my_system.
MASM静态库工程实现片段
; MYLIB.Asm
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include MYLIB.Inc
.data
dword_40965C dd 0 ; DATA XREF: system+5Br __spawnvpe+27r ...
dword_409668 dd 0 ; DATA XREF: start+52w
; system:loc_40107Br
.const
; char VarName[]
VarName db 'COMSPEC',0 ; DATA XREF: system+7o
aC db '/c',0 ; DATA XREF: system+38o
aCmd_exe db 'cmd.exe',0 ; DATA XREF: system+7Bo
aCommand_com db 'command.com',0 ; DATA XREF: system+72o
.code
; lib project need not add start: and end start
; the internal fun on dasm code, don't chang crt_xx, e.g._getenv
; need decalre getenv proto ! we only need the signature file
getenv proto
access proto
spawnve proto
spawnvpe proto
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
my_system proc C ; CODE XREF: _main+5p
Environment = dword ptr -10h
var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4
arg_0 = dword ptr 8
push ebp
mov ebp, esp
sub esp, 10h
push esi
push offset VarName ; "COMSPEC"
; call crt_getenv
call getenv
pop ecx
xor esi, esi
mov ecx, [ebp+arg_0]
mov [ebp+Environment], eax
cmp ecx, esi
jnz short loc_401046
cmp eax, esi
jnz short loc_401036
xor eax, eax
jmp short loc_4010A3
; ---------------------------------------------------------------------------
loc_401036: ; CODE XREF: system+20j
push esi ; char
push eax ; lpFileName
; call crt__access
call access
neg eax
pop ecx
sbb eax, eax
pop ecx
inc eax
jmp short loc_4010A3
; ---------------------------------------------------------------------------
loc_401046: ; CODE XREF: system+1Cj
cmp eax, esi
mov [ebp+var_C], offset aC ; "/c"
mov [ebp+var_8], ecx
mov [ebp+var_4], esi
jz short loc_40107B
lea ecx, [ebp+Environment]
push esi ; ExitCode
push ecx ; lpEnvironment
push eax ; lpFileName
push esi ; int
; call crt__spawnve
call spawnve
add esp, 10h
cmp eax, 0FFFFFFFFh
jnz short loc_4010A3
mov ecx, dword_40965C
cmp ecx, 2
jz short loc_40107B
cmp ecx, 0Dh
jnz short loc_4010A3
loc_40107B: ; CODE XREF: system+45j system+64j
test byte ptr dword_409668+1, 80h
mov [ebp+Environment], offset aCommand_com ; "command.com"
jnz short loc_401092
mov [ebp+Environment], offset aCmd_exe ; "cmd.exe"
loc_401092: ; CODE XREF: system+79j
lea eax, [ebp+Environment]
push esi ; ExitCode
push eax ; lpEnvironment
push [ebp+Environment] ; lpFileName
push esi ; int
; call crt__spawnvpe
call spawnvpe
add esp, 10h
loc_4010A3: ; CODE XREF: system+24j system+34j ...
pop esi
leave
retn
my_system endp
end