转眼又是快半年没“耕耘”这个blog了……今天来介绍下IdaRub和rublib
IdaRub : http://www.metasploit.com/users/spoonm/idarub/
rublib : http://www.the-interweb.com/serendipity/index.php?/archives/91-RubLib-0.04.html
有了这两个excellent的工具后,写Ida的plugin就简单多了:)
以下是学习 InstructionCounter的ruby版本,enjoy it!
#
!/usr/bin/ruby -w
#
InstructCounter.rb
#
------------------
# Binjo @ 2007-04-07
#-------------------------------------------------------------------------------
$:.unshift('..')

require 'idarub'
require 'rublib'

begin
ida, = IdaRub.auto_client
file = IdaFile.new( ida )
rescue
print "Error : %s" % $!
exit
end

Opcodes = { }
Opcodes['total'] = 0

def loop_instruc( file )
file.each { |func|

puts "---- parsing #{func.name} ----"

func.each { |instruc|
yield instruc.mnemonic
}
}
end

loop_instruc( file ) { |instruc|

if ( Opcodes[instruc] == nil )
Opcodes[instruc] = 1
else
Opcodes[instruc] += 1
end

# total counter
Opcodes['total'] += 1
}

puts "Opcode distribution of file: #{file.path}"

Total = Opcodes['total']
print "Total opcodes : #{Total} "

Opcodes.delete( 'total' )

Opcodes.sort{ |a,b| a[1] <=> b[1] }.each { |key, value|
percents = 100 * value.to_f / Total.to_f
puts "%06d %8.2f%% %s" % [ value, percents, key ]
}
#-------------------------------------------------------------------------------
# EOF
以下是输出
#
ruby InstructCounter.rb
----
parsing _StartRoutine
----
----
parsing start
----
----
parsing sub_104FE
----
----
parsing NewZwEnumerateKey
----
----
parsing NewZwQueryKey
----
----
parsing NewZwCreateKey
----
----
parsing NewZwOpenKey
----
----
parsing LzxHookRegs
----
----
parsing GetModuleBase
----
----
parsing LzxStrCmp
----
----
parsing GetProcAddressFromExport
----
----
parsing sub_1099C
----
----
parsing sub_10A48
----
----
parsing DisableCR0
----
----
parsing EnableCR0
----
----
parsing QuerySystemInfomationEx
----
----
parsing sub_10B5E
----
----
parsing LzxGetPid
----
----
parsing sub_10BC0
----
----
parsing sub_10C06
----
----
parsing GetProcNameOffset
----
----
parsing sub_10CA0
----
----
parsing sub_10CC8
----
----
parsing sub_10D14
----
----
parsing GetLowerLevelDevObj
----
----
parsing sub_10DEA
----
----
parsing sub_10E4E
----
----
parsing sub_10E7C
----
----
parsing sub_10EAA
----
----
parsing sub_10EE0
----
----
parsing sub_10F34
----
----
parsing sub_10F80
----
----
parsing sub_10FD4
----
----
parsing sub_10FEE
----
----
parsing sub_1108A
----
----
parsing sub_110EE
----
----
parsing sub_111AA
----
----
parsing sub_11262
----
----
parsing sub_1127C
----
----
parsing sub_1138A
----
----
parsing sub_11450
----
----
parsing sub_11498
----
----
parsing sub_1150A
----
----
parsing sub_115F8
----
----
parsing sub_11606
----
----
parsing StartRoutine
----
----
parsing sub_116A4
----
----
parsing sub_1173C
----
----
parsing sub_1177E
----
----
parsing sub_117A6
----
----
parsing sub_1195A
----
----
parsing sub_11BB6
----
----
parsing sub_11CDA
----
----
parsing sub_11D82
----
----
parsing sub_11E10
----
----
parsing sub_11F50
----
----
parsing sub_120BC
----
----
parsing sub_1223A
----
----
parsing sub_1230E
----
----
parsing sub_12342
----
----
parsing sub_1236C
----
----
parsing sub_1239A
----
----
parsing sub_123C4
----
----
parsing sub_1248A
----
----
parsing sub_12568
----
----
parsing sub_12702
----
----
parsing sub_12730
----
----
parsing sub_12746
----
----
parsing sub_127EA
----
----
parsing NewZwSaveKey
----
----
parsing sub_1299A
----
----
parsing NewZwDeviceIoControlFile
----
----
parsing sub_12B56
----
----
parsing sub_12C3E
----
----
parsing NotifyRoutine
----
----
parsing sub_12EC8
----
----
parsing DeferredRoutine
----
----
parsing sub_1306C
----
----
parsing sub_130E8
----
----
parsing sub_13186
----
----
parsing sub_131CA
----
----
parsing sub_131E8
----
----
parsing sub_13220
----
----
parsing sub_13258
----
----
parsing sub_1327E
----
----
parsing sub_13294
----
----
parsing sub_132EC
----
----
parsing sub_132FE
----
----
parsing _new_sysenter
----
----
parsing sub_133A6
----
----
parsing HookCode
----
----
parsing sub_134A5
----
----
parsing sub_13538
----
----
parsing sub_1354E
----
----
parsing sub_13610
----
----
parsing sub_138A4
----
----
parsing sub_138D0
----
----
parsing sub_13C44
----
----
parsing sub_13D62
----
----
parsing sub_13E54
----
----
parsing sub_13F12
----
----
parsing sub_13F4A
----
----
parsing sub_13FA6
----
----
parsing NewZwQuerySystemInformation
----
----
parsing LzxHookQuerySysInfo
----
----
parsing sub_140BE
----
----
parsing sub_14244
----
----
parsing sub_14264
----
----
parsing sub_142E2
----
----
parsing sub_14334
----
----
parsing nullsub_1
----
----
parsing nullsub_2
----
----
parsing sub_1437E
----
----
parsing GetRelatedObj
----
----
parsing sub_14486
----
----
parsing sub_14508
----
----
parsing sub_14610
----
----
parsing sub_146C0
----
----
parsing sub_14740
----
----
parsing sub_14758
----
----
parsing sub_1484C
----
----
parsing sub_14A4C
----
----
parsing sub_14B54
----
----
parsing sub_14CD2
----
----
parsing sub_14D1C
----
----
parsing sub_14D92
----
----
parsing sub_14DCE
----
----
parsing sub_14EB2
----
----
parsing sub_15104
----
----
parsing sub_15170
----
----
parsing sub_1528A
----
----
parsing sub_1534F
----
----
parsing sub_155AB
----
----
parsing sub_158E6
----
----
parsing sub_15A48
----
----
parsing sub_15AA2
----
----
parsing sub_15B8E
----
----
parsing sub_15BF8
----
----
parsing sub_15C50
----
----
parsing sub_15C66
----
----
parsing sub_15E12
----
----
parsing sub_160B0
----
----
parsing sub_160EA
----
----
parsing sub_1615E
----
----
parsing sub_16239
----
----
parsing NewZwTerminateProcess
----
----
parsing LzxHookTerminateProcess
----
----
parsing sub_164C2
----
----
parsing sub_1656C
----
----
parsing LzxSomeInit
----
----
parsing PsGetCurrentProcessId
----
----
parsing KeDetachProcess
----
----
parsing KeAttachProcess
----
----
parsing
__try
----
----
parsing sub_16725
----
----
parsing ObOpenObjectByName
----
----
parsing ZwRestoreKey
----
----
parsing PsSetCreateProcessNotifyRoutine
----
----
parsing KeGetCurrentThread
----
----
parsing KeGetPreviousMode
----
----
parsing PsGetVersion
----
----
parsing _except_handler3
----
----
parsing sub_16760
----
----
parsing sub_167E3
----
----
parsing sub_167ED
----
----
parsing sub_167EF
----
Opcode distribution of file: F:src k_thingRK.PE386_BotMailer2dumplzx32_mem
1
.sys
Total opcodes :
8013

