|
看到有人问远程调用API源码,随便说了句玩明白了随手就能写,然后就被人..........
其实真的简单啊,常用方法也就是远程创建线程,不过CreateRemoteThread只能带一个参数,有时候需要调用多个参数的函数,所以难点就是用汇编构建一个函数写入目标进程,
再把多个参数写入,远程CALL这个汇编函数,由此函数封装参调用目标函数
源码也没几句,懒得去弄API,就用我原来发过的模块写
|
x86远程CALL | 整数型 | | |
进程ID | 整数型 | | | | 函数指针 | 整数型 | | | | 参数数量 | 整数型 | | | | 参数1 | 整数型 | | | | 参数2 | 整数型 | | | | 参数3 | 整数型 | | | | 参数4 | 整数型 | | | | 参数5 | 整数型 | | | | 参数6 | 整数型 | | | | 参数7 | 整数型 | | | | 参数8 | 整数型 | | | | 参数9 | 整数型 | | | | 参数10 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 远程参数 | 整数型 | | 255 | 临时变量 | 整数型 | | | TMP | 整数型 | | | asmCode | 字节集 | | |
asmCode = { 85, 139, 236, 139, 69, 8, 139, 80, 4, 133, 210, 116, 9, 131, 234, 1, 255, 116, 144, 8, 235, 243, 255, 16, 139, 85, 8, 137, 2, 201, 194, 4, 0 } 远程参数 [1 ] = 函数指针 远程参数 [2 ] = 参数数量 远程参数 [3 ] = 参数1 远程参数 [4 ] = 参数2 远程参数 [5 ] = 参数3 远程参数 [6 ] = 参数4 远程参数 [7 ] = 参数5 远程参数 [8 ] = 参数6 远程参数 [9 ] = 参数7 远程参数 [10 ] = 参数8 远程参数 [11 ] = 参数9 远程参数 [12 ] = 参数10 临时变量 = TR_进程_申请内存 (进程ID, 4096 )TR_内存_写字节集 (进程ID, TR_Hex (临时变量 ), asmCode )asmCode = 指针到字节集 (Pint (远程参数 [1 ]), 取数组成员数 (远程参数 ) × 4 )TR_内存_写字节集 (进程ID, TR_Hex (临时变量 + 256 ), asmCode )TR_进程_创建线程 (进程ID, 临时变量, 临时变量 + 256 )TMP = TR_内存_读整数 (进程ID, TR_Hex (临时变量 + 256 ), 4 )TR_进程_释放内存 (进程ID, 临时变量 )返回 (TMP )
调用方法
以目标进程MessageBoxA为例
以上字程序参数全是整数型,这个函数有两个是文本型(其实就是文本指针,本质还是整数),所以要把文本写入目标进程它才能找到。
变量名 | 类 型 | 静态 | 数组 | 备 注 | 临时 | 整数型 | | | 函数指针 | 整数型 | | | 进程ID | 整数型 | | |
进程ID = 11428 临时 = TR_进程_申请内存 (进程ID, 4096 )TR_内存_写文本 (进程ID, TR_Hex (临时 ), “我是内容”)TR_内存_写文本 (进程ID, TR_Hex (临时 + 256 ), “我是标题”)函数指针 = TR_进程_取函数指针Ex (进程ID, “user32”, “MessageBoxA”)输出调试文本 (x86远程CALL (进程ID, 函数指针, 4, 0, 临时, 临时 + 256, 64 + 4 )) TR_进程_释放内存 (进程ID, 临时 )
这个11428是个delphi写的程序
CALL 它的MessageBoxA 取回返回值
其实就这么简单
|
评分
-
查看全部评分
|