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 <jmp.&procs.GetProcessIDList>
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 <jmp.&procs.GetProcessIDList>
004066A6 |. 85C0 test eax, eax
004066A8 |. 74 26 je short 004066D0
004066AA |. E8 45210100 call <jmp.&procs.GetNumberOfProcesses>
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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)