找回密码
 注册
搜索
热搜: 回贴

LordPE只显示60个进程 fix,LordPE,系统底层

2010-1-22 18:40| 发布者: admin| 查看: 107| 评论: 0|原作者: 江海


LordPE只显示60个进程 fix,LordPE,系统底层
2008年06月23日 星期一 下午 12:58
LordPE只能显示60个进程



LoarPE是用psapi的EnumProcesses来枚举进程的

跟了一下发现是封装在procs.dll里的GetNumBerOfProcesses函数出了问题

代码如下:

20001200 > A1 FC240020 mov eax, dword ptr [200024FC]

20001205 81EC 1C020000 sub esp, 21C //在这里 $21c-$F0=$12c

//增加一下内存 改为支持256个的就是256*4=1024 300=1324即$52C 就是 sub esp, 52C

2000120B 85C0 test eax, eax

2000120D 56 push esi

2000120E 75 7D jnz short 2000128D

20001210 6A 00 push 0

20001212 6A 02 push 2

20001214 FF15 E8240020 call dword ptr [200024E8]

2000121A 8BF0 mov esi, eax

2000121C 83FE FF cmp esi, -1

2000121F 75 0A jnz short 2000122B

20001221 33C0 xor eax, eax

20001223 5E pop esi

20001224 81C4 1C020000 add esp, 21C //这里也要改为 add esp, 52C

2000122A C3 retn

2000122B 8D4424 08 lea eax, dword ptr [esp 8]

2000122F C74424 08 28010>mov dword ptr [esp 8], 128

20001237 50 push eax

20001238 56 push esi

20001239 FF15 DC240020 call dword ptr [200024DC]

2000123F 85C0 test eax, eax

20001241 75 11 jnz short 20001254

20001243 56 push esi

20001244 FF15 08100020 call dword ptr [<&KERNEL32.CloseHandle>] ; kernel32.CloseHandle

2000124A 33C0 xor eax, eax

2000124C 5E pop esi

2000124D 81C4 1C020000 add esp, 21C //这里也要改为 add esp, 52C

20001253 C3 retn

20001254 8D4C24 08 lea ecx, dword ptr [esp 8]

20001258 57 push edi

20001259 51 push ecx

2000125A 56 push esi

2000125B BF 01000000 mov edi, 1

20001260 FF15 E4240020 call dword ptr [200024E4]

20001266 85C0 test eax, eax

20001268 74 11 je short 2000127B

2000126A 8D5424 0C lea edx, dword ptr [esp C]

2000126E 47 inc edi

2000126F 52 push edx

20001270 56 push esi

20001271 FF15 E4240020 call dword ptr [200024E4]

20001277 85C0 test eax, eax

20001279 ^ 75 EF jnz short 2000126A

2000127B 56 push esi

2000127C FF15 08100020 call dword ptr [<&KERNEL32.CloseHandle>] ; kernel32.CloseHandle

20001282 8BC7 mov eax, edi

20001284 5F pop edi

20001285 5E pop esi

20001286 81C4 1C020000 add esp, 21C //这里也要改为 add esp, 52C

2000128C C3 retn

主要问题出在这里,明显是申请的数组太小了见下面的Delphi代码

2000128D 8D4424 04 lea eax, dword ptr [esp 4]

20001291 8D8C24 30010000 lea ecx, dword ptr [esp 130]

20001298 50 push eax //返回的实际大小

20001299 68 F0000000 push 0F0 //数组大小 这里硬性指定了为 240/4=60就是就最大是60了 改为 push 0400 就是256*4=1024了

2000129E 51 push ecx //指针指向存放进程ID的数组

2000129F FF15 EC240020 call dword ptr [200024EC] ; psapi.EnumProcesses



200012A5 85C0 test eax, eax

200012A7 75 08 jnz short 200012B1

200012A9 5E pop esi

200012AA 81C4 1C020000 add esp, 21C //这里也要改为 add esp, 52C

200012B0 C3 retn

200012B1 8B4424 04 mov eax, dword ptr [esp 4]

200012B5 5E pop esi

200012B6 C1E8 02 shr eax, 2

200012B9 81C4 1C020000 add esp, 21C //这里也要改为 add esp, 52C

200012BF C3 retn



对应的Delphi代码应是

var

lProcess : array [0..239] of DWord;

dwSize : DWord;

begin

if not EnumProcesses(@lProcess, SizeOf(lProcess), dwSize) then Exit;

end;





经过上面的修改后有足够存放256个进程的内存空间了

