你的位置:睿鑫网络 >> 编程 >> 编程语言 >> 汇编 >> 详细内容 在线投稿

如何分析未文档化的数据结构

排行榜 收藏 打印 发给朋友 举报 来源: 网络   发布者:未知
热度14票  浏览15次 时间:2009年12月24日 12:14

OG/nGUjmc01 前言:睿鑫网络 k&Ef`$C

睿鑫网络 i(XRP"y{

这2天看了Secrets of Reverse Engineering一书,对分析未文档化的API的技术比较有心得,希望各位看了下面的教程,能抛砖引玉灵活的应用在逆向工程和破解技术上,方法是死的,但是人的思维是活,最重要是灵活应用。睿鑫网络~ BQ$|"P

!}G8en_ D$Q02 实践:

+g C%f4b8RY`0

"`]'| T(\5@2}0用OllyDbg对NTDLL.DLL进行反汇编,前提你要加入NTDLL.DLL的符号表,这样你才能更好的对未文档化的API进行反汇编,你们到微软官方网站获取相应版本Windows系统的系统符号表。睿鑫网络m3oa6G?] } u B(D

睿鑫网络/F8m+hi6H

下面是RtlInitializeGenericTable函数的反汇编代码:

L+lm-{.k0

.h5S'QC v001 MOV EDI, EDI ;睿鑫网络?0x*th}"N9d[N_Z

M%@/J?R G0//压入堆栈,保存EBP的数值睿鑫网络z;vtYL DT3G

睿鑫网络zJx;}~;o

02 PUSH EBP ;              睿鑫网络 } F/HfIb

B&h)I@B003 MOV EBP, ESP ;

5T;f6Q(a b}2ER}t0

^pUV+hZw0// 获取[ESP+8]的数值传入EAX

] _#q3^L!RvlO0 睿鑫网络E Y^vSoVG

// 此处指令我们可以翻译为:

N"v:C)]Dn8w#^ ix@ \5n0

E/aw&qJJ\'m0// MOV EAX, DWORD PTR SS:[ESP+8]

4M{-?G^+`g6c0 睿鑫网络?M"juJ5c z0l)Y^

// 含义: 把当前堆栈顶向下偏移8h处的值赋给EAX,也就是该函数的第1个参数睿鑫网络#Ec@Ehc"Zu9o

e([/\ k] Y)n0// 声明:我喜欢用ESP指针来想象堆栈。但是CPU处理的话,是用EBP来进行偏移处理

$vf sy e`*~0

a9b{"}0c9s%n&v` e004 MOV EAX, DWORD PTR SS:[EBP+8] ;睿鑫网络(hrm1f9R^

睿鑫网络9{*]5i0D*fe

05 XOR EDX, EDX ;

H@x1y:W ],O0

^B.Yl~yi{P0// EAX+4的数值当作指针传入ECX睿鑫网络gK%A0iU4j

睿鑫网络'@S7p@+Mf6G

06 LEA ECX, DWORD PTR DS:[EAX+4] ;睿鑫网络NtS? ne

睿鑫网络$A*Qb3b$?J2k5K3v't

// EDX的数值传入[EAX],说明EAX的值是某个结构的指针睿鑫网络V*z/{u$\G

睿鑫网络BJ w?m

// 假设pUnknowStruct的地址为 EAX的数值睿鑫网络#P|%|*DO T

X'_@3^ jh0// 07的汇编指令对应的C语言: pUnknowStruct->member1 = 0 ;

Pt V'H,P%[0 睿鑫网络 Z9VJM3a

07 MOV DWROD PTR DS:[EAX], EDX ;睿鑫网络KN Rp]Q N+k1l-e#Z

睿鑫网络w%n-JR2k

// 此处指令我们可以翻译为:睿鑫网络k!o ^A {i5[\,P~ J.L

睿鑫网络 D$}K7DE7m)d'c,c_w

// MOV DWORD PTR DS:[EAX+8], EAX+4 ;睿鑫网络-Um'd%_B-R[I

睿鑫网络*gq#N3Iv Xs

// 备注: [EAX] 为某结构的第1个变量

ETK!b~!^0 睿鑫网络;gZ-@ ?rrCkdi#A

// [EAX+4]为某结构的第2个变量睿鑫网络-X.cS9e#Ehf Lk

*ui;O wOm5Wq*b0// [EAX+8]为某结构的第3个变量

+BM+x-N?7C6Q*Vk8[5W0

4cV7U4_&Q eP0// 含义:该结构的第3个成员变量被赋于指向该结构的第2个成员变量的指针数值

&M}@'tc$u%v0

7R0ow9h"S'rJ,Y{zr@0  // 08的汇编指令对应的C语言: pUnknowStruct->member3 = &pUnknowStruct->member2睿鑫网络:pZg4t7s sWi

Q7[+W6r k-[ I'[008 MOV DWORD PTR DS:[ECX+4], ECX ;

] iQ&aJRd0

6diIE-o3Paml0// 此处指令我们可以翻译为:

MwMo@ EN0 睿鑫网络v]r9\8cyR9K7}

// MOV DWORD PTR DS:[EAX+4], EAX+4 ;

!WY&Am|0

