[原创][小程序大名堂]--跨进程修改内存
重要的事情说一遍:
●
[*]最近在15pb学习,感悟挺多,总结一下....(逃
-------------------
在时间充裕的情况下还是建议尽量用OD去分析 这能在很大程度上提升自己的逆向功力 我自己深有体会 实在是没办法再用IDA
比如说 “老板叫你在xxxx时间内搞定” 时间紧迫 你为了提升技术 就用OD去逆打死也不用ida 那这也没必要 饭碗要紧。。。
-------------------------------
此程序是要修更为自己的姓名和年龄。

准备工具:pidiy 、 OD 、 ida 、 vs2012
拖入PEID :

查看区段表 发现很乱 猜测是加壳 而且是自己写的

查看PE细节 发现tls函数 要警惕 先去复制回调表 :00416004!

查看输入表 找到了我们的老朋友“SetUnhandledExceptionFilter”异常函数 :

-------------------------------------------
拖入OD ctrl+g -ctrl+v粘贴回调表地址 回车 :

数据窗口 右键-整数-地址 查看TLS回调函数做了些什么(PS: 我分析了 什么也没做 就不进去看了):

我们来整整我们的老朋友的小伙伴“IsDebuggerPresent”(在这里就不做重点讲 已经讲过很多次了 而且有插件)
ctrl+g 查找函数“IsDebuggerPresent ” 通过栈回溯找到地址“004014AA” 修改并保存文件

我们知道这是一个控制台程序 那么它的输出方式肯定是printf相关!我们就
ctrl+g - printf - 回车 栈回溯来到地址“00401372”

我们分析得到:
从地址“0040c000”处开始拷贝1A(25)个字符[edi] edi来自edx edx又为[ebp-32]的地址 即最终通过修改[ebp-32]来加密 [代码红色高亮]
00401372 /$ 55 push ebp 00401373 |. 89E5 mov ebp,esp 00401375 |. 57 push edi 00401376 |. 56 push esi 00401377 |. 53 push ebx 00401378 |. 83EC 3C sub esp,0x3C 0040137B |. 8D55 CE lea edx,dword ptr ss:[ebp-0x32] ; 将[ebp-32]处地址给edx 即EDX=0029FED6 0040137E |. BB 00C04000 mov ebx,task.0040C000 [COLOR="DarkRed"][B]00401383 |. B8 1A000000 mov eax,0x1A 00401388 |. 89D7 mov edi,edx 0040138A |. 89DE mov esi,ebx 0040138C |. 89C1 mov ecx,eax[/B][/COLOR] 0040138E |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi] ; 拷贝字符 将[esi]的内容给[edi] 00401390 |. C74424 08 190>mov dword ptr ss:[esp+0x8],0x19 ; [ESP+0X8]=0X19 00401398 |. C74424 04 D9F>mov dword ptr ss:[esp+0x4],-0x27 ; [ESP+0X4]=0XFFFFFFD9 004013A0 |. 8D45 CE lea eax,dword ptr ss:[ebp-0x32] ; 把[esp-32]的地址给 eax EAX=0029FED6 004013A3 |. 890424 mov dword ptr ss:[esp],eax ; [ESP]=0029FED6 004013A6 |. E8 89FFFFFF call task.00401334 ; 进行加密 004013AB |. 8D45 CE lea eax,dword ptr ss:[ebp-0x32] ; | 004013AE |. 890424 mov dword ptr ss:[esp],eax ; | 004013B1 |. E8 FEA70000 call <jmp.&msvcrt.printf> ; \printf 004013B6 |. 83C4 3C add esp,0x3C 004013B9 |. 5B pop ebx 004013BA |. 5E pop esi 004013BB |. 5F pop edi 004013BC |. 5D pop ebp 004013BD \. C3 retn
我们来到加密函数 首先去分析调用了几个参数 选中“004013A6” 回车分析同时在这里下断点
00401334 /$ 55 push ebp
得到 ebp+10 即3个参数 按“+”回来:

