朱朱你堕落了 发表于 2024-2-28 10:11

求助壳解码问题

我看黑鹰脱壳视频中跳过穿山甲IAT加密时,先修改JMP,等IAT处理完毕后,再恢复原始指令。
看网上的贴子也说,修改JMP的地方参与了程序后面的解码,如果不恢复原始指令,会导致后面
解码错误,从而导致了程序错误而退出。

请问,如何证明它参与了后续代码的解码?谢谢。

视频如下:
https://www.123pan.com/s/YL29-faVOh.html


cndml 发表于 2024-2-28 10:11

本帖最后由 cndml 于 2024-3-5 22:00 编辑

通过跟踪程序的运行可以证明:
1、 按教程里跟踪到这里以后,02395D12 地址下单字节硬件访问断点,
02395CE1                   | 8B0D AC403C02         | mov ecx,dword ptr ds:                        |
02395CE7                   | 89040E                  | mov dword ptr ds:,eax                        |
02395CEA                   | A1 AC403C02             | mov eax,dword ptr ds:                        |
02395CEF                   | 391C06                  | cmp dword ptr ds:,ebx                        |
02395CF2                   | 75 16                   | jne 2395D0A                                             |
02395CF4                   | 8D85 B4FEFFFF         | lea eax,dword ptr ss:                        |
02395CFA                   | 50                      | push eax                                                |
02395CFB                   | FF15 BC623B02         | call dword ptr ds:[<&LoadLibraryA>]                     |
02395D01                   | 8B0D AC403C02         | mov ecx,dword ptr ds:                        |
02395D07                   | 89040E                  | mov dword ptr ds:,eax                        |
02395D0A                   | A1 AC403C02             | mov eax,dword ptr ds:                        |
02395D0F                   | 391C06                  | cmp dword ptr ds:,ebx                        |
02395D12                   | 0F84 2F010000         | je 2395E47                                              |
02395D18                   | 33C9                  | xor ecx,ecx                                             |
02395D1A                   | 8B07                  | mov eax,dword ptr ds:                              |
2、第一次断在这里,执行到返回,会再次断下,发现此处是对代码进行了加密。
023813C2                   | 8B12                  | mov edx,dword ptr ds:                              |
023813C4                   | 8955 E4               | mov dword ptr ss:,edx                           |
023813C7                   | 816D 08 4786C861      | sub dword ptr ss:,61C88647                     |
023813CE                   | 8BF2                  | mov esi,edx                                             |
023813D0                   | 8BFA                  | mov edi,edx                                             |
023813D2                   | C1EE 05               | shr esi,5                                             |
3、执行两次ret后,到达这里:注意看堆栈数据,经过测试,第一个参数是01,表示加密,00是解密。第二个参数是代码长度210h,第三个参数是起始地址,第四个参数是双字密钥。
02395E86                   | A1 28C13B02             | mov eax,dword ptr ds:                        |
02395E8B                   | 8B0D F8003C02         | mov ecx,dword ptr ds:                        |
02395E91                   | 03C8                  | add ecx,eax                                             |
02395E93                   | 51                      | push ecx                                                |
02395E94                   | FF75 DC               | push dword ptr ss:                              |
02395E97                   | E8 10B6FEFF             | call 23814AC                                          |
02395E9C                   | 83C4 10               | add esp,10                                              |
堆栈数据:
00189224         F5651CEC         
00189228         02395C4C         
0018922C         00000210         
00189230         00000001         
00189234         0018EAB4         
00189238         B4BB6FC9         
0018923C         00000000         
4、f9继续运行,再次断在这里,这里位于text1段内,此段程序被多次执行,ret几次后,通过堆栈中的参数,会知道这是对代码进行计算后得到一个双字的密钥,并存储与堆栈中,密钥地址下断点执行。
004E809C                   | 33D2                  | xor edx,edx                                             |
004E809E                   | 8A11                  | mov dl,byte ptr ds:                              |
004E80A0                   | 8B45 08               | mov eax,dword ptr ss:                            |
004E80A3                   | 33C2                  | xor eax,edx                                             |
004E80A5                   | 25 FF000000             | and eax,FF                                              |
004E80AA                   | 8B4D 08               | mov ecx,dword ptr ss:                            |
004E80AD                   | C1E9 08               | shr ecx,8                                             |
5、执行后会断在这里:对比第三步,以及堆栈中的参数,会发现,这次是解密数据,密钥是iat加密那段代码被加密后计算得到的,证明完毕!
023A1A41                   | 53                      | push ebx                                                |
023A1A42                   | 03C8                  | add ecx,eax                                             | eax:&"u=繡*Hv="
023A1A44                   | FF35 2CC33B02         | push dword ptr ds:                           |
023A1A4A                   | 51                      | push ecx                                                |
023A1A4B                   | FF75 E0               | push dword ptr ss:                              |
023A1A4E                   | E8 59FAFDFF             | call 23814AC                                          |
堆栈数据:
00181FFC         5CC68B8C         
00182000         023A1A78         
00182004         0000013E         
00182008         00000000         
0018200C         00000007         

Hmily 发表于 2024-2-28 10:55

不恢复后面就挂了不就是吗。。。。也许是校验了自身代码是否被修改吧,具体不太清楚,我没有跟过。

朱朱你堕落了 发表于 2024-2-28 10:58

Hmily 发表于 2024-2-28 10:55
不恢复后面就挂了不就是吗。。。。也许是校验了自身代码是否被修改吧,具体不太清楚,我没有跟过。

对,不恢复后面就挂了这只是表面肉眼看到的,具体是如何跟出来,具体细节是如何的,所以才需要证明啊。

Hmily 发表于 2024-2-28 11:01

朱朱你堕落了 发表于 2024-2-28 10:58
对,不恢复后面就挂了这只是表面肉眼看到的,具体是如何跟出来,具体细节是如何的,所以才需要证明啊。

你对这个代码下硬件访问,看看哪里计算的呗,别人这么告诉你,肯定是他分析时候遇到了,也没vm,应该不难跟到。
页: [1]
查看完整版本: 求助壳解码问题