测试一下 :( 程序出错了应还有地方存在这样的问题



在上面的函数返回

来到了exe中的这里

004060B6 |. 8BF8 mov edi, eax

004060B8 |. 85FF test edi, edi

004060BA |. 897C24 10 mov dword ptr [esp 10], edi

004060BE |. 0F84 98020000 je 0040635C

004060C4 |. 68 F0000000 push 0F0 ; 这里也硬性指定为60了 改为push 400 \ z jnkl,9,7km km 6 v

004060C9 |. 68 40EB4100 push 0041EB40 ; 这个地址是存入进程数据的

004060CE |. E8 27270100 call

004060D3 |. 85C0 test eax, eax

004060D5 |. 0F84 81020000 je 0040635C

004060DB |. 55 push ebp

004060DC |. 8B2D C4924100 mov ebp, dword ptr [<&USER32.wsprintfA>] ; USER32.wsprintfA

004060E2 |. 85FF test edi, edi

004060E4 |. 0F86 D2010000 jbe 004062BC

004060EA BF 40EB4100 mov edi, 0041EB40



F8跟了一会原来41EB40这地址空间不足,超过60个进程后覆盖了后面的部分代码

只好另外找地方了 :(

在程序尾部 4189A2的地方有n多的00 计算一下足够存放256个进程的数据,就用那里吧...



再来搜索一下全部的常量41EB40发现还有n处用到了

参考位于 LordPE:.text 到常量 41EB40

地址 反汇编 注释

00404A01 mov edx, dword ptr [esi*4 41EB40]

00404D06 mov ecx, dword ptr [eax*4 41EB40]

00404DC4 mov eax, dword ptr [eax*4 41EB40]

00404EC2 mov edx, dword ptr [eax*4 41EB40]

00404F72 mov eax, dword ptr [eax*4 41EB40]

00404F9E mov eax, dword ptr [eax*4 41EB40]

00405014 mov edx, dword ptr [eax*4 41EB40]

0040592B mov edx, dword ptr [41EB40] ds:[0041EB40]=00000000

00405ADE mov edi, dword ptr [eax*4 41EB40]

004060C9 push 0041EB40 原来是41eb40 改 4189a2

004060EA mov edi, 0041EB40 0041EB40=0041EB40

004062C5 mov eax, dword ptr [ebx*4 41EB40]



这些地方的41EB40都要改为4189A2



这个函数是dump进程时用到的

00406690 81EC 2C050000 sub esp, 52C ; 这里原来也是f0

00406696 |. 8D4424 00 lea eax, dword ptr [esp]

0040669A |. 56 push esi

0040669B 68 00040000 push 400 ; 这里原来也是f0

004066A0 |. 50 push eax

004066A1 |. E8 54210100 call

004066A6 |. 85C0 test eax, eax

004066A8 |. 74 26 je short 004066D0

004066AA |. E8 45210100 call

004066AF |. 85C0 test eax, eax

004066B1 |. 74 1D je short 004066D0

004066B3 |. 33C9 xor ecx, ecx

004066B5 |. 85C0 test eax, eax

004066B7 |. 76 17 jbe short 004066D0

004066B9 8BB424 F80000>mov esi, dword ptr [esp F8] ; 取传进来的PID 改为 [esp 534]

004066C0 |. 8D5424 04 lea edx, dword ptr [esp 4]

004066C4 |> 3932 /cmp dword ptr [edx], esi

004066C6 |. 74 12 |je short 004066DA

004066C8 |. 41 |inc ecx

004066C9 |. 83C2 04 |add edx, 4

004066CC |. 3BC8 |cmp ecx, eax

004066CE |.^ 72 F4 \jb short 004066C4

004066D0 |> 33C0 xor eax, eax

004066D2 |. 5E pop esi

004066D3 81C4 2C050000 add esp, 52C

004066D9 |. C3 retn

004066DA |> B8 01000000 mov eax, 1

004066DF |. 5E pop esi

004066E0 81C4 2C050000 add esp, 52C

004066E6 \. C3 retn



最后还要把LordPE.exe的区段.text改为可写





procs.dll 中这些地方还要修改

GetProcessBaseSize中的

200017DF 8D8D 88FAFFFF lea ecx, dword ptr [ebp-578]

200017E5 51 push ecx

200017E6 68 00040000 push 400 ; 这里也改push f0为push 400

200017EB 8D95 94FAFFFF lea edx, dword ptr [ebp-56C]

200017F1 52 push edx

200017F2 FF15 EC240020 call dword ptr [200024EC] ; psapi.EnumProcesses

200017F8 85C0 test eax, eax



GetProcessPathID中的

20001F54 8D5424 14 lea edx, dword ptr [esp 14]

20001F58 8D8424 4C020000 lea eax, dword ptr [esp 24C]

20001F5F 52 push edx

20001F60 68 F0000000 push 0F0 ; push f0改push 400

20001F65 50 push eax

20001F66 FF15 EC240020 call dword ptr [200024EC] ; psapi.EnumProcesses

20001F6C 85C0 test eax, eax





基本上就行了的



新上传一个版本 写了一个LordPe_Fix.dll 的来进行fix




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 01:42 , Processed in 0.227197 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部