给IDA6.1制作system函数的签名文件

前言

system在LIBC.LIB中, 但是将LIBC.LIB制作为sig文件后, 在IDA打开调用system函数的工程中加载LIBC.sig后, 并不能看到system函数被识别.

IDA不认得LIBC.LIB中的system函数原因, 和工程中system函数的签名不一样.
可以比对pat文件, 看特征码是否和本工程中的system函数相同.

需要自己做一个MASM静态库, 将system函数的反汇编实现抠出来, 贴到静态库工程, 将内部函数改名, 并声明为 proto, 编译成静态库之后, 再做签名, IDA才认得.

工程下载点

makeSigForIDA.zip

工程运行环境说明

\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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值