首页
社区
课程
招聘
2行C代码转delphi 感谢
发表于: 2016-2-16 22:36 5041

2行C代码转delphi 感谢

2016-2-16 22:36
5041
if (FastSysCallTable[num] != null){
                   FastSysCallTable[num](args);
} else{
           DefaultSysCall(args);
}
delphi咋完成上边的功能FastSysCallTable

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 8188
活跃值: (2772)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
FastSysCallTable是个数组吧
2016-2-16 22:54
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
delphi咋写
2016-2-16 22:57
0
雪    币: 225
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
FastSysCallTable 是个函数数组
2016-2-17 08:35
0
雪    币: 116
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
function  NewNtQuerySystemInformation(     
          SystemInformationClass : SYSTEM_INFORMATION_CLASS;
          SystemInformation : PVOID;
          SystemInformationLength : ULONG;
          ReturnLength : PULONG) :NTSTATUS; stdcall;
type
   TNewNtQuerySystemInformation= function (
          SystemInformationClass : SYSTEM_INFORMATION_CLASS;
          SystemInformation : PVOID;
          SystemInformationLength : ULONG;
          ReturnLength : PULONG) :NTSTATUS; stdcall;

var
  pSystemProcesses  : PSYSTEM_PROCESSES;
  pSystemProcessesy :  PSYSTEM_PROCESSES;
  //pbi :  TPROCESS_BASIC_INFORMATION ;
  //bytesIO :  ULONG;
  fh  : cardinal;

begin
  Hook[53].UnHook;
    fh:=NtQuerySystemInformation(SystemInformationClass,SystemInformation,SystemInformationLength,ReturnLength);
    if fh=0 then
      begin
        if   SystemInformationClass = SystemProcessesAndThreadsInformation then
          begin
            pSystemProcesses := PSYSTEM_PROCESSES(SystemInformation);
            pSystemProcessesy := nil;
            showmessage((pSystemProcesses.ProcessName.Buffer));
            while  pSystemProcesses.NextEntryDelta<>0 do
              begin
                    // I suppose you are just want to distinguish the processes with the same name of the current process
                    if (pos('XYClient.exe',pSystemProcesses.ProcessName.Buffer)>0) and
                       ( pSystemProcesses.ProcessId <> GetCurrentProcessId()) then
                      begin
                        if pSystemProcessesy<>nil then
                          begin
                            if pSystemProcesses.NextEntryDelta>0 then
                              begin
                                pSystemProcessesy.NextEntryDelta:= pSystemProcessesy.NextEntryDelta + pSystemProcesses.NextEntryDelta;
                              end
                            else
                              pSystemProcessesy.NextEntryDelta:=0;
                          end
                        else
                          begin
                            if pSystemProcesses.NextEntryDelta>0 then
                              begin
                                Inc(PChar(SystemInformation), pSystemProcesses.NextEntryDelta);
                              end
                            else
                              SystemInformation:=nil;
                          end;
                      end
                    else
                      pSystemProcessesy:= pSystemProcesses;
                  //if the process name is not null, forward  pSystemProcesses to
                  // next process, and store the previous process entry address to pSystemProcessesy
                  Inc(PChar(pSystemProcesses), pSystemProcesses.NextEntryDelta);
              end;
          end;
      end;
   Result:= TNewNtQuerySystemInformation(Hook[53].BaseAddr)(SystemInformationClass,SystemInformation,SystemInformationLength,ReturnLength);

   Hook[53].Hook;


给你修改了一下代码,在hook之前的逻辑都正确了,只要你的hook功能正确,就可以实现你想要的功能了。
2016-2-17 18:20
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
瞬间心情都好多了,超级感谢
2016-2-17 19:15
0
雪    币: 116
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
搞定没呢?
2016-2-18 00:46
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我知道咋回事了
2016-2-18 10:22
0
雪    币: 116
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Hook里面最后的pSystemProcesses就是指向最后一个进程的指针了,你再用它给SystemInformation赋值 ,肯定是遍历不到进程的
2016-2-18 11:02
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我知道咋回事了
2016-2-18 12:44
0
雪    币: 116
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你对指针的概念还没理解透。

