IDA-完整解析sig

我们可以通过lib文件来生成sig,但lib文件是有要求的:

1.它肯定是指一个静态库,而不是一个动态库附带生成的lib文件 2.它最好不要使用优化选项(包括关掉全程序优化),不然可能会在生成时被忽略掉部分符号

如果使用了优化选项,一般会出现如下忽略提示:(skipped)

生成pat文件

G:\IDA\win>pcf.exe  -v G:\testvmp\Release\hgylib.lib hgy.pat
Processing file(s): G:\testvmp\Release\hgylib.lib
Processing of module .\Release\IDATest.obj yielded 12d sections
G:\testvmp\Release\hgylib.lib: skipped 0, total 4

详细参看http://blog.csdn.net/hgy413/article/details/50612296

创建SIG

G:\IDA\win>sigmake.exe hgy.pat hgy.sig

SIG格式解码

格式详解

详细可参考:https://www.hex-rays.com/products/ida/tech/flirt/in_depth.shtml

简译了下The idea

例如:

558BEC0EFF7604..........59595DC3558BEC0EFF7604..........59595DC3 _registerbgidriver
558BEC1E078A66048A460E8B5E108B4E0AD1E9D1E980E1C0024E0C8A6E0A8A76 _biosdisk
558BEC1EB41AC55604CD211F5DC3.................................... _setdta
558BEC1EB42FCD210653B41A8B5606CD21B44E8B4E088B5604CD219C5993B41A _findfirst

变量(variant bytes )被显示成"...."

以相同字节序开头的函数们放在一起,例如:

558BEC
      0EFF7604..........59595DC3558BEC0EFF7604..........59595DC3 _registerbgidriver
      1E
        078A66048A460E8B5E108B4E0AD1E9D1E980E1C0024E0C8A6E0A8A76 _biosdisk
      B4
        1AC55604CD211F5DC3                                       _setdta
        2FCD210653B41A8B5606CD21B44E8B4E088B5604CD219C5993B41A   _findfirst

这是一个树形结构,从根开始,每一条分支代表一个函数

采用树形结构的好处是

1.存储字节被减小

2.非常适合使用快速匹配

第一个问题:一部分函数它们拥有相同的前32字节的字节序

558BEC
      56
        1E
          B8....8ED8
                   33C050FF7608FF7606..........83C406
                                                      8BF083FEFF
                    0. _chmod   (20 5F33)
                    1. _access  (18 9A62)

如上,当两个函数有相同的前32字节的字节序,也就是它们被存储在树形结构的相同叶子结点上,为了解决这个问题,我们计算从第33个字节向后一直到遇到第一个变量(variant byte)的CRC16值,CRC和CRC的计算字节数都被存储了,如上,__chmod(从33到52共20个字节,CRC16为5F33),_access(从33到50共18个字节,CRC16为9A62)

第二个问题:一部分函数不但拥有相同的前32字节的字节序,而且它们的CRC16也是相同的

05B8FFFFEB278A4606B4008BD8B8....8EC0
          0. _tolower (03 41CB) (000C:00)
          1. _toupper (03 41CB) (000C:FF)

如上,仅仅3个字节用于计算CRC16,在这种状态下,我们尽力找到这几个函数的不同字节处,如上,这个位置是32+3+000C

第三个问题:一部分函数在非变量字节(non-variant bytes)是完全相同的,仅仅是它们调用的函数可能不同

也就是相同前32位字节序+相同CRC16+没有不同字节(我擦!!)

... (partial tree is shown here)
                0D8A049850E8....83C402880446803C0075EE8BC7:
                  0. _strupr (04 D19F) (REF 0011: _toupper)
                  1. _strlwr (04 D19F) (REF 0011: _tolower)

这个情况下只能通过区分名字了!

这个方式有个缺陷,比如_strupr()和_strlwr()依赖于_toupper()和_tolower()的识别,这意味着需要延迟识别,就是我们需要第二次识别来解决这些延迟,当然,第二次识别只需要针对一部分区域进行

最后,我们可以发现,部分函数,它们有相同的实现,但是却是不同名字,出人意料的是,这种情况频繁发现,尤其在C++的标准库里

我们把函数们属于同一片叶子,而且无法使用描述方法来区化的这种情况称为一个碰撞(_collision_),例如:

558BEC1EB441C55606CD211F720433C0EB0450E8....5DCB................
   0. _remove (00 0000)
   1. _unlink (00 0000)

   or
8BDC36834702FAE9....8BDC36834702F6E9............................
   0. @iostream@$vsn            (00 0000)
   1. @iostream_withassign@$vsn (00 0000)

人工智能是解决这些case的唯一方式,当然我们没有,所以sig文件生成前,一般都要生成exc文件,需要我们手动解决碰撞

实际解析

We decided to compress (using the InfoZip algorithm) the created signature files to decrease the disk space necessary for their storage.

一般解析有两种方式:

1.在6.0以前的版本,可以直接解析,格式是知道的,这里就不贴代码了(TP使用的就是这种)

这也有部分参考资料:https://github.com/JohnDMcMaster/uvudec/wiki/IDA-.sig-file-format

http://www.woodmann.com/forum/showthread.php?8578-GODUP-Godfather-Olly-Debugger-Universal-Plug-i

2.通用方案,可以参考OD插件,它是使用了dumpsig.exe来工作

C:\Users\Administrator>J:\68\dumpsig.exe
IDA signature file dumper by Ilfak Guilfanov. Version 1.22
Usage: J:\68\dumpsig.exe [-f] signature.sig [output-file]
Where
        -f     Flat information (otherwise, tree-structured)
        -X     Extended information (rule bytes, rule funcs, ...)

如:

J:\61>dumpsig.exe -f dm.sig dm.txt

生成的文件如下(部分)

Pattern: 0FB6010FB651010FB64902C1E0080BC2C1E0080BC1C3
	?ToCOLORREF@DMColor@DM@@QBE?BKXZ 

Pattern: 0FB6410C8B5424048902C6410C0133C0C20400
	?TxActivate@DUITextHost@DM@@UAEJPAJ@Z 

Pattern: 0FB64424046A006A005068CF000000E8........F7D81BC0F7D8C20400
	?SetReadOnly@DUIRichEdit@DM@@QAEH_N@Z 

又如:

J:\68>dumpsig.exe -X dm.sig dm.txt

生成的文件如下(部分)

0F:
  B6:
    010FB651010FB64902C1E0080BC2C1E0080BC1C3:
      0. 00 0000 0016 0000:?ToCOLORREF@DMColor@DM@@QBE?BKXZ
    410C8B5424048902C6410C0133C0C20400:
      0. 00 0000 0013 0000:?TxActivate@DUITextHost@DM@@UAEJPAJ@Z
    4424046A006A005068CF000000E8........F7D81BC0F7D8C20400:
      0. 00 0000 001D 0000:?SetReadOnly@DUIRichEdit@DM@@QAEH_N@Z

合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:sm2,sm3,sm4国密算法的纯c语言版本,使用于任何嵌入式平台
下一篇:

留言评论

暂无留言