这个是学校上网的一个程序。
主程序是connect.exe。
运行该程序之后会在程序所在目录生成:
User.conf 用以保存用户名和密码,及连接的IP
UserLog.txt 用以保存登陆日志
info.conf 暂时未发现用法。
然后输入密码和账户之后点击连接按钮之后会在文件目录生成(准确地说是从网络上下载下来)change.dll文件。
用c32asm查看之后dll里保存了关于使用代理或者是多块网卡等出错的信息。
其中的关键代码如下:
::1000597C:: 75 0F JNZ SHORT 1000598D \:JMPDOWN
::1000597E:: B8 20000000 MOV EAX,20
::10005983:: 68 3C9C0010 PUSH 10009C3C \->: 监测到ARP异常!
::10005988:: E9 8C000000 JMP 10005A19 \:JMPDOWN
::1000598D:: 83F8 04 CMP EAX,4 \:BYJMP JmpBy:1000597C,
::10005990:: 75 0F JNZ SHORT 100059A1 \:JMPDOWN
::10005992:: B8 21000000 MOV EAX,21
::10005997:: 68 2C9C0010 PUSH 10009C2C \->: 监测到端口异常!
::1000599C:: E9 78000000 JMP 10005A19 \:JMPDOWN
::100059A1:: 85C0 TEST EAX,EAX \:BYJMP JmpBy:10005990,
::100059A3:: 0F85 8A000000 JNZ 10005A33 \:JMPDOWN
::100059A9:: 3905 3C050110 CMP [1001053C],EAX
::100059AF:: 8B35 28900010 MOV ESI,[10009028]
::100059B5:: 75 29 JNZ SHORT 100059E0 \:JMPDOWN
::100059B7:: 50 PUSH EAX
::100059B8:: 6A 04 PUSH 4
::100059BA:: 50 PUSH EAX
::100059BB:: 50 PUSH EAX
::100059BC:: A1 44050110 MOV EAX,[10010544]
::100059C1:: 50 PUSH EAX
::100059C2:: 68 50360010 PUSH 10003650 \->: jh0?
::100059C7:: E8
C4160000 CALL 10007090 \:JMPDOWN >>>: MFC80.DLL:MFC80:NoName0029
::100059CC:: A3 3C050110 MOV [1001053C],EAX
::100059D1:: 8B48 2C MOV ECX,[EAX+2C]
::100059D4:: 51 PUSH ECX
::100059D5:: FFD6 CALL ESI
::100059D7:: 833D 14050110 00 CMP DWORD PTR [10010514],0
::100059DE:: 75 53 JNZ SHORT 10005A33 \:JMPDOWN
::100059E0:: 833D 40050110 00 CMP DWORD PTR [10010540],0 \:BYJMP JmpBy:100059B5,
::100059E7:: 75 4A JNZ SHORT 10005A33 \:JMPDOWN
::100059E9:: 8B15 44050110 MOV EDX,[10010544]
::100059EF:: 6A 00 PUSH 0
::100059F1:: 6A 04 PUSH 4
::100059F3:: 6A 00 PUSH 0
::100059F5:: 6A 00 PUSH 0
::100059F7:: 52 PUSH EDX
::100059F8:: 68 00470010 PUSH 10004700 \->: 冹\x08UVh\x0C?
::100059FD::
E8 8E160000 CALL 10007090 \:JMPDOWN >>>: MFC80.DLL:MFC80:NoName0029
::10005A02:: A3 40050110 MOV [10010540],EAX
::10005A07:: 8B40 2C MOV EAX,[EAX+2C]
::10005A0A:: 50 PUSH EAX
::10005A0B:: FFD6 CALL ESI
::10005A0D:: EB 24 JMP SHORT 10005A33 \:JMPDOWN
::10005A0F:: B8 1F000000 MOV EAX,1F \:BYJMP JmpBy:1000596A,10005973,
::10005A14:: 68 1C9C0010 PUSH 10009C1C \->: 监测到使用代理!
::10005A19:: 6A 64 PUSH 64 \:BYJMP JmpBy:10005988,1000599C,
::10005A1B:: 68 3AC90010 PUSH 1000C93A
::10005A20:: A3 40040110 MOV [10010440],EAX
::10005A25:: A3 08C90010 MOV [1000C908],EAX
::10005A2A:: FF15 40920010 CALL [10009240] >>>: MSVCR80.DLL:strcpy_s
::10005A30:: 83C4 0C ADD ESP,C
::10005A33:: 8B8424 C8000000 MOV EAX,[ESP+C8] \:BYJMP
::10005A3A:: B9 2C000000 MOV ECX,2C
::10005A3F:: 8BF8 MOV EDI,EAX
::10005A41:: BE 00C90010 MOV ESI,1000C900 >>>: EXPORT:?
F_ReturnData@@3UReturnData@@A
::10005A46:: F3 REP MOVS DWORD PTR ES:[EDI],DWORD PTR [ESI]
::10005A47:: A5 MOVS DWORD PTR ES:[EDI],DWORD PTR [ESI]
::10005A48:: 8B8C24 C0000000 MOV ECX,[ESP+C0]
::10005A4F:: 5F POP EDI
::10005A50:: 5E POP ESI
::10005A51:: 5D POP EBP
::10005A52:: 5B POP EBX
::10005A53:: 33CC XOR ECX,ESP
::10005A55:: E8 55190000 CALL 100073AF \:JMPDOWN
::10005A5A:: 81C4 B4000000 ADD ESP,B4
::10005A60:: C3 RETN
其中出错之后处理的代码是:
JMP 10005A19
所以我的想法是:修改10005A19 处的代码,改成JMP 10005A60使其直接跳转到10005A60处的RETN。
现在第一个问题是:
这样的方法可以实现么?可行否??
然后修改后进入调试,又出现第二个问题。
程序在点击连接之后,会自动与网络连接查找网络上的change.dll文件,校验两者是否相同,不同则重新下载。
这样的话即使修改了change.dll文件还是会在连接的时候又被替换回来,那就相当于没有修改。
那我的思路就是从connect.exe 里查找到比对的代码,不过可惜的是对汇编的代码不熟悉,所以没成功。
那我换一个思路,从CreateFileA这个api上入手。
在Ollydbg中输入bp CreateFileA之后一路F9找到出现change.dll的时候,结果是已经跳到了kernel32的模块里。
这个要怎么找到调用的代码呢?
请大大们帮个忙指点一二,谢谢了。
具体该怎么操作,要修改的是哪部分的代码,麻烦说明一下。
附件里的东西是connect.exe和change.dll的文件。
PS:暂时还没有看到connect.exe是否是会联网之后自动更新替换。
http://rapidshare.de/files/46134978/MIXCLIENT.rar.html
http://www.box.net/shared/y8ami8o5re
[课程]Linux pwn 探索篇!