.WPf8@.p?pY0// 09的汇编指令对应的C语言: pUnknowStruct->member2 = &pUnknowStruct->member2

M~{!{+p.iU4]f`0 睿鑫网络PF/?(k ~Z7JB

09 MOV DWORD PTR DS:[ECX], ECX ;睿鑫网络X C*g qc[

!?*I'aUB0// 此处指令我们可以翻译为:

%x;p zU1wI X0 睿鑫网络,Z6Ua@)?Wh$Q_ z

// MOV DWORD PTR DS:[EAX+C], EAX+4 ;

O2h^G|9KE5F(O0

gA!YC;^ers VY0// 10的汇编指令对应的C语言: pUnknowStruct->member4 = &pUnknowStruct->member2睿鑫网络 kd8XH9{+m V*M

睿鑫网络3H9_"o5j5tJ*i

10 MOV DWORD PTR DS:[EAX+C], ECX ;睿鑫网络3U4k'mP;e)G9]n!R/H

睿鑫网络Q0p,~)Mof4Y)K.FO

// 此处指令我们可以翻译为:

irdsP4Fk k'~0

Pbw{~Y0// MOV ECX, DWORD PTR SS:[ESP+C]

rT+Ds y0SI:A$x0

.[3A&M,f(L0// 含义: 把当前堆栈顶向下偏移Ch处的值赋给ECX,也就是该函数的第2个参数

v)f)[eR3lJ+}6E0 睿鑫网络,mV%MIz X5K

11 MOV ECX, DWORD PTR SS:[EBP+C] ;睿鑫网络U$VB(O/S~W J#o:@-CG

B"\ET A*Y1pU0// 含义: 把第2个参数传送给某结构的第7个成员变量

Ld\:]"Er)r4^'nDrU0

W jw S(l0// 12的汇编指令对应的C语言为: pUnknowStruct->member7 = Param2睿鑫网络IP0Z(H%s6q df.n

R]4_t4r K'En012 MOV DWORD PTR DS:[EAX+18], ECX ;

J'~ ^3bDh0 睿鑫网络m*l/e5Lq

// 此处指令我们可以翻译为:睿鑫网络5W%n ^4~%`m;AA;Mrb

h;]+Lk:Sl/ct5X0// MOV ECX, DWORD PTR SS:[ESP+10]

q#e MM:U.l*c0 睿鑫网络;tM-Pq!_

// 含义: 把当前堆栈顶向下偏移10h处的值赋给ECX,也就是该函数的第3个参数睿鑫网络;j&g$@;G X,G+D-|:T

x7bO!v K"j!kW013 MOV ECX, DWORD PTR SS:[EBP+10] ;

3g.[2?I*t0

(eg&x'R~-i0// 含义:把参数3传给某结构的第8个成员变量

9C4Oq%j5dOZ0

^:@#J%TS` Ay6e(^'H0// 14的汇编指令对应的C语言为: pUnknowStruct->member8 = Param3

0i4J{'g]rJW0

"k#Y0V7NO/z`#nz014 MOV DWORD PTR DS:[EAX+1C], ECX ;睿鑫网络'PI6YYQZ{

睿鑫网络 `t;] {9y

// 此处指令我们可以翻译为:睿鑫网络^q$a3Bb9M_:a

睿鑫网络D+t6Y+O%[

// MOV ECX, DWORD PTR SS:[ESP+14]睿鑫网络d6{$E3v4S[~0[

*Q:^d_6IC0// 含义: 把当前堆栈顶向下偏移14h处的值赋给ECX,也就是该函数的第4个参数睿鑫网络yZ;ViAF#H

v(A0d)i'DL7c-b _0  15 MOV ECX, DWORD PTR SS:[EBP+14] ;睿鑫网络8ma!MiR EH

睿鑫网络6x*mK I!_*f y

// 含义:把参数3传给某结构的第9个成员变量

Fz0s?] rz{0 睿鑫网络3k z4? s#|q2A*o

// 16的汇编指令对应的C语言为: pUnknowStruct->member9 = Param4

{ D@&Q6M @ G+~3h0

n#m3~%EY]]8f:~S016 MOV DWORD PTR DS:[EAX+20], ECX ;

0}u xpbr6T0 睿鑫网络!D ~ O5Le

// 此处指令我们可以翻译为:

-x2u3N4Qx0 睿鑫网络`/\:lp2]i*_~

// MOV ECX, DWORD PTR SS:[ESP+18]睿鑫网络6gvnm&t _

睿鑫网络{2Y~"|`9h

// 含义: 把当前堆栈顶向下偏移18h处的值赋给ECX,也就是该函数的第5个参数睿鑫网络!`-c3Gu6ZU&I(u.O

3j d6_S8O-Og017 MOV ECX, DWORD PTR SS:[EBP+18] ;睿鑫网络 K v}6S ^

睿鑫网络_^ ?5fk+z{ k

// 含义:把EDX的数值赋给某结构的第6个成员变量睿鑫网络-TA#h;tc(u3TI

~?wnY/e%\uZ0// 18的汇编指令对应的C语言为: pUnknowStruct->member6 = 0睿鑫网络.M'Pyk y

上一篇 下一篇

网络资源