CHHSun 发表于 2009-9-16 16:17

与易语言同行

此文推荐用于理解易语言(EPL)程序(EPP)的启动过程

首先,EPP可以有附加数据也可以没有,这个我想应该是取决于是不是独立编译这个选项的问题。
然后我们用OD载入一个EPP来看。区段一共5个,其中EPL被编译之后的代码储存于第二个.data区段。
不过听说以前这个区段叫做.ecode的,后来大该是因为EcE的出现而被和谐了,所以我们需要一个定心丸:

代码:
00403861 >55                   push    ebp    <-这个是exe的oep
00403862    8BEC               mov   ebp, esp
00403864    6A FF                push    -1
00403866    68 F0624000          push    004062F0
0040386B    68 D44C4000          push    00404CD4
00403870    64:A1 00000000       mov   eax, dword ptr fs:
00403876    50                   push    eax

...

0040391D    50                   push    eax
0040391E    FF75 9C            push    dword ptr
00403921    56                   push    esi
00403922    56                   push    esi
00403923    FF15 3C604000      call    dword ptr [<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
00403929    50                   push    eax
0040392A    E8 0BD8FFFF          call    0040113A<-WinMain
代码:
0040113A    55                   push    ebp    <-WinMain
0040113B    8BEC               mov   ebp, esp
0040113D    81EC 98020000      sub   esp, 298
00401143    53                   push    ebx

...Keep going, going, going, and going...

00401480    8D85 68FDFFFF      lea   eax, dword ptr
00401486    50                   push    eax
00401487    FF15 04604000      call    dword ptr [<&KERNEL32.LoadLibrar>; kernel32.LoadLibraryA
0040148D    3BC3               cmp   eax, ebx
0040148F    75 09                jnz   short 0040149A
00401491    C745 FC 00714000   mov   dword ptr , 00407100      ; ASCII "Failed to load kernel library!"
00401498    EB 52                jmp   short 004014EC
0040149A    68 F4704000          push    004070F4                         ; ASCII "GetNewSock"
0040149F    50                   push    eax
004014A0    FF15 00604000      call    dword ptr [<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
004014A6    3BC3               cmp   eax, ebx      ;这一段做标记应该很好找的。。

...稍微再下面一点...

004014FA    395D FC            cmp   dword ptr , ebx
004014FD    75 13                jnz   short 00401512
004014FF    8B45 F0            mov   eax, dword ptr
00401502    E8 00000000          call    00401507
00401507    810424 F97A0000      add   dword ptr , 7AF9<-这里加法做完就是EPP的代码基址了
0040150E    FFD0               call    eax      <-听说过有内存载入DLL的代码么?这里就有EPP的定制版。。
这里我们得到的EPP基址为0x409000。然后我们来看这段内存:

代码:
0040900000004A57WJ..<-我是用EPL开发的,所以我要有WJ标记,恩恩...
0040900400000000....
0040900800000000....
0040900C00000000....
0040901000000000....
0040901400000000....
0040901800000000....
0040901C00000000....
0040902000000000....
0040902400000279y..
0040902800000001...
0040902C00000003...
0040903000000000....
0040903400010123#.
0040903800000000....
0040903C00197A26&z.<-EPP的OEP偏移,那实际OEP就是0x197A26+0x409000=0x5a0a26
0040904000000279y..<-const,常量表的offset
00409044000DDFD4赃..<-form,窗体描述的offset
0040904800192B52R+.<-help,EPL_API的填充内存
0040904C00192BBE?.    <-code,代码段中需要填充的数据的描述表,就是把上面的3个表中每一项的地址写入代码中对应的地方。比如:push const1, call 之类的。
0040905000197AA3.<-var,变量描述表
其实这后面还有一行,不过和const表的偏移一样,猜测是reloc表的,但是Exe是不需要reloc的。所以随便了一下?
前面么也照例还有一快空地,这里写着导入的EPP的支持库


代码:
直接OD内存复制了,就不开IDA了。有点乱码,见谅见谅...

00409050                        6B 72 6E 6C 6E 0D 64 30          krnln.d0
0040906039 66 32 33 34 30 38 31 38 35 31 31 64 33 39 369f2340818511d396
0040907066 36 61 61 66 38 34 34 63 37 65 33 32 35 0D 34f6aaf844c7e325.4
004090800D 36 0D CF B5 CD B3 BA CB D0 C4 D6 A7 B3 D6 BF.6.系统核心支持
00409090E2 00 48 74 6D 6C 56 69 65 77 0D 35 30 31 34 44?HtmlView.5014D
004090A038 46 41 36 44 43 41 34 30 62 36 38 46 41 36 328FA6DCA40b68FA62
004090B036 44 38 31 38 33 36 36 36 45 42 0D 31 0D 31 0D6D8183666EB.1.1.
004090C0B3 AC CE C4 B1 BE E4 AF C0 C0 BF F2 D6 A7 B3 D6超文本浏览框支持
004090D0BF E2 00 69 65 78 74 32 0D 41 46 36 41 44 38 30库.iext2.AF6AD80
004090E041 41 34 32 34 34 41 35 39 41 46 42 33 44 38 33AA4244A59AFB3D83
004090F045 43 46 35 31 37 33 43 43 0D 31 0D 32 0D C0 A9ECF5173CC.1.2.扩
00409100D5 B9 BD E7 C3 E6 D6 A7 B3 D6 BF E2 B6 FE 00 69展界面支持库二.i
0040911065 78 74 0D 32 37 62 62 32 30 66 64 64 33 65 31ext.27bb20fdd3e1
0040912034 35 65 34 62 65 65 33 64 62 33 39 64 64 64 3645e4bee3db39ddd6
0040913065 36 34 63 0D 31 0D 36 0D C0 A9 D5 B9 BD E7 C3e64c.1.6.扩展界
00409140E6 D6 A7 B3 D6 BF E2 D2 BB 00 69 6E 74 65 72 6E嬷С挚庖?intern
0040915065 74 0D 37 30 37 63 61 33 37 33 32 32 34 37 34et.707ca37322474
0040916066 36 63 61 38 34 31 66 30 65 32 32 34 66 34 62f6ca841f0e224f4b
0040917036 32 30 0D 31 0D 31 0D BB A5 C1 AA CD F8 D6 A7620.1.1.互联网支
00409180B3 D6 BF E2 00 73 68 65 6C 6C 0D 35 32 46 32 36持库.shell.52F26
0040919030 30 32 33 30 35 39 34 35 34 31 38 37 41 46 380023059454187AF8
004091A032 36 41 33 43 30 37 41 46 32 41 0D 31 0D 30 0D26A3C07AF2A.1.0.
004091B0B2 D9 D7 F7 CF B5 CD B3 BD E7 C3 E6 B9 A6 C4 DC操作系统界面功能
004091C0D6 A7 B3 D6 BF E2 00 65 43 6F 6D 70 72 65 73 73支持库.eCompress
004091D00D 37 42 36 38 37 33 36 45 38 31 38 45 34 31 63.7B68736E818E41c
004091E035 41 32 38 42 30 41 45 34 44 34 33 43 31 32 385A28B0AE4D43C128
004091F043 0D 31 0D 31 0D D1 B9 CB F5 BD E2 D1 B9 D6 A7C.1.1.压缩解压支
00409200B3 D6 BF E2 00 65 41 50 49 0D 46 37 46 43 31 41持库.eAPI.F7FC1A
0040921045 34 35 43 35 43 34 37 35 38 41 46 30 33 45 46E45C5C4758AF03EF
0040922031 39 46 31 38 41 33 39 35 44 0D 31 0D 32 0D D319F18A395D.1.2.
00409230A6 D3 C3 BD D3 BF DA D6 A7 B3 D6 BF E2 00 45 54τ媒涌谥С挚?ET
0040924068 72 65 61 64 0D 35 46 39 39 43 31 36 34 32 41hread.5F99C1642A
0040925032 46 34 65 30 33 38 35 30 37 32 31 42 34 46 352F4e03850721B4F5
0040926044 37 43 33 46 38 0D 31 0D 31 0D B6 E0 CF DF B3D7C3F8.1.1.多线
00409270CC D6 A7 B3 D6 BF E2 00                        讨С挚?.8..
常量表:

代码:
00409279000000388...表的描述部分大小0x38,不包括常量内容的大小
0040927D000DDFD4赃..下一个表的offset-这个表的offset=这个数值
0040928100000001...未知
00409285736E6F63cons我是常量表...
0040928900000074t...
0040928D00000000....
0040929100000000....
0040929500000000....
0040929900000000....
0040929D000DDD23#?.    未知
004092A1000DDD23#?.    未知
004092A5000002B1?..    常量表加法基址,这个标记的意义将在code表中被说明
004092A900000000....常量的数量
004092AD00000000....表描述结束标记
下面就是常量内容了,一般而言是遇到某个数字第二位是0就算是一个常量,不过也有特殊的,比如这个程序的常量里面包含了一个PE文件,大小是0xF400,这个常量就比较奇怪了,他的大小写在了自身本体的之前。所以常量的具体加载判定还是有些模糊。

窗体表就不看了吧,天知道他怎么描述的。。。

help表:

代码:
0059BB52000000388...意义同常量表
0059BB5600192BBE?.    意义同常量表
0059BB5A00000001...
0059BB5E706C6568help意义同常量表
0059BB6200000000....
0059BB6600000000....
0059BB6A00000000....
0059BB6E00000000....
0059BB7200000000....
0059BB76000000344...
0059BB7A000000344...
0059BB7E00192B8A?.    意义同常量表
0059BB8200000000....
0059BB8600000000....
0059BB8A00BD95A9⿻?    krnln.00BD95A9以下就是程序中用到的EPP_API的地址
0059BB8E00BD8DBF繊?    krnln.00BD8DBF
0059BB9200BD8DCA蕧?    krnln.00BD8DCA
0059BB9600BD8E21!幗.   krnln.00BD8E21
0059BB9A00BD95C7菚?    krnln.00BD95C7
0059BB9E00BD95E6鏁?    krnln.00BD95E6
0059BBA200BD9662b柦.   krnln.00BD9662
0059BBA600BD96BF繓?    krnln.00BD96BF
0059BBAA00BD976Aj椊.   krnln.00BD976A
0059BBAE00BD96A2?    krnln.00BD96A2
0059BBB200BD960D.柦.   krnln.00BD960D
0059BBB600BD96377柦.   krnln.00BD9637
0059BBBA00BD8DA5?    krnln.00BD8DA5
code表:

代码:
0059BBBE000007AC?..
0059BBC200197AA3.
0059BBC600000005...
0059BBCA65646F63code
0059BBCE00000000....
0059BBD200000000....
0059BBD600000000....
0059BBDA00000000....
0059BBDE00000000....
0059BBE2000047399G..
0059BBE6000047399G..
0059BBEA0019336Aj3.
0059BBEE000001DD?..
0059BBF200000000....
0059BBF6000006A1?..
0059BBFA000006D2?..
0059BBFE000006F9?..
0059BC0200000811..
0059BC06000009F1?..
0059BC0A00000A59Y...
0059BC0E00001111..
0059BC1200001142B..
0059BC1600001169i..
......
这里来解释常量表加法基址,当然这边就是代码填充表加法基址了。
首先这边一共有0x1DD项,然后第一项的数据为0x6a1,那么
A=0x6a1/8=0xd4,
B=0x6a1 and 7 =1,
所以需要填充的数据的位置为[加法基址+A],填充的数据为第B个表的地址。

什么,你说常量表那么大,怎么区分哪个常量?这个么:
0059C43C    db 0xB2
0059C43D    68 B1924000          push    004092B1
0059C442    FF35 B00C1901      push    dword ptr
0059C448    68 02000000          push    2
0059C44D    B9 03000000          mov   ecx, 3
0059C452    E8 7EFFFFFF          call    0059C3D5
我猜就是这么决定的吧。至于具体的,我又没去逆代码...

最后飞向OEP吧:
00BD8CDE   .E8 AD060300      call    00C09390      ;Proc_MemoryLoadEPP
00BD8CE3   .- FFE0               jmp   eax                            ;OEP of EPP

收工,就知道这么多了,全倒出来了……

y289328931 发表于 2009-9-16 16:56

顶 大牛 无私奉献

王者之剑 发表于 2009-9-23 21:29

看不懂,呵呵
页: [1]
查看完整版本: 与易语言同行