F9运行 来到加密函数(我一开始是不知道加密的 分析完才知道
) 分析之:00401334 /$ 55 push ebp 00401335 |. 89E5 mov ebp,esp 00401337 |. 83EC 14 sub esp,0x14 0040133A |. 8B45 0C mov eax,[arg.2] 0040133D |. 8845 EC mov byte ptr ss:[ebp-0x14],al 00401340 |. C745 FC 00000>mov [local.1],0x0 00401347 |. EB 1A jmp short task.00401363 00401349 |> 8B55 FC /mov edx,[local.1] ; 将[ebp-4]的内容给edx 0040134C |. 8B45 08 |mov eax,[arg.1] ; 将[ebp+8]的内容给eax 即EAX=0029FED6 0040134F |. 01C2 |add edx,eax ; EDX=EDX+EAX 00401351 |. 8B4D FC |mov ecx,[local.1] ; 将[ebp-4]的内容给ecx 00401354 |. 8B45 08 |mov eax,[arg.1] ; 将[ebp+8]的内容给eax 即EAX=0029FED6 不变 00401357 |. 01C8 |add eax,ecx ; EAX=EAX+ECX 此时 eax=edx ECX每次加1 00401359 |. 8A00 |mov al,byte ptr ds:[eax] ; 将EAX地址中的内容第一个字节(OPcode)给al 得到新的EAX 0040135B >|. 3345 EC |xor eax,[local.5] ; eax与[ebp-14](ESP)地址内容异或 即eax第一个字节 与[ESP]内容第一个字节异或 得到 al 0040135E |. 8802 |mov byte ptr ds:[edx],al ; 将AL(即ascii码) 给edx 此时EDX地址处的第一个字节(OPcode)为所得字符 00401360 |. FF45 FC |inc [local.1] ; [EBP-4]指向的内容加1 00401363 |> 8B45 FC mov eax,[local.1] ; [EBP-4]指向的内容给EAX 00401366 3B45 10 cmp eax,dword ptr ss:[ebp+0x10] ; 与[EBP+10]指向的内容相比较 即与0x19相比 00401369 |. 0F9CC0 |setl al ; sf不等于of时 al置为1 0040136C |. 84C0 |test al,al ; 根据结构设置标志位 al不变 0040136E |.^ 75 D9 \jnz short task.00401349 ; 等于0 则结束循环 00401370 |. C9 leave 00401371 \. C3 retn
显示不友好 添加一张图片:

-----
那我们此时得到了每个字符都得与D9进行异或
我们知道:
A异或B=C C异或A=B C异或B=A
这时就很简单了 我们重新f9运行 ctr+g在保存原始数据的 地址“0040c000” 数据窗口跟随

修改“97”(N)为“8A”(S) 试试看 保存重命名为1.exe

成功~!
-----------------------------
我们在用IDA来看看:





--------------------------------------------
知道上面这些 那我们很容易就能修改内存 好 我们写个跨进程修改内存程序
根据“断点异常”原理进行修改 主要代码(其他请下载
):
//修改字符串为:Tennn:Hello Pediy !!!
BYTE bValue[25] = {0x8D, 0xBC, 0xB7, 0xB7, 0xB7, 0xE3,0xF9,
0x91, 0xBC, 0xB5, 0xB5, 0xB6, 0xF9,
0x89, 0xBC, 0xBD, 0xB0, 0xA0, 0xF8,
0xF8, 0xF8, 0xF8, 0xF9, 0xF9, 0xF9,
};
DWORD dwWriteBytes = 0, dwOldProtect ;
DWORD dwTagAddr=0x0040C000; //要修改处地址
// 修改目标地址的保护方式为可读可写
VirtualProtectEx ( g_hProcess, (LPVOID)dwTagAddr, 25, PAGE_READWRITE, &dwOldProtect ) ;
// 修改数据
WriteProcessMemory ( g_hProcess, (LPVOID)dwTagAddr, &bValue, 25 , &dwWriteBytes ) ;
// 还原目标地址的保护方式
VirtualProtectEx ( g_hProcess, (LPVOID)dwTagAddr, 25, dwOldProtect, &dwOldProtect ) ;

PS: 动态修改也很简单的。。。我写死了。
完。
---------------------------
源码及
task.rar
该值.rar
