我在vmware player上安装了Windows NT 4.0 Service Pack 6。然后,我将vmware共享文件夹中的Ollydbg 2添加到Windows NT中。我提取了ollydbg zip并运行ollydbg.exe。我收到此错误:找不到

PSAPI.DLL。该库包含基于NT技术的OS的重要的面向过程和模块的功能。正常调试几乎是不可能的。您要继续吗?

然后我无法调试程序。

我可以在主机Windows 7操作系统上运行相同的exe,而不会出现任何错误。在Windows NT上,我可以运行Ollydbg 1.10。但是,当我尝试在Ollydbg 1.10中调试文件时,出现错误“尝试更改eip或将异常传递给程序”。搜索之后,我发现我应该安装Ollydbg2。

我使用Windows NT的原因:我正在调试一种恶意软件,并且仅在Windows NT上有效。但是如上所述,它给出了错误“尝试更改eip或将异常传递给程序”。

评论

您是否尝试过将异常传递给程序?恶意软件是否按预期退出或继续?

是的,即使在Ollydbg 1.10的情况下,我也试图通过该异常。但是,然后我的EIP指向地址00000000,然后我继续收到相同的错误“尝试更改eip或将异常传递给程序”。 Ollydbg的版本有问题吗?由于我正在使用1.10。我搜索了此错误,并建议使用2.0。但是在2.0的情况下,我得到上面提到的dll错误

您是否尝试过在没有调试器的情况下使用动态分析工具来确保该恶意软件甚至可以在Windows NT 4.0上运行?如果它可以在OllyDbg外部正确运行,但不能在OllyDbg内部正确运行,则很可能是由于恶意软件中的反调试代码,而不是OllyDbg本身的错误。

我认为Bolzano病毒无法在Windows NT版本上运行。我尝试直接执行可执行的恶意软件文件,但遇到访问冲突异常。

#1 楼

我相信您可以在这里找到答案的主要部分:http://www.ollydbg.de/download.htm

相关的位是:



该发行版包含PSAPI.DLL和DBGHELP.DLL文件,它们是Microsoft®可再发行文件。这些文件应仅安装在软件所在的目录中。您只能在Windows NT(R)4.0上使用提供的PSAPI.DLL。您不得与软件分开分发PSAPI.DLL或DBGHELP.DLL。



我希望它能在您当前所在的目录中正确找到PSAPI.DLL。正在执行Olly。验证文件是否存在。如果可以,但仍然无法通过,建议您将其复制到C:\WINNT\SYSTEM,然后再进行一次操作。听起来很老,所以不能这么秘密!它实际上可以使我们为您提供更具体的答案,甚至可以自己尝试解决。

评论


我发现我的Windows NT在解压缩的Ollydbg文件夹或SYSTEM文件夹中都没有psapi.dll。因此,我尝试了将dll从主机窗口7复制到Windows NT ollydbg(尝试一下),然后将其复制到SYSTEM文件夹中,但是仍然无法使用。那么我的Windows NT OS有问题吗?顺便说一句,我正在调试多态恶意软件Bolzano。您可以从oc.gtisc.gatech.edu:8080/search.cgi?search=bolzano获取其示例

–user1744108
13年7月15日在6:51



不。您拥有的Ollydebug存档有问题。 PSAPI.dll应该在zip文件中。我建议您下载一个新副本。

– David Hoelzer
13年7月15日在8:44

Ollydbg版本1带有psapi.dll。但是,版本2没有

– PSS
13年7月15日在12:44



我相信他说他正在使用DLL附带的Olly 1.10。

– David Hoelzer
13年7月15日在12:45

我使用的存档文件中包含PSAPI.dll的Olly 1.10,但如果使用Olly 2,则不是。如Jason所建议,病毒有可能正在使用反调试技术,为什么我会“尝试更改eip或如果是Olly 1.10,则将异常传递给程序”错误。或病毒本身不能在Windows NT上运行。但是我发现了一篇关于病毒spth.virii.lu/29a4/29A-4.505.txt的文章,查看病毒的汇编代码后,我认为它正在Windows NT上运行。我的目标是在解密后获得病毒体(执行实际感染的代码)。

–user1744108
13年7月15日在14:34

#2 楼

我没有NT4 vm
您的链接也指向多个样本
提供准确的MD5/SHA/some verifiable checksum样本可以消除模棱两可的情况,同时回答

这里是使用基本十六进制编辑器的一个小步骤一个基本的反汇编程序,说明为什么可能会生成该异常。

using winxp sp3 vm hxd hexeditor and ollydbg 1.10 in a basic dis-aaseembler mode


下载了openmalware中的第一个样本

