求助壳解码问题
我看黑鹰脱壳视频中跳过穿山甲IAT加密时,先修改JMP,等IAT处理完毕后,再恢复原始指令。看网上的贴子也说,修改JMP的地方参与了程序后面的解码,如果不恢复原始指令,会导致后面
解码错误,从而导致了程序错误而退出。
请问,如何证明它参与了后续代码的解码?谢谢。
视频如下:
https://www.123pan.com/s/YL29-faVOh.html
本帖最后由 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
对,不恢复后面就挂了这只是表面肉眼看到的,具体是如何跟出来,具体细节是如何的,所以才需要证明啊。
你对这个代码下硬件访问,看看哪里计算的呗,别人这么告诉你,肯定是他分析时候遇到了,也没vm,应该不难跟到。
页:
[1]