000001
0.01
%
neg
000001
0.01
%
cmpxchg
000001
0.01
%
jg
000001
0.01
%
cpuid
000001
0.01
%
sar
000001
0.01
%
jle
000002
0.02
%
lods
000002
0.02
%
cld
000002
0.02
%
imul
000002
0.02
%
sidt
000002
0.02
%
cli
000002
0.02
%
popf
000002
0.02
%
setnl
000002
0.02
%
setnz
000002
0.02
%
sti
000003
0.04
%
pushf
000003
0.04
%
rdmsr
000003
0.04
%
xadd
000004
0.05
%
jge
000005
0.06
%
sbb
000005
0.06
%
popa
000005
0.06
%
setz
000005
0.06
%
pusha
000006
0.07
%
xchg
000007
0.09
%
adc
00000
8
0.10
%
shl
00000
9
0.11
%
movsx
000010
0.12
%
div
000021
0.26
%
ja
000023
0.29
%
or
0000
29
0.36
%
jbe
000031
0.39
%
jnb
000037
0.46
%
dec
000044
0.55
%
shr
000044
0.55
%
movzx
000051
0.64
%
movs
000055
0.69
%
jl
000057
0.71
%
jb
000066
0.82
%
leave
000066
0.82
%
stos
0000
94
1.17
%
inc
0000
99
1.24
%
and
000
119
1.49
%
sub
000
158
1.97
%
retn
000170
2.12
%
jnz
000
185
2.31
%
jmp
000
187
2.33
%
xor
000
198
2.47
%
add
000
199
2.48
%
test
000304
3.79
%
jz
000317
3.96
%
lea
000
348
4.34
%
pop
000441
5.50
%
cmp
000
680
8.49
%
call
00
1786
22.29
%
push
002107
26.29
%
mov
IdaRub : http://www.metasploit.com/users/spoonm/idarub/
rublib : http://www.the-interweb.com/serendipity/index.php?/archives/91-RubLib-0.04.html
有了这两个excellent的工具后,写Ida的plugin就简单多了:)
以下是学习 InstructionCounter的ruby版本,enjoy it!

























































以下是输出



































































































































































































