MD5:        f40547d521818f7c34754710f8603d5a
SHA1:       f9e3c0e824dda984046b4eedeef06f938805983b
SHA256:     a9beda469c835abbf416ea8da5462170eafdef215b96ac68523045600883855b
OCID:   245478739
Original Filename:  Virus.Win32.Bolzano.5572 


拖放到vpc 2007 xp sp3 vm
/>使用感染的给定密码解压缩

拖放到hxd hexeditor and verified checksums

MD-5:       F40547D521818F7C34754710F8603D5A
SHA-1:      F9E3C0E824DDA984046B4EEDEEF06F938805983B
SHA-256:    A9BEDA469C835ABBF416EA8DA5462170EAFDEF215B96AC68523045600883855B


所有三个校验和都可以确定

WORD MajorSubsystemVersion  
WORD MinorSubsystemVersion  
Contains the minimum subsystem version required to run the executable.   
A typical value for this field is 3.10 (meaning Windows NT 3.1).  


http://msdn.microsoft.com/zh-cn/library/ms809762.aspx

使用ollydbg作为反汇编程序

view -> file -> malware.exe -> right click -> speacial -> pe header


ctrl + g 100

pe标头显示

00000148    0300        DW 0003              ;  MajorSubsystemVersion = 3
0000014A    0A00        DW 000A              ;  MinorSubsystemVersion = A (10.)     

00000200    00100000    DD 00001000          ;  VirtualSize = 1000 (4096.)
00000204    00100000    DD 00001000          ;  VirtualAddress = 1000  <-----
00000208    00020000    DD 00000200          ;  SizeOfRawData = 200 (512.)
0000020C    00060000    DD 00000600          ;  PointerToRawData = 600    

00000228    00200000    DD 00002000          ;  VirtualSize = 2000 (8192.)
0000022C    00200000    DD 00002000          ;  VirtualAddress = 2000
00000230    00200000    DD 00002000          ;  SizeOfRawData = 2000 (8192.)
00000234    00080000    DD 00000800          ;  PointerToRawData = 800 <------

00000128    00100000    DD 00001000          ;  AddressOfEntryPoint = 1000


,所以我们可以从0x600开始拆卸

ctrl+g 600 right click -> disassemble


拆卸

 1. 00000600    60              PUSHAD
 2. 00000601    E9 FA0F0000     JMP     00001600


我们前面看到的部分的虚拟大小为1000
,所以跳转到下一个本节
下一节从0x800开始,如我们先前所见



ctrl+g 800 disassemble


ctrl + g 805反汇编

00000800    E8 D50E0000     CALL    000016DA  (402eda) 400000 +2000 + (16da-800) 


sets the base of kernel32.dll to edi表示字节s Canning puproses
查看从10c00开始的所有100个字节是否为零
如果它们为零,则设置kernel base to 77f00000(win nt k32 base no aslr固定)
否则为bff70000(win 95/98 kernel32 base no固定为aslr)
将esi偏移到某个偏移量

000016DA    E8 00000000     CALL    000016DF  $+5 (402edf) 400000+ 2000+ (16df-800)  
000016DF    5D              POP     EBP  ebp  will be 402edf  
000016E0    81ED DF0E0000   SUB     EBP, 0EDF ebp will be 402000
000016E6    C3              RETN    will return to 805 or 402005


比较k32 dll中的byte pattern

对于95/98此模式

00000805    BF 000C0100     MOV     EDI, 10C00
0000080A    B9 00010000     MOV     ECX, 100
0000080F    33C0            XOR     EAX, EAX
00000811    F3:AE           REPE    SCAS BYTE PTR ES:[EDI]  
scan all bytes from 10c00 to 10d00 for 0  
00000813    75 0C           JNZ     SHORT 00000821          
if all not zero go to win95/98
00000815    BE 2D110000     MOV     ESI, 112D           win nt
0000081A    BF 0000F077     MOV     EDI, 77F00000       k32 base
0000081F    EB 0A           JMP     SHORT 0000082B
00000821    BE 25110000     MOV     ESI, 1125           win 95 / 98
00000826    BF 0000F7BF     MOV     EDI, BFF70000       k32 base


用于win nt此模式

( esi = 1125 or 112d)  ( ebp = 402000)  40312d/25  1925 or 192d (800+1125 or 112d)                               
0000082B    03F5            ADD     ESI, EBP   
(so esi will be either 403125 or 40312d)
0000082D    89BD C8170000   MOV     DWORD PTR SS:[EBP+17C8], EDI 
saves the pointer kernel base guess why ?? 
00000833    BA 00000400     MOV     EDX, 40000
00000838    FC              CLD
00000839    B9 08000000     MOV     ECX, 8
0000083E    56              PUSH    ESI
0000083F    57              PUSH    EDI
00000840    F3:A6           REPE    CMPS BYTE PTR ES:[EDI], BYTE PTR>
00000842    5F              POP     EDI
00000843    5E              POP     ESI 