像这种情况,它是不再需要重新赋值了。所有过滤过程其实操作的都是SystemProcessesInfo所指向的内存空间。 这个函数的算法主要是修改NextEntryDelta的值把同名其他进程屏蔽了而已,实际上这些进程的信息还是连带着返回了去的,只不过在用户层面没有办法准确的拿到这些信息罢了
2016-2-18 13:34
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我知道咋回事了
2016-2-19 10:01
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我知道咋回事了
2016-2-19 10:08
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我知道咋回事了
2016-2-19 11:54
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
代码没问题,好了,哈哈,感谢感谢
2016-2-19 12:18
0
雪    币: 116
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
解决了就好,希望我之前的代码和解释帮到你了。 有问题欢迎咨询我哦
2016-2-19 13:03
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
75253520    60              pushad
75253521    9C              pushfd
75253522    833C85 60795500>cmp dword ptr ds:[eax*4+0x557960],0x0
7525352A    74 0C           je short wow64cpu.75253538
7525352C    9D              popfd
7525352D    61              popad
7525352E    83C4 04         add esp,0x4
75253531    FF2485 60795500 jmp dword ptr ds:[eax*4+0x557960]
75253538    9D              popfd
75253539    61              popad
7525353A  ^ FF25 2C795500   jmp dword ptr ds:[0x55792C]       ; //75252329

这是HOOK Zw函数的
比如hook NtDeviceIoControlFile
1FE7960是起始地址 NtDeviceIoControlFile索引号是4,那么4*4+0x1FE7960,这个地址存放的是hook自己构建的函数地址
上边这段用代码怎么写,指点我一下,感谢感谢
2016-2-20 11:45
0
雪    币: 116
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
兄弟,4*4+0x1FE7960,即0x1fe7970就是NtDeviceIoControlFile的起始地址了,这个地址里面存放的就是这个函数内存的业务逻辑了,而不是你所说的函数地址了。所以你要hook NtDeviceIoControlFile这个函数的话,应该在调用这个函数的地方那里,把这个函数的地址替换成你自己的函数地址就行了。比如则才你贴出来的代码应该就是根本索引 号得到函数地址的。暂且把这个函数的名字叫做: GetFunctionAddr(index: Integer);
那么你实际应该做的事儿是:在这个函数返回之后,把它的返回值 保存起来,同时,把自己的函数地址返回给调用者就OK 了。不知道我说明白了没有?

比如你现在的程序可能是这样写的:

  funAddr := GetFunctionAddr(4);
  funAddr();//调用NtdeviceIoControlFile

现在要把这个程序写成:
  funAddr := myHookFunc;//你自己的hook函数的地址
  funAddr();//调用你自己的Hook函数
2016-2-20 14:50
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢哥们。

BaseAddr:=Pointer(GetProcAddress(DllModule,PChar('ZwDeviceIoControlFile')));
返回的地址里的值是
ZwDeviceIoControlFile函数头的值77A4F90C
77A4F90C >    B8 04000000   mov eax,0x4
77A4F911  |.  B9 1B000000   mov ecx,0x1B
77A4F916  |.  8D5424 04     lea edx,dword ptr ss:[esp+0x4]
77A4F91A  |.  64:FF15 C0000>call dword ptr fs:[0xC0]
77A4F921  |.  83C4 04       add esp,0x4
77A4F924  \.  C2 2800       retn 0x28
这个我知道。

我要在 call dword ptr fs:[0xC0]指向的地址里HOOK
他指向
74402320    EA 1E274074 330>jmp far 0033:7440271E
改下JMP到下边这个自己内联汇编的地址
75253520    60              pushad
75253521    9C              pushfd
75253522    833C85 60795500>cmp dword ptr ds:[eax*4+0x557960],0x0
7525352A    74 0C           je short wow64cpu.75253538
7525352C    9D              popfd
7525352D    61              popad
7525352E    83C4 04         add esp,0x4
75253531    FF2485 60795500 jmp dword ptr ds:[eax*4+0x557960]
75253538    9D              popfd
75253539    61              popad
7525353A  ^ FF25 2C795500   jmp dword ptr ds:[0x55792C]       ; //75252329

这句cmp dword ptr ds:[eax*4+0x557960],0x0这个是按照函数索引号过滤一下,
比如eax=4,那么557970这个地址里不为0并且有我自己构建好的函数地址,就去执行.
比如eax=8,那么557980地址值为0,就直接jmp far 0033:7440271E原路返回
(因为我只HOOK索引号4的函数,没有HOOK索引号8的函数)

我想知道ds:[eax*4+0x557960]过滤逻辑是怎么弄的。这个地址557960是在注入的DLL空间里的。
怎样把自己的函数地址保存在ds:[eax*4+0x557960]这个地址里并且比对eax过滤
2016-2-20 18:06
0
游客
登录 | 注册 方可回帖
返回
//