跳转到正常或不正常

00001925    C2 0400         RETN    4
00001928    57              PUSH    EDI
00001929    6A 22           PUSH    22
0000192B    2BD2            SUB     EDX, EDX


如果发现模式将转到850

其他91b

在91b处有

0000192D    C2 0400         RETN    4
00001930    55              PUSH    EBP
00001931    8B4C24 0C       MOV     ECX, DWORD PTR SS:[ESP+C]


,这将返回到920(请参见上文,回到402005)

00000844    74 0A           JE      SHORT 00000850  `right user with right os jump`
00000846    47              INC     EDI
00000847    4A              DEC     EDX
00000848    0F84 CD000000   JE      0000091B        `wrong user with wrong os jump`
0000084E  ^ EB E9           JMP     SHORT 00000839


这将重新启动到内核或退出线程地址(pushad == 0x20)
其他都是垃圾
exe在204f到224f处不包含任何内容,只需通过retn退出
/>(184f + 800 ecx = 40两个lodsd = 80 dwords = 200字节= 224f)

如果该区域与retn值比较为ok-5(请参见edx,5)应用程序将崩溃,并且ollydbg会发出警告

0000091B    E8 BA0D0000     CALL    000016DA


ollydbg将显示不知道如何执行步骤,因为地址0
的内存不可读,请尝试更改Eip或如果到达此处则将异常传递给程序

在850或402050处反汇编

00000920    8B5424 20       MOV     EDX, DWORD PTR SS:[ESP+20]  
00000924    B9 40000000     MOV     ECX, 40
00000929    83EA 05         SUB     EDX, 5
0000092C    BE 4F180000     MOV     ESI, 184F


16ee处的字节模式

00000931    03F5            ADD     ESI, EBP 
00000933    AD              LODS    DWORD PTR DS:[ESI]
00000934    3BC2            CMP     EAX, EDX
00000936    AD              LODS    DWORD PTR DS:[ESI]
00000937    74 04           JE      SHORT 0000093D
00000939  ^ E2 F8           LOOPD   SHORT 00000933
0000093B    61              POPAD
0000093C    C3              RETN
0000093D    8985 47010000   MOV     DWORD PTR SS:[EBP+147], EAX
00000943    61              POPAD
00000944    EB 00           JMP     SHORT 00000946
00000946    68 00000000     PUSH    0 <---- apllication will crash 
0000094B    C3              RETN    eip not valid or 0


进一步拆卸

00000850    83C7 03         ADD     EDI, 3  add 3 to bytepattern address 
00000853    BE E70E0000     MOV     ESI, 0EE7  
00000858    03F5            ADD     ESI, EBP 402ee7 = 16e7 (ee7 -800 + 1000)
0000085A    8BC6            MOV     EAX, ESI
0000085C    83C0 07         ADD     EAX, 7  16e7+7 = 16ee


尝试向前走:)

评论


如果您修补kernel32基址以适合xp kernel32基址@ EBP + 17C8(即说0x7c800000而不是硬编码77f00000),则可以强制上述示例在xp vm中运行,而无需使用NT(如果您猜想可以将EDI调整为正确的地址并感染XP

– blabb
13年7月16日在9:37



我只是注意到您在评论中提到的文章并没有谈论该病毒,它包含该病毒的完整源代码。如果可能,还可以将问题的标题更改为类似如何在nt vm或类似物中使用ollydbg 1.10调试bolzano病毒的方法

– blabb
13年7月16日在9:44



我认为Bolzano病毒无法在Windows NT版本上运行。我试图直接执行可执行的恶意软件文件,但遇到访问冲突异常。

–user1744108
13年7月19日在6:13

我正在使用Windows NT 4.0的sp 6。我找到了liutilities.com/malware/computer-virus/w32-bolzano文章。这里提到“它还会攻击Windows NT文件系统。但是,如果您具有更高版本的Windows NT,例如带有Service Pack的3.50至4.0,则不必担心此病毒的攻击”。那是因为操作系统,我得到了错误吗?

–user1744108
13年7月19日在14:12



当我调试恶意软件时,我将转至“正确的操作系统,正确的用户跳转”,因为当我将断点设置为00000850 83C7 03 ADD EDI 3时,调试器将进入此步骤。但是然后当程序到00000867 FFD7 CALL NEAR EDI附近并且api被称为“ FindNextFileA”时,我得到了与EIP相关的错误。

–user1744108
13年7月22